2016-05-30 120 views
2

我正在開發一個Windows應用程序,其中需要運行三個進程:_thread_EEG(採集),_thread_MachineLearning(處理),_thread_Interface(接口)。第二個過程使用第一個過程的數據,第三個過程需要第二個過程的結果。C++類中的非靜態多線程

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"

我在做什麼錯?

+3

請提取一個最簡單的例子。此外,使用C++ 11線程,它們比C++更好地集成了「CreateThread()」。此外,它避免了一些危險,如缺少運行時初始化。最後,一個普通函數和一個成員函數的區別在parashift的C++ FAQ中有解釋。 –

+0

是的,尤其是當您使用VC++ 2015時。當您可以使用便攜式標準版本時,無需依賴專用的Windows線程實現。 – Dennis

+1

我強烈建議使用'std :: thread'而不是windows原生函數。 –

回答

1

線程函數必須是靜態的,所以DWORD __stdcall前加static ...

此外,第四個參數CreateThread是常規參數。您期待指向uMotor的指針,但代之以傳遞&endTime。將&endTime替換爲this

+0

謝謝! 但現在我有另一個錯誤:'#error指令:WINDOWS.H已包括在內。 MFC應用程序不能#include \t uMotor \t c:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ atlmfc \ include \ afxv_w32.h' – Surya

+0

請參閱http://stackoverflow.com/questions/1017814/error- windows-h-already-included-mfc-apps-must-not-include-windows -h,第二個答案 – Isso

+0

我試過了他們建議的解決方案不成功。我的應用程序是64位。這可能是問題所在? – Surya