【问题标题】:Error trying to make a basic ThreadManager in C++尝试在 C++ 中创建基本 ThreadManager 时出错
【发布时间】: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。它们提供了一个很好的接口,使某些事情比直接处理Win32 API 更容易。
  • 线程函数不能是成员函数。至少不是这样。您必须使用普通函数(不是方法)或类的静态方法。
  • 是的 - 就像@DiegoSevilla 帖子一样,调用静态方法并将“this”作为 void* 参数传递。将其转换回静态,然后您可以在其上调用实例方法。
  • 此外,线程池更容易和简单地实现,方法是让线程围绕阻塞的生产者-消费者队列弹出,获取任务对象并调用“运行”方法 - 抽象,因此必须在任务中实现后代。

标签: c++ multithreading


【解决方案1】:

cmets 已经说了基础知识,但这里明确说明:当调用需要正常函数时,您不能将方法传递给类。为了做你想做的事,我会做以下事情:

// 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 的调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    相关资源
    最近更新 更多