worker线程操作界面引起的死锁
2010-05-26 01:18
453 查看
一般来说涉及界面操作的工作都有UI线程完成,但是在多线程程序中worker子线程进行简单的界面操作也是常见的事情!worker线程和主线程(UI线程)同时更新界面时容易造成消息循环阻塞,引起死锁!引起消息循环阻塞的原因是worker线程没有自己的消息循环,其和主线程公用同一线程!引起死锁的原因是当子线程更新界面时需要发送消息向主线程消息队列,如果主线程没有wait或者sleep等该消息可以正常处理,但是如果主线程自身刚好也在更新相同的界面,这时子线程会等待主线程处理完更新界面消息才能得到响应!而主线程也会发现有线程正在更新这个界面,需要等待该线程处理完才继续自己的处理!哦,相互等待出现!
在多线程中,为了保持较好的交互性,一般遵循:
1、在主线程中最好不要用waitforsingleobject、waitformultipleobjects等阻塞消息循环的函数,否则界面会出现无响应现象!
2、一般情况下worker线程只处理后台工作,不要涉及界面操作(界面操作涉及太多的消息),否则主、子线程容易相互锁死!
3、对于子线程操作界面较多的情况,可以创建UI线程,建立自己消息循环!
工作中遇到了这种情况:worker子线程和主线程会更新相同的界面,子线程更新的同时主线程更新开始!为了正确更新和防止死锁,主线程必须在等待子线程更新完后进行自己的更新,同时保持继续响应后继消息!常用方法是采取Relay措施,延迟处理主线程更新,继续其他消息的处理!
Relay处理函数如下:
在多线程中,为了保持较好的交互性,一般遵循:
1、在主线程中最好不要用waitforsingleobject、waitformultipleobjects等阻塞消息循环的函数,否则界面会出现无响应现象!
2、一般情况下worker线程只处理后台工作,不要涉及界面操作(界面操作涉及太多的消息),否则主、子线程容易相互锁死!
3、对于子线程操作界面较多的情况,可以创建UI线程,建立自己消息循环!
工作中遇到了这种情况:worker子线程和主线程会更新相同的界面,子线程更新的同时主线程更新开始!为了正确更新和防止死锁,主线程必须在等待子线程更新完后进行自己的更新,同时保持继续响应后继消息!常用方法是采取Relay措施,延迟处理主线程更新,继续其他消息的处理!
Relay处理函数如下:
]void Delay(DWORD dwTime,HANDLE hEvent) { DWORD dwStart = GetTickCount(); if (hEvent != NULL) { while(WaitForSingleObject(hEvent,0) == WAIT_TIMEOUT) { MSG msg; //响应其它消息的处理 while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } if(GetTickCount() - dwStart > dwTime) return; ::Sleep(1); } } else { while(TRUE) { MSG msg; //响应其它消息的处理 while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } if(GetTickCount() - dwStart > dwTime) return; ::Sleep(1); } } }
相关文章推荐
- 工作线程操作主界面控件引起死锁及解决
- 工作线程操作主界面控件引起死锁及解决
- 工作线程操作主界面控件引起死锁及解决
- 尝试解决在构造函数中同步调用Dns.GetHostAddressesAsync()引起的线程死锁
- C# 通过线程来控制进度条(转)--讲解多线程对界面的操作
- 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- <iOS>关于子线程和block中操作主线程界面的控件讨论
- VC在线程中操作界面
- 一个 pthread_cancel 引起的线程死锁【整理转载】
- SQL Server死锁诊断--同一行数据在不同索引操作下引起的死锁
- 在WinFrom应用中,如果使用后台线程来操作界面应调用Control.Invoke()方法
- 安卓按钮响应线程中也不能直接通过JNI操作COCOS2D-X界面
- swt在其它线程中调用界面控件的操作
- pyqt4 利用信号槽在子线程里面操作Qt界面
- C#Winform线程操作界面控件
- 不要在使用Sleep等待线程结束,不要在线程中操作界面
- 黑马程序员--读写字节数组,随机读写流,集合IO的思维导图,多线程部分,单例设计模式,线程和进程的概念,Java中的线程的创建方式,线程的随机性,线程的状态图,多线程操作共享数据的安全性,死锁
- 工作线程不要对界面操作
- 在线程中操作界面控件