zoukankan      html  css  js  c++  java
  • WinCE7.0_FindWindow函数在线程中调用卡死的现象

    遇到一个问题,开发的程序莫名其妙的卡死了!

    这个程序是运行在一个大环境中,我的程序并未更新。但从现象上来看,确实是我的程序在接收到UI 通过SendMessage 发来的消息后,在处理中引起卡死的现象。将我的这个程序,放在之前的版本中,就不会出现卡死的问题。

    虽然开始怀疑不是自己程序的问题,但还是先从自己的程序入手,希望能找到卡死的原因。最后确定的原因让我吃惊,竟然是FindWindow 函数调用后没有返回,引起卡死的现象出现。

    因为在多处增加LOG 输出后,发现有:

    start call FindWindow.

    输出,但无:

    end of call FindWindow. 输出!

    查看此处代码,发现自己以前竟然遇到过类似的问题。但是由于另外一句FindWindow 是测试用的,所以当时只是简单的将它注释了,然后写上了注释掉它的原因。如下面的代码所示:

    1 RETAILMSG(1,(L"start call FindWindow.
    "));  
    2 // hAgent =::FindWindow(NULL,L"TestAppWinName");                  //此句放在线程中引起线程卡死  
    3 hClient =::FindWindow(NULL,L"Test2AppWinName");  
    4 RETAILMSG(1,(L"end of callFindWindow.
    "));  

    现在的卡死问题的原因下面这句:hClient = ::FindWindow(NULL,L"Test2AppWinName"); 引起的。

    通过远程工具:Remote Spy 查看出错前与出错后的进程信息,对比发现被查找的窗体的窗体名从:Test2AppWinName 变为空了。

    但通过远程工具:Remote Process Viewer 查看进程时,被查找的窗体名是正确的,还是:Test2AppWinName。

    在出错后,另写一个简单的程序,通过FindWindow 查找上面的窗体时,可以正确查找到。

    以下通过远程工具截取的进程与窗体名等相关信息的图片:

    1)正确的情况下:

    2)错误的情况下:

    两幅图最大的区别就在于“Window Property”中的“Window”的内容。

    其实,问题的原因还没有找到,还需要继续。

    后续的分析如下:

    /*
     * 对于同一句FindWindow(NULL,L"TestFindWindow");
     * 在按键响应中执行,耗时约为: 5ms
     * 在线程中执行,由于按键响应中有 Sleep 存在,耗时约为: 10020ms
     * Win32 框架下执行的结果与 MFC 相同
     *
     * 按键按下响应后的执行 LOG 如下:
     starttest FindWindow: CSmartDeviceMFCDlg::OnBnClickedButton2
     end of test FindWindow:CSmartDeviceMFCDlg::OnBnClickedButton2,tick: 5
     start test FindWindow:TestFindWindowThreadProc
     Sleep 0
     Sleep 1
     Sleep 2
     Sleep 3
     Sleep 4
     Sleep 5
     Sleep 6
     Sleep 7
     Sleep 8
     Sleep 9
     end of test FindWindow:TestFindWindowThreadProc(10020)
     线程'TestFindWindowThreadProc' (0x45e0336) 已退出,返回值为 0 (0x0)。
    */
     1 DWORDWINAPI TestFindWindowThreadProc(void * pParam) // 查找Window句柄线程  
     2 {  
     3     DWORD dwTick = GetTickCount();  
     4     printf("
    start test FindWindow:%s
    ",__FUNCTION__);  
     5     // 在线程中调用FindWindow,但实际的执行动作以SendMessage 方式发送到窗口进程来执行(如果主窗体阻塞???)  
     6     // 从此测试代码发现,Button 按键响应中的Sleep 阻塞了 FindWindow 的执行; 直接Sleep 结束才执行了 FindWindow 操作  
     7     FindWindow(NULL,L"TestFindWindow");  
     8     printf("
    end of test FindWindow:%s(%d)
    ",__FUNCTION__,GetTickCount() - dwTick);  
     9    
    10     return 0;  
    11 }  
    12    
    13 voidCSmartDeviceMFCDlg::OnBnClickedButton2()  
    14 {  
    15     // TODO: 在此添加控件通知处理程序代码  
    16     DWORD dwTick = GetTickCount();  
    17     printf("
    start test FindWindow:%s
    ",__FUNCTION__);  
    18     FindWindow(NULL,L"TestFindWindow");  
    19     printf("
    end of test FindWindow:%s,tick: %d
    ",__FUNCTION__,GetTickCount() - dwTick);  
    20     CloseHandle(CreateThread(NULL,0,TestFindWindowThreadProc,NULL,0,0));  
    21    
    22     for(int i = 0;i < 10;i++)  
    23     {  
    24            Sleep(1000);  
    25            printf("Sleep %d
    ",i);  
    26     }  
    27 }  
  • 相关阅读:
    Basic knowledge of html (keep for myself)
    科学技术法转成BigDemcial
    SimpleDateFormat
    log4j 配置实例
    R 实例1
    yield curve
    if-else的优化举例
    十二、高级事件处理
    十一、Swing
    十、输入/输出
  • 原文地址:https://www.cnblogs.com/91program/p/5200599.html
Copyright © 2011-2022 走看看