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