读书人

如何启动子线程但是不影响主窗口

发布时间: 2012-02-04 15:43:08 作者: rapoo

怎么启动子线程,但是不影响主窗口。
我的需求是这样的,主线程创建了一个子线程,子线程里有一个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里要有可以执行一段时间的语句或延时之类的!
[解决办法]

C/C++ code
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)

读书人网 >VC/MFC

热点推荐