2017年5月

Code Snippet - Manipulate Control from WorkerThread

MFC多线程开发经常碰到需要在线程中对主窗口的控件进行处理的情况,比如设置控件状态,修改控件文字等,用AfxBeginThread()来创建工作者线程(WorkerThread)

CWinThread *pThread = AfxBeginThread(ThreadFunc, (LPVOID)this);

线程函数

static UINT ThreadFunc(LPVOID lpParam);

UINT CDemoDlg::ThreadFunc(LPVOID lpParam)
{
    CDemoDlg *pMainDlg = (CDemoDlg *)lpParam;
    
    pMainDlg->GetDlgItem(IDC_EDIT1)->SetWindowText(_T("DEMODEMO"));
    
    return 0;
}

上面的写法可以编译通过,大部分情况下也能正常运行,但在工作者线程中直接访问主线程(即UI线程)是不安全的,某些情况会导致线程死锁,甚至程序崩溃。

- 继续阅读 -