工作中总结

来源:互联网 发布:博客优化站 编辑:程序博客网 时间:2024/05/19 00:14

界面响应的问题:(转)

1  昨天一直在调一段代码,流程是这样的:我在某个界面程序里先放置了一个对话框A,用户选择是或否。选择是后,会再弹出一个对话框B,并触发一个事件,然后再启动一个对话框C。这些对话框是模态的。

        逻辑感觉很对,没有问题。但是界面的异常让我是头疼。A对话框选择是后,B对话框显示不完全,在C对户框显示的时候,文字显示又有异常。检查了一下,原来EndDialog没有执行成功。使用GetLastError获取的错误值也是正确的。
  
        惆怅了……,后来利用线程,去执行那个事件,界面也正常了。

       这是为什么呢?
         我个人觉得是事件的执行影响到了界面的刷新,因为我的事件是在界面的程序里面执行的。它对界面消息进行了阻塞,导致界面不能刷新。
          这个问题,不是我第一次遇到,以前也遇到过这样的问题,没有总结。总结一下,不要再犯了。
2 在界面线程中使用像sendARP或者recv等网络API时会发生界面卡死界面,那么最好的方法就是开一线程把这些需要等待的API放进去。

3 控制线程的结束:

在界面线程中,是不能存在拥有阻塞情况的API的像SendARP等,否则会影响界面的刷新,最好是把阻塞代码放到新的线程中。但是,有很多情况中是要控制该类线程的结束的。那么一般情况是通过检测一个flag来退出线程。那么在该线程中我们一般是这么做:

// 主线程中这么干:

whie (TRUE)

{

            DWORD dwRet = WaitForSingleObject(hThread, 100/*等待时间*/)

            if (dwRet == WAIT_TIMEOUT)

            {

                      if (stopFlag)   // 短时间内检测一次是否要退出线程

                              break;

             }

             else // 正常结束

            {

                 ......

                CloseHandle(hThread);

            }

}

// 新线程中这样:

DWORD WINAPI threadProc(LPVOID lp)

{

         ..... // 阻塞的代码

}

原创粉丝点击