现在是在对话框启动时启动多个线程:
for(int j=0;j<MAXTHREADS;j++)
{ ThreadInfos[i]=new ThreadInfo();
ThreadInfos[i]->pCTestWin=this;
ThreadInfos[i]->ThreadId=i;
ThreadInfos[i]->m_hEventStop=::CreateEvent(NULL,TRUE,FALSE,NULL);
UpThreads[j]=AfxBeginThread(TestThread,(LPVOID)ThreadInfos[j]);
}
退出按钮:
for(int i=0;i<MAXTHREADS;i++)
{
SetEvent(ThreadInfos[i]->m_hEventStop);//设置停止信号
}
//然后应该是等待各个线程结束,以便进行下一步处理
//该怎么写呢?
线程函数:
UINT TestThread(LPVOID n)
{
ThreadInfo *pInfo=(ThreadInfo *)n;
while(true)
{
if(WaitForSingleObject(pInfo->m_hEventStop, 0)== WAIT_OBJECT_0)break;
//......
}
}
for(int j=0;j<MAXTHREADS;j++)
{ ThreadInfos[i]=new ThreadInfo();
ThreadInfos[i]->pCTestWin=this;
ThreadInfos[i]->ThreadId=i;
ThreadInfos[i]->m_hEventStop=::CreateEvent(NULL,TRUE,FALSE,NULL);
UpThreads[j]=AfxBeginThread(TestThread,(LPVOID)ThreadInfos[j]);
}
退出按钮:
for(int i=0;i<MAXTHREADS;i++)
{
SetEvent(ThreadInfos[i]->m_hEventStop);//设置停止信号
}
//然后应该是等待各个线程结束,以便进行下一步处理
//该怎么写呢?
线程函数:
UINT TestThread(LPVOID n)
{
ThreadInfo *pInfo=(ThreadInfo *)n;
while(true)
{
if(WaitForSingleObject(pInfo->m_hEventStop, 0)== WAIT_OBJECT_0)break;
//......
}
}
解决方案 »
- 如何读取一个被加密过的文件,不需要解密,只是将数据读取并存放在缓存区内
- AnimateWindow函数参数类型问题
- 这段时间VC区貌似人气不怎样,散分!!
- 有所有字段都不为空的时候才显示,当有字段为空的时候就停止显示记录了
- 有关Debug版本和Release版本的问题。
- 怎么样读取卡拉OK歌词文件*.ksc
- 请教:全局变量和theApp谁先定义?
- ADO的问题多,虽然按照课本上做出一个简单的,但有好多地方都不明白是为什么,比如theApp...
- 如何使用GDI修改图片
- 我的程序不响应菜单消息了,还有怎么DoModal()出不来了
- 急聘VC软件工程师
- CTreeCtrl的CheckBox的触发消息是什么请不吝指教?
GetExitCodeThread(m_Thread->m_hThread,&res);
if (res == STILL_ACTIVE)
return FALSE;这样子可以得到线程的状态,如果 STILL_ACTIVE,PostMessage(WM_CLOSE)类似的消息。
启动线程时候
UpThreads[j]=AfxBeginThread(TestThread,(LPVOID)ThreadInfos[j])->m_hThread;//传句柄//主线程等待
WaitForMultipleObjects(MAXTHREADS,UpThreads,TRUE,INFINITE); //第二参数用线程句柄组,等线程全部关闭后,就会返回.....
jslisong(碧螺春):
你的代码可以检查各个线程是否结束,但是我怎么一直等到各个线程结束呢?
seu07201213(【东南】〖少帅〗) :
使用WaitForMultipleObjects方法我也测试过,但是会让对话框没反应。我查了资料,说了什么消息循环造成的死锁,不知道是不是这个原因?随便问一下,如果设置CWinThread对象的m_bAutoDelete=false,那回头我怎么删除这个对象啊?
手动删除呀。
-------------------------------------------------
确保线程中没有阻塞调用,或者与消息相关的调用。如果是后者,使用MsgWaitForMultipleObjects代替WaitForMultipleObjects
{
if (ThreadInfos[i] != NULL)
{
SetEvent(ThreadInfos[i]->m_hEventStop);
::WaitForSingleObject(ThreadInfos[i]->m_hThread, INFINITE);
delete ThreadInfos[i];
ThreadInfos[i];
}
}
【新人,不知道怎么修改已发帖子,所以只能追加了,有谁知道告诉我一下,谢谢!】