我在 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);
}
问题出在哪里?
答案 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);