C ++ / CLI参数化线程启动问题

时间:2015-02-25 16:47:08

标签: .net multithreading visual-c++ c++-cli

我正在编写一个带线程的示例程序。我在CamThread.h中有一个名为CamThread的类,如下所示:

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中遇到了&amp; CamThread :: takeImages的问题。它给了我&#34;错误:无效的委托初始化程序 - 函数与委托类型不匹配&#34;。

我似乎错误地构建了委托&amp; CamThread :: takeImages,但我发现的许多示例似乎都使用了类似的结构(例如https://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart%28v=vs.110%29.aspx)。

我一直无法找到其他好的例子。

2 个答案:

答案 0 :(得分:3)

ParameterizedThreadStart类要求委托有一个参数。 所以takeImages方法应该声明为:

void takeImages(Object^obj)

因此,当您想要启动该线程时,您需要传递一个参数:

acquireThread->Start(someParameter);

但是如果你不需要传递参数,那么只需保留方法takeImages,然后使用ThreadStart而不是ParameterizedThreadStart创建线程:

Thread^ acquireThread = gcnew Thread(gcnew ThreadStart(this, &CamThread::takeImages));

并以:

开头
acquireThread->Start();

答案 1 :(得分:-3)

dt->ColumnChanging += gcnew DataColumnChangeEventHandler(this, Project1::MyForm::ppp);

然后

private: void ppp(System::Object^  sender, System::Data::DataColumnChangeEventArgs^ e)
{

}
  

与DataColumnChangeEventArgs相匹配   DataColumnChangeEventHandler。