所以我一直在学习Windows API中的线程,我写了一些测试代码,但是我遇到了一些问题。首先,我有两个功能:
DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
int i = (int)lpParam;
cout << i << ".) I work! " << endl;
return 0;
}
和
// MyThreadFunction2 - loops continuously forever, outputing "working..." every 1ms
DWORD WINAPI MyThreadFunction2( LPVOID lpParam )
{
int i = (int)lpParam;
while(1) {
cout << i << ".) Working... " << endl;
Sleep(1);
}
return 0;
}
我正在使用CreateThread创建线程,但我稍后会将其更改为_beginThread,这是人们告诉我在另一个相关帖子中做的事情。所以这就是我创建线程的方式:
threads.push_back(CreateThread(
NULL, // default security attributes
0, // use default stack size
lpStartAddress, // thread function name
lpParameter, // arugument to thread function
0, // use default creation flag
NULL)); // ignore thread identifier.
我将我创建的线程HANDLEs放入向量中,但这是无关紧要的。基本上我有上面的代码工作,它创建线程很好。当我使用MyThreadFunction2创建线程时,我遇到的问题是调用TerminateThread(HANDLE,0),它永远循环。当我调用TerminateThread时,我的程序就冻结并坐在那里。似乎线程已停止,因为我没有收到“Working ...”消息,但它不会继续任何其他代码。但是,当我使用MyThreadFunction调用同样的函数时,它可以正常工作。
我不知道如何解释发生的事情是非常令人困惑的,我希望不是。我知道这不是一个“只是转储代码,让人们修复它”的地方 - 我在其他人的帖子上看到了这个,但只是因为你不理解我上面写的东西,或者它有用,这里是我的代码:
ThreadManager.cpp
ThreadManager.h
很抱歉,代码写得不好,有些事情还不完整。我仍在努力重新学习C ++并学习如何使用Windows API。但是,是否有人对我可能做错了什么有任何想法?
答案 0 :(得分:5)
使用TerminateThread来杀死一个线程通常是一个非常糟糕的主意。甚至这个功能的MSDN页面也告诉你。告诉线程停止工作的更好方法是向它们传递一个事件。对于一个事件,运行无限循环的线程将while (WaitForSingleObject(event, 1) == WAIT_TIMEOUT)
而不是while (1)
。
为什么TerminateThread确切地说它会死掉,我不知道,但你可以在阅读这篇文章时了解可能出现的问题http://msdn.microsoft.com/en-us/library/windows/desktop/ms686717(v=vs.85).aspx