MFC 等待线程退出的方法

本文介绍了在多线程环境中如何使用SendMessage和PostMessage进行线程间通信,强调了非阻塞的PostMessage在多数情况下的优势。同时,文章警告了直接在工作线程中操作MFC控件的潜在问题,并提出了通过消息机制在主线程中更新界面的建议。针对WaitForSingleObject可能导致的死锁问题,文章推荐使用MsgWaitForMultipleObjects来实现安全的线程等待和消息处理。

1.工作线程给主线程发消息使用的是SendMessage和PostMessage函数。这两个函数的区别在于SendMessage函数是阻塞方式,而PostMessage函数是非阻塞方式。如果不是严格要求工作线程与主线程必须同步执行,则推荐使用PostMessage。

2.不要在线程函数体内操作MFC控件,因为每个线程都有自己的线程模块状态映射表,在一个线程中操作另一个线程中创建的MFC对象,会带来意想不到的问题。更不要在线程函数里,直接调用UpdataData()函数更新用户界面,这会导致程序直接crash。而应该通过发送消息给主线程的方式,在主线程的消息响应函数里操作控件。

3.在主线程中不要使用WaitForSingleObject和WaitForMultipleObjects两个函数等待线程退出,其原因就是有导致程序死锁的隐患,特别是线程函数里调用了SendMessage或是直接操作了MFC对象,更易出现此种现象。为解决这一问题,微软特提供了一个函数,MsgWaitForMultipleObjects。

举例:
在MFC程序的主线程中如果使用WaitForSingleObject等线子线程,而子线程里使用了有关于消息的函数,比如SetWindowText,InsertItem,SetItemText这些函数,就有会导致主主线程阻塞问题

DWORD WINAPI ThreadProc(  LPVOID lpParameter   // thread data  )  
{
   
     
    CMFCWaitThreadDlg *pDlg = (CMFCWaitThreadDlg*)lpParameter;  
  
    for (int i=0;i<=10;i++)  
    {
   
     
        OutputDebugStringA("test");  
        Sleep(2000);  
        pDlg->SetWindowText(_T("HEHE"));  
          
    }  
    return true;  
}  
void CMFCWaitThreadDlg::OnBnClickedOk()  
{
   
     
    // TODO: 在此添加控件通知处理程序代码  
    DWORD dwID;  
    HANDLE hThread;  
    hThread = CreateThread(0,0,ThreadProc,this,0,&dwID);  
  
    DWORD dwRet = WaitForSingleObject(hThread,INFINITE);  
    if (dwRet == WAIT_OBJECT_0)  
    {
   
     
        MessageBoxA(0,"Thread exit",0,0);  
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值