C++/CLI 参数化线程启动问题
C++/CLI Parametrized Thread Start problems
我正在编写一个带线程的示例程序。我有一个名为 CamThread 的 class 在 CamThread.h
中定义如下
public ref class CamThread{
public:
CamThread();
void takeImages();
private:
Driver^ driver;
};
CamThread.cpp 文件看起来像:
using namespace System::Threading;
CamThread::CamThread(){
Driver^ newdriver;
newdriver = (Driver^)gcnew ZylaDriver();
newdriver->initCamera();
Thread^ acquireThread = gcnew Thread(gcnew ParameterizedThreadStart(this,&CamThread::takeImages));
acquireThread->Start;
};
void CamThread::takeImages(){
//Additional code.}
主要功能是
int main(int argc, char* argv[])
{
CamThread^ cameraThread = gcnew CamThread();
cout << endl << "Press enter to close" << endl;
cin.ignore();
return 0;
}
我遇到的问题是,在 CamThread.cpp Visual Studio 2013 中,ParameterizedThreadStart 中的 &CamThread::takeImages 存在问题。它给了我 "Error: Invalid delegate initializer -- function does not match the delegate type".
我似乎错误地构造了委托 &CamThread::takeImages,但我发现的许多示例似乎都使用了类似的构造(例如 https://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart%28v=vs.110%29.aspx)。
我一直找不到其他好的例子。
ParameterizedThreadStart class 要求委托有一个参数。
所以 takeImages 方法应该声明为:
void takeImages(Object^obj)
因此,当你想要启动线程时,需要传递一个参数:
acquireThread->Start(someParameter);
但是如果你不需要传递参数,那么只需要保持方法 takeImages 不变,并使用 ThreadStart 而不是 ParameterizedThreadStart 创建线程:
Thread^ acquireThread = gcnew Thread(gcnew ThreadStart(this, &CamThread::takeImages));
并开始:
acquireThread->Start();
dt->ColumnChanging += gcnew DataColumnChangeEventHandler(this, Project1::MyForm::ppp);
然后
private: void ppp(System::Object^ sender, System::Data::DataColumnChangeEventArgs^ e)
{
}
That is DataColumnChangeEventArgs matches with
DataColumnChangeEventHandler.
我正在编写一个带线程的示例程序。我有一个名为 CamThread 的 class 在 CamThread.h
中定义如下public ref class CamThread{
public:
CamThread();
void takeImages();
private:
Driver^ driver;
};
CamThread.cpp 文件看起来像:
using namespace System::Threading;
CamThread::CamThread(){
Driver^ newdriver;
newdriver = (Driver^)gcnew ZylaDriver();
newdriver->initCamera();
Thread^ acquireThread = gcnew Thread(gcnew ParameterizedThreadStart(this,&CamThread::takeImages));
acquireThread->Start;
};
void CamThread::takeImages(){
//Additional code.}
主要功能是
int main(int argc, char* argv[]) {
CamThread^ cameraThread = gcnew CamThread();
cout << endl << "Press enter to close" << endl;
cin.ignore();
return 0;
}
我遇到的问题是,在 CamThread.cpp Visual Studio 2013 中,ParameterizedThreadStart 中的 &CamThread::takeImages 存在问题。它给了我 "Error: Invalid delegate initializer -- function does not match the delegate type".
我似乎错误地构造了委托 &CamThread::takeImages,但我发现的许多示例似乎都使用了类似的构造(例如 https://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart%28v=vs.110%29.aspx)。
我一直找不到其他好的例子。
ParameterizedThreadStart class 要求委托有一个参数。 所以 takeImages 方法应该声明为:
void takeImages(Object^obj)
因此,当你想要启动线程时,需要传递一个参数:
acquireThread->Start(someParameter);
但是如果你不需要传递参数,那么只需要保持方法 takeImages 不变,并使用 ThreadStart 而不是 ParameterizedThreadStart 创建线程:
Thread^ acquireThread = gcnew Thread(gcnew ThreadStart(this, &CamThread::takeImages));
并开始:
acquireThread->Start();
dt->ColumnChanging += gcnew DataColumnChangeEventHandler(this, Project1::MyForm::ppp);
然后
private: void ppp(System::Object^ sender, System::Data::DataColumnChangeEventArgs^ e)
{
}
That is DataColumnChangeEventArgs matches with DataColumnChangeEventHandler.