【发布时间】: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