怎么启动子线程,但是不影响主窗口。
我的需求是这样的,主线程创建了一个子线程,子线程里有一个while loop。在循环期间,我发现我的主窗口没有任何响应了。。。
实现:
MainFrm.cpp
LRESULT CMainFrame::OnStart()
{
msgThread = (MessageLayerThread*)AfxBeginThread(RUNTIME_CLASS(MessageLayerThread), 0, 0, CREATE_SUSPENDED);
msgThread->ResumeThread();
msgThread->PostThreadMessage(ON_RUN, 0, 0);
return true;
}
MessageLayerThread.cpp
MessageLayerThread::MessageLayerThread()
{
}
MessageLayerThread::~MessageLayerThread()
{
}
BOOL MessageLayerThread::InitInstance()
{
return TRUE;
}
int MessageLayerThread::ExitInstance()
{
// TODO: perform any per-thread cleanup here
return CWinThread::ExitInstance();
}
LRESULT MessageLayerThread::OnRun(WPARAM wParam, LPARAM lParam)
{
bool flag = false;
while(!flag){
TRACE("\n waiting data");
}
return true;
}
BEGIN_MESSAGE_MAP(MessageLayerThread, CWinThread)
ON_THREAD_MESSAGE(ON_RUN, OnRun)
END_MESSAGE_MAP()
之前我时在MessageLayerThread的initInstance函数中,创建一个窗口,然后用postMessage给这个窗口,发现主窗口也被冻住了,我才换成直接PostThreadMessage,谁知道还是不行。。。。
正确的做法应该怎么样。。。大牛们,知道的劳烦指出我的问题在哪里,给个例子什么的也行。。。
我的需求就是要子线程在一个while loop中,但是不影响主窗口。
[解决办法]
while里要有可以执行一段时间的语句或延时之类的!
[解决办法]
UINT __cdecl ThreadProc(LPVOID lParam){ CNewDlg dlg; dlg.Create(IDD_DIALOG1); dlg.ShowWindow(SW_SHOW); MSG msg; while(GetMessage(&msg, NULL, NULL, NULL)) { switch(msg.message) { case ON_RUN: AfxMessageBox(_T("ON RUN")); break; default: break; } TranslateMessage(&msg); DispatchMessage(&msg); } return 0;}LRESULT CMainFrame::OnStart(){ CWinThread* pThread = AfxBeginThread(ThreadProc, (LPVOID)GetSafeHwnd()); pThread->PostThreadMessage(ON_RUN, 0, 0); return 0;}
[解决办法]
在while中加个sleep(1)