我有一个简单的程序,它创建一个线程,循环20次,然后调用关闭自己并执行必要的清理。
当我调试程序时,它会到达ExitThread();方法并暂停,忽略printf();在它之后设置它以向我发出关闭的信号。
这是正常的还是我忘了做些什么?我不熟悉使用C进行线程处理。
Main()
void main()
{
Time t;
int i = 0;
StartTimer();
for(i = 0; i < 20; i++)
{
t = GetTime();
printf("%d.%.3d\n", t.seconds, t.milliseconds);
Sleep(100);
}
StopTimer();
}
线程创建
void StartTimer()
{
DWORD threadId;
seconds = 0;
milliseconds = 0;
// Create child thread
hThread = CreateThread(
NULL, // lpThreadAttributes (default)
0, // dwStackSize (default)
ThreadFunc, // lpStartAddress
NULL, // lpParameter
0, // dwCreationFlags
&threadId // lpThreadId (returned by function)
);
// Check child thread was created successfully
if(hThread == NULL)
{
printf("Error creating thread\n");
}
}
线程关闭
void StopTimer()
{
DWORD exitCode;
if(GetExitCodeThread(hThread,&exitCode) != 0)
{
ExitThread(exitCode);
printf("Thread closed");
if(CloseHandle(hThread))
{
printf("Handle closed");
}
}
}
编辑:
我已经意识到ExitThread()停止执行线程,因此我尝试使用另一种方法来停止计时器,但结果仍然是一样的。
void StopTimer()
{
WaitForSingleObject(hThread,INFINITE);
}
解决方案:
程序在WaitForSingleObject()调用时停止而不进行的原因,无论花费多长时间,都是因为它正在等待的操作有一个无限循环。
它将等待一个无限循环完成,而不是最好的事情。将WaitForSingleObject()的延迟更改为更合理的内容,例如100,可以使程序正常运行。
谢谢你的投入。
发布于 2010-03-19 13:26:04
是的,这是“正常的”,通过调用ExitThread,您告诉windows您已经完成了调用线程,所以其余的代码不会被调用。这有点像调用exit(0)。
就我个人而言,我不会这样用它。代码的其余部分是可以的,您正在正确地清理线程,只需正常退出线程函数即可。
发布于 2010-03-19 13:23:23
这是正常的,因为ExitThread实际上退出了当前线程,因此它永远不会返回,下面的指令将永远不会执行。
顺便说一句,您不应该直接调用ExitThread (除非您真的知道自己在做什么):您只需从线程函数返回即可。
然后,如果使用C运行时库,则不应该使用原始线程API,而是使用C运行时库(如_beginthread和_beginthreadex )。
发布于 2010-03-19 13:25:17
ExittThread函数立即终止调用线程。
https://stackoverflow.com/questions/2477550
复制相似问题