【问题标题】:Multithreading non-static in class C++C ++类中的多线程非静态
【发布时间】:2016-09-28 13:00:48
【问题描述】:

我正在为 Windows 开发一个应用程序,其中需要运行三个进程:_thread_EEG(采集)、_thread_MachineLearning(处理)、_thread_Interface(接口)。第二个过程使用第一个过程的数据,第三个过程需要第二个过程的结果。

class uMotor{
private:
    long _endTime;

    bool _busyBuffer;
    bool _busyLabel;

    Raw  _Shared_buffer;
    char _Shared_label ;

    uEEG _gtec;
    Interface _screen;

    void _EEG            (long endTime);
    void _MachineLearning(long endTime);
    void _Interface      (long endTime);

    DWORD __stdcall _Thread_EEG(LPVOID arg){
        uMotor *yc_ptr = (uMotor*)arg;
        yc_ptr->_EEG(_endTime);
        return 1;
    }

    DWORD __stdcall _Thread_MachineLearning(LPVOID arg){
        uMotor *yc_ptr = (uMotor*)arg;
        yc_ptr->_MachineLearning(_endTime);
        return 1;
    }

    DWORD __stdcall _Thread_Interface(LPVOID arg){
        uMotor *yc_ptr = (uMotor*)arg;
        yc_ptr->_Interface(_endTime);
        return 1;
    }

public:
    uMotor();
    void BCI();
    ~uMotor();
};

线程在函数uMotor::BCI()中被调用:

void uMotor::BCI(){
    const long NUM_SECONDS_RUNNING = 9;

    long startTime = clock();
    long endTime = startTime + NUM_SECONDS_RUNNING * CLOCKS_PER_SEC;

    HANDLE Handle_Thread_EEG             = 0;
    HANDLE Handle_Thread_MachineLearning = 0;
    HANDLE Handle_Thread_Interface       = 0;

    Handle_Thread_EEG = CreateThread(NULL, 0, _Thread_EEG, &endTime, 0, NULL);
    Handle_Thread_EEG = CreateThread(NULL, 0, _Thread_MachineLearning, &endTime, 0, NULL);
    Handle_Thread_EEG = CreateThread(NULL, 0, _Thread_Interface, &endTime, 0, NULL);
}

在函数CreateThread中,Visual Studio 2015 显示错误argument of type "DWORD(_stdcall uMotor::*)(LPVOID arg)" is incompatible with parameter of type "LPTHREAD_START_ROUTINE"

我做错了什么?

【问题讨论】:

  • 请提取一个最小的例子。此外,使用 C++11 线程,它们与 C++ 的集成比CreateThread() 更好。此外,它还避免了一些危险,例如缺少运行时初始化。最后,在 parashift 的 C++ FAQ 中解释了普通函数和成员函数之间的区别。
  • 是的,尤其是当您使用 VC++ 2015 时。当您可以使用可移植标准版本时,无需依赖专用的 windows 线程实现。
  • 我强烈建议使用std::thread 而不是 Windows 原生函数。
  • 加起来,std::thread 还使得使用非static 类成员作为线程函数变得更加容易。
  • 感谢您的建议。请参考一下?

标签: c++ multithreading visual-studio-2015 createthread


【解决方案1】:

线程函数必须是静态的,所以在DWORD __stdcall之前加上static...

另外,CreateThread 的第四个参数是例程参数。您期望指向uMotor 的指针,但改为传递&endTime。将&endTime 替换为this

【讨论】:

  • 谢谢!但是现在我又遇到了一个错误:#error directive: WINDOWS.H already included. MFC apps must not #include <windows.h> uMotor c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\afxv_w32.h
  • 我尝试了他们建议的解决方案,但没有成功。我的应用程序是 64 位的。这可能是问题所在?
  • 我错了。解决方案是添加标题<afx.h>。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
相关资源
最近更新 更多