我有一个简单的程序,它创建一个线程,循环二十次,然后调用关闭自身并执行必要的清理。
当我调试程序时,它到达 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");
}
}
}
Edit:
我意识到 ExitThread() 会停止执行线程,因此我尝试使用不同的方法来停止计时器,但仍然得到相同的结果。
void StopTimer()
{
WaitForSingleObject(hThread,INFINITE);
}
解决方案:
程序在 WaitForSingleObject() 调用处停止并且无论花费多长时间都没有进展的原因是因为它正在等待的操作有一个无限循环。
它将等待无限循环完成,这不是最好的事情。将WaitForSingleObject()的延迟更改为更合理的值,例如100,可以让程序正常运行。
感谢所有的投入。