我正在開發一個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"
我在做什麼錯?
請提取一個最簡單的例子。此外,使用C++ 11線程,它們比C++更好地集成了「CreateThread()」。此外,它避免了一些危險,如缺少運行時初始化。最後,一個普通函數和一個成員函數的區別在parashift的C++ FAQ中有解釋。 –
是的,尤其是當您使用VC++ 2015時。當您可以使用便攜式標準版本時,無需依賴專用的Windows線程實現。 – Dennis
我強烈建議使用'std :: thread'而不是windows原生函數。 –