我有一个非常简单的问题,关于CWinThread如何工作以及每次调用ResumeThread()时入口点在哪里。我正在寻找一个类似于“主要”功能的条目,我可以在其中执行一些操作和分支。
我也想知道如何在不同的线程中的任何一点结束或杀死正在运行的线程。我应该把AfxEndThread()放在哪里?或者只是调用pThread-> ExitInstance()?
我的最后一个问题是,如果我想创建多个线程,如何使用向量在标准模板库(STL)中组织它们?
谢谢。
答案 0 :(得分:2)
我认为你对如何使用线程有一个基本的误解。
像SuspendThread()
和ResumeThread()
这样的函数以及终止线程的函数并不是你控制线程的方式。实际上,SuspendThread()
和ResumeThread()
映射到的Windows API函数被记录为用于调试器。如果MFC文档也说过这样会很好,但事实并非如此。
如果你使用SuspendThread()
来暂停某个帖子,那么当你暂停它时你就不知道它在做什么了。如果只是碰巧锁定,那么你可以使你的程序陷入僵局。
控制线程的常规机制是使用事件对象向您想要暂停或恢复的线程发送信号。例如,使用事件对象而不是简单的布尔标志的原因是可以等待事件。这意味着您可以将线程置于非忙碌状态,而不是消耗CPU并在控制线程发出信号时启动它。
关于终止,绝对是打电话给TerminateThread()
的最后手段。这样做会使同步对象(例如关键部分,互斥体等)处于未定义状态,并且极有可能导致软件中出现可怕的缺陷。再次终止时,您应该发信号通知您希望它退出的线程,然后等待它完成。
答案 1 :(得分:1)
从CWinThread
派生的类的主要入口点是虚拟Run()
函数。但是,还有一个事先调用的InitInstance()
函数,以及之后调用的ExitInstance()
函数。
你不应该自己打电话给ExitInstance()
。相反,请致电AfxEndThread
,或从Run()
返回。
如果你真的想把你的线程放在std::vector<>
中,那么使用指针,因为该类不可复制,并且当线程退出时,MFC会自动删除该实例。
编辑:正如David指出的那样,您通常不希望在应用程序代码中使用SuspendThread
和ResumeThread
。如果您使用的是MFC,请使用AfxBeginThread
启动您的主题。