我可能已经编写了很多年,但我想在C ++中创建一个非常基本的线程管理器来实现我的想法。我遇到了一个问题,我遇到了这个错误:
ThreadManager.cpp:49:37:错误:无法转换 类型'DWORD(ThreadManager ::)(LPVOID)中的'ThreadManager :: updateLoop' {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
就像我说的那样,我没有很长时间的编程,而我正试图用我记得的东西重新进入它,所以任何帮助都会受到赞赏。
答案 0 :(得分:0)
评论已经说了基础知识,但是这里拼写出来:当一个调用期望一个正常的函数时,你不能将一个方法传递给一个类。为了做你想做的事,我会做以下事情:
// New Function
void threadMain(void* classPointer)
{
ThreadManager* realClass = (ThreadManager*)classPointer;
realClass->updateLoop();
}
ThreadManager::ThreadManager(int max)
{
// Assign maxThreads to max value
maxThreads = max;
// Start updateThread, and let it run updateLoop() until terminated
updateThread = CreateThread(
NULL, // default security attributes
0, // use default stack size
threadMain, // thread function name
this, // argument to thread function
0, // use default creation flag
NULL); // ignore thread identifier
// Check the return value for success
// If failed, exit process.
if (updateThread == NULL) {
ExitProcess(3);
}
}
现在我知道你想要一个额外的参数,所以可能使用std :: tuple传入“this”指针以及你真正想要的任何额外参数。
现在已经说了所有这些,接受其他人的建议并使用std::thread等,而不是特定于win32的调用,除非你真的需要。