大家好。我有一个程序,要执行8个步骤,每个步骤的执行时间都比较长,于是我就设计了一个非模式的提示对话框显示这8个步骤的信息,每个步骤信息前都有一个勾号图标,程序刚执行时,所有的勾号图标都是隐藏的,每当执行完一个步骤,就显示相应步骤信息前的勾号,这样就可以提示当前执行到哪个步骤了。但是程序在正式运行时,一旦开始执行这8个步骤的计算后,非模式对话框就无法显示每个步骤的信息和步骤前的勾号了,好像程序死掉了一样,我知道这是因为单线程在大量计算时无法响应对话框的消息的缘故,于是我考虑将这8个步骤的计算放到多线程里完成,主线程只显示对话框,由于是初次接触多线程编程,看了很多文章,但是还有一些不明白,自己也有一点想法,只是不知道这种想法是否可行,想请教各位。
1、我考虑依次分别开8个工作者线程来执行每一个步骤,一个步骤执行完,则对应的线程函数返回,这样,只要取得线程函数的返回值为真,我就可以在相应步骤前加上勾号,否则,如果线程函数返回值为假,就退出非模式对话框并中止后续步骤的计算,但是,这需要在主线程中调用WaitForSingleObject函数来等待子线程的函数返回,而WaitForSingleObject函数会使主线程挂起,这样不就造成了主线程暂时停止响应吗?那样主线程创建的非模式对话框也会停止响应吧,这和单线程的情形不是一样了么?很困惑,不知该怎么办……
2、如果不开8个工作者线程,而是把8个计算步骤合并到一个线程中完成,那么子线程每完成一个步骤就需要挂起,然后等主线程创建的非模式对话框显示了一个勾号后再接着执行,这个貌似比较复杂,不知道该怎么去实现呢?请指导一下。在此先谢谢各位了。
1、我考虑依次分别开8个工作者线程来执行每一个步骤,一个步骤执行完,则对应的线程函数返回,这样,只要取得线程函数的返回值为真,我就可以在相应步骤前加上勾号,否则,如果线程函数返回值为假,就退出非模式对话框并中止后续步骤的计算,但是,这需要在主线程中调用WaitForSingleObject函数来等待子线程的函数返回,而WaitForSingleObject函数会使主线程挂起,这样不就造成了主线程暂时停止响应吗?那样主线程创建的非模式对话框也会停止响应吧,这和单线程的情形不是一样了么?很困惑,不知该怎么办……
2、如果不开8个工作者线程,而是把8个计算步骤合并到一个线程中完成,那么子线程每完成一个步骤就需要挂起,然后等主线程创建的非模式对话框显示了一个勾号后再接着执行,这个貌似比较复杂,不知道该怎么去实现呢?请指导一下。在此先谢谢各位了。
g_bLoopAllDeviceEnable = FALSE;
while(TRUE)
{
DWORD result ;
MSG msg ;
result = MsgWaitForMultipleObjects(1, &(g_pThreadLoopAllDevice->m_hThread),
FALSE, INFINITE, QS_ALLINPUT);
if (result == (WAIT_OBJECT_0)){
break;
}
else
{
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
DispatchMessage(&msg);
}
}
delete g_pThreadLoopAllDevice;//删除线程
#endif用这种方式去结束你的线程
http://topic.csdn.net/u/20091126/10/370c1bfe-111f-489a-8d91-91aed0c1f064.html?22083