【发布时间】:2012-12-20 17:07:49
【问题描述】:
我可能有几年没有编写太多代码了,我想用 C++ 制作一个非常基本的线程管理器,以实现我的想法。我遇到了一个问题,我收到了这个错误:
ThreadManager.cpp:49:37:错误:无法转换 'DWORD 类型的'ThreadManager::updateLoop' (ThreadManager::)(LPVOID) {aka long unsigned int (ThreadManager::)(void*)}' 输入 'LPTHREAD_START_ROUTINE {aka long unsigned int (属性((stdcall)) )(void)}'
但是,我不知道如何尝试修复它。这是我的代码,我不知道如何将其粘贴到此处并进行格式化。它说我每行需要 4 个空格,但这似乎需要一段时间,所以我把它放在 pastebin 上:
ThreadManager.cpp:http://pastebin.com/2bL3mTqv
ThreadManager.h:http://pastebin.com/7xETj5BK
就像我说的那样,我已经很久没有编写太多程序了,我正在尝试用我记得的东西重新开始,所以任何帮助都将不胜感激。
【问题讨论】:
-
另外,如果您对修改我的代码以使其变得更好有任何建议,请告诉我!我知道这根本不是好的 OOP,几乎没有可重用性,但这是初稿,也是我写了一段时间的第一个程序。
-
首先,不要使用
TerminateThread。其次,如果你有可用的 C++11,只需使用std::thread,或者除非使用boost::thread。它们提供了一个很好的接口,使某些事情比直接处理Win32API 更容易。 -
线程函数不能是成员函数。至少不是这样。您必须使用普通函数(不是方法)或类的静态方法。
-
是的 - 就像@DiegoSevilla 帖子一样,调用静态方法并将“this”作为 void* 参数传递。将其转换回静态,然后您可以在其上调用实例方法。
-
此外,线程池更容易和简单地实现,方法是让线程围绕阻塞的生产者-消费者队列弹出,获取任务对象并调用“运行”方法 - 抽象,因此必须在任务中实现后代。
标签: c++ multithreading