如何在MFC中定义CWinThread?

时间:2015-05-12 08:10:49

标签: c++ mfc pthreads

我在 c ++ / mfc 中为int控件设置了"EditBox"变量。现在我想在value中更改thread

我定义了一个类似于下面的线程:

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

问题出在哪里?

1 个答案:

答案 0 :(得分:4)

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

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

因此,您需要做的是从工作线程向主线程发出信号,表明新值可用并且应该显示。对于该信令,您可以将窗口消息发布到对话窗口(PostMessage)。请确保不要使用SendMessage,因为这将阻止,直到收到消息。如果主线程正在等待工作线程并且工作线程正在等待SendMessage中的主线程,则可能会遇到死锁。当主线程收到消息时,它可以更新窗口控件。

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

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