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);

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

2512

被折叠的 条评论
为什么被折叠?



