0

所以我一直在学习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.

我将创建的线程句柄放入向量中,但这无关紧要。基本上我有上面的代码工作,它可以很好地创建线程。我遇到的问题是在使用 MyThreadFunction2 创建线程时调用 TerminateThread(HANDLE, 0),它会永远循环。当我调用 TerminateThread 时,我的程序只是冻结并停在那里。似乎线程已停止,因为我没有收到“正在工作...”消息,但它不会继续任何其他代码。但是,当我使用 MyThreadFunction 调用相同的函数时,它可以正常工作。

我不知道我如何解释正在发生的事情是否非常令人困惑,我希望不是。我知道这不是一个“只是转储代码,然后让人们修复它”的地方——我在别人的帖子上读到过,但以防你不理解我上面写的东西,或者它很有帮助,这里是我的代码:

线程管理器.cpp

http://pastebin.com/0B1N3TAH

线程管理器.h

http://pastebin.com/yfwMJTaz

对不起,代码写得不好,有些东西不完整。我仍在努力重新学习 C++ 并学习如何使用 Windows API。但是有没有人知道我可能做错了什么?

4

1 回答 1

4

使用 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

于 2013-01-12T05:37:34.007 回答