C++ 多线程
C++多线程,我写了一个线程,实现一个功能:A,现在程序要求不断去做A这件事,也就是不断的开线程A,要求旧的线程A结束后再开新的线程A,就是只能有一个现在存在,我如何去判...
C++ 多线程,我写了一个线程,实现一个功能:A, 现在程序要求不断去做A这件事,也就是不断的开线程A, 要求旧的线程A结束后再开新的线程A,就是只能有一个现在存在,我如何去判断上一次开的线程A已结束,然后我再开线程A
我现在的代码是这样:
int flag=0;
bool rd=0;
HANDLE hh;
int eixtcode;
while(......)
{
................
if(flag==0)
{ hh=CreateThread(NULL,0,ThreadFuc,0,0) //开线程A,
flag=1;
}
else
{
rd=GetExitCodeThread(hh,&exitcode);
if(rd&&exitcode!=STILL_ACTIVE)
{
CloseThread(hh);
hh=CreateThread(NULL,0,ThreadFuc,0,0) //开线程A
}
}
}
请问这样可以吗????
关键在如何判断线程已结束, 我需要人为的加 exitthread()吗? 展开
我现在的代码是这样:
int flag=0;
bool rd=0;
HANDLE hh;
int eixtcode;
while(......)
{
................
if(flag==0)
{ hh=CreateThread(NULL,0,ThreadFuc,0,0) //开线程A,
flag=1;
}
else
{
rd=GetExitCodeThread(hh,&exitcode);
if(rd&&exitcode!=STILL_ACTIVE)
{
CloseThread(hh);
hh=CreateThread(NULL,0,ThreadFuc,0,0) //开线程A
}
}
}
请问这样可以吗????
关键在如何判断线程已结束, 我需要人为的加 exitthread()吗? 展开
1个回答
展开全部
1、开的线程的函数里如果用到了c语言运行库的东西,尽量使用_beginthreadex
2、那个handle,就是hh,可以送到 WaitForSingleObject里,第二个参数给它0,返回0代表线程已经结束,返回非0代表线程还没运行结束: if( WaitForSingleObject(hh, 0) == 0) { 线程结束要做的事 } else { 线程没结束要做的事 }
3、话说我好像有在另一个问题里回答过你(不知道是不是你,不过问题几乎是一样的……),WaitForSingleObject函数的第二个参数不要写0,可以防止你程序跑起来的时候占满cpu核心……
2、那个handle,就是hh,可以送到 WaitForSingleObject里,第二个参数给它0,返回0代表线程已经结束,返回非0代表线程还没运行结束: if( WaitForSingleObject(hh, 0) == 0) { 线程结束要做的事 } else { 线程没结束要做的事 }
3、话说我好像有在另一个问题里回答过你(不知道是不是你,不过问题几乎是一样的……),WaitForSingleObject函数的第二个参数不要写0,可以防止你程序跑起来的时候占满cpu核心……
更多追问追答
追问
我 用了WaitForSingleObject函数,第二个参数给它0, 我开了4个小线程,不断开不断关闭, 程序跑的时候一开始是好的,跑一段时间就Application Crash, 配置差的电脑上跑比配置好的电脑程序崩掉的时间长, 是因为线程这块有问题还是可能我其他部分写的程序有问题啊,
2,3短号关于 WaitForSingleObject里,第二个参数矛盾。
追答
因为你要求的是“检测线程有没有停止”,所以我给了2。但是循环检测的话会浪费很多cpu时间,所以根据这个问题我给了建议3。2是“检测有没有停”而3是“等它停”。
跑一段时间就crash自然是你程序的问题,但是具体我现在也没办法看到你到底是crash在哪里所以……你可以在vs里面直接按f5来运行程序而不是“开始执行(不调试)”,crash的时候点“重试”可以看到程序crash在哪里。如果看到的是看不懂的汇编代码,开启“调用堆栈”窗口,然后选中下面几个你写的函数,就可以看到程序崩在哪里了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询