MFC中如何定义CWinThread?

How to define CWinThread in MFC?

我在 c++/mfc 中为 "EditBox" 控件设置了一个 int 变量。现在我想在 thread.

中更改它的 value

我定义了一个线程,如下所示:

CWinThread *pThread();

UINT FunctionThread(CthDlg& d)
{
    DWORD result = 0;
    int i = 0;
    while (1)
    {
        if (i == 5000) i = 0;

        d.m_text1 = i;
        i++;
        d.UpdateData(FALSE);
    }
    return result;
}


void CthDlg::OnBnClickedOk()
{
    // TODO: Add your control notification handler code here
    pThread = AfxBeginThread(FunctionThread, THREAD_PRIORITY_NORMAL);
}

问题出在哪里?

您应该 运行 您的代码处于调试模式和调试器下,然后您会看到您得到一个断言。

问题是 MFC 只允许从创建 window 的线程访问 window。在您的情况下,这意味着主线程可以访问 windows,但工作线程不能。 UpdateData 正在访问 windows,因此这在工作线程中不起作用。

因此,您需要做的是从工作线程向主线程发出信号,表明新值可用并应显示。对于该信号,您可以 post 向对话 window (PostMessage) 发送 window 消息。一定不要使用 SendMessage 因为这会阻塞直到收到消息。如果主线程正在等待工作线程,而工作线程正在等待 SendMessage 中的主线程,您可能 运行 陷入死锁。当主线程收到消息时,它可以更新 window 控件。

顺便说一句,您的代码无效。 AfxBeginThread 需要声明为 UINT __cdecl MyControllingFunction(LPVOID pParam);AFX_THREADPROC。您需要将线程函数更改为

UINT __cdecl FunctionThread(LPVOID pParam)
{
    CthDlg& d = *reinterpret_cast<CthDlg*>(pParam);