我有这样的事情:
DWORD WINAPI test(LPVOID lpParam) {
while (1) {
/*DO STUFF*/
}
}
int main() {
...
hThread = CreateThread(NULL,0,test,NULL,0,&dwThreadId);
...
}
如何在没有TerminateThread()的情况下关闭线程? 我的第一个想法是创建一个全局变量(shouldshutdown = 0/1),当Thread应该关闭时将它设置在main()中。然后在Thread中调用ExitThread()。因此,我必须在线程的while循环中检查此变量,这是我想的坏样式。
答案 0 :(得分:11)
您可以检查线程是否需要停止的事件。例如(没有错误处理):
function stepperVal(name,val){
var qty = 0;
var new_qty = parseInt(document.getElementsByName(name),10) + val;
if (new_qty < 0) {
new_qty = 0;
}
document.getElementsByName(name).value = new_qty;
return new_qty;
}
一般模式是为线程提供某种可以监视的可警告对象以及其他可以设置的对象。在这种情况下,我使用了手动重置事件。 DWORD WINAPI test(LPVOID lpParam)
{
HANDLE hEvent = (HANDLE)lpParam
while (WaitForSingleObject(hEvent, 0) == WAIT_TIMEOUT)
{
/*DO STUFF*/
}
}
int main() {
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)
hThread = CreateThread(NULL,0,test,(LPVOID)hEvent,0,&dwThreadId);
// Do
// Stuff
// Tell the thread to exit
SetEvent(hEvent)
// Wait for the thread to exit
WaitForSingleObject(hThread, INFINITE);
}
循环检查事件是否已发出信号,如果没有,则表示事件。发出信号后,while
将返回WaitForSingleObject
,循环将退出,您将退出线程函数。
在主函数中,在发出事件信号后,您需要做的就是等待线程退出。
答案 1 :(得分:0)
如果需要在主线程和工作线程之间发送消息 - 例如,要做的工作包括放在某个队列中的任务,最简单的选择可能就是简单地给工作线程一个消息循环
PostThreadMessage
API可用于将WM_APP
消息发布到要执行任务的线程,并在线程退出时发送WM_QUIT
消息。这可以节省您构建自己的线程安全信令机制。
它的另一个好处是,如果您的工作线程正在实例化COM对象,那么您需要做的就是添加对CoInitialize
的初始调用,并且该线程是有效的STA。
答案 2 :(得分:0)
如果要关闭线程,您有两个选择: 1.强制线程终止(使用TerminateThread)。 2.要求线程关闭(为此工作线程必须合作)。
如果您选择第二个选项,您可以选择如何操作。一种选择是使用全局标志来告诉线程终止(我不确定为什么你认为这是不好的风格)。最好的选择可能取决于你的主题在做什么。