使用 .NET 和 OpenCV 进行线程化?
-
06-07-2019 - |
题
我无法使用线程 开放式计算机视觉. 。问题出在我的代码的 ThreadStart() 部分。
public ref class circles
{
public:
static void circleFind(bool isPhoto, const char * windowName1, const char * windowName2, const char * photoName)
{(stuff)}
};
int main(int argc, char* argv[])
{
const char *windowName1;
const char *windowName2;
const char *photoName;
windowName1 = "Find Circles";
windowName2 = "Gray";
photoName = "Colonies 3.jpg";
bool isPhoto = false;
//circles(isPhoto, windowName1, windowName2, photoName);
Thread^ circleThread = gcnew Thread(
gcnew ThreadStart (&circles::circleFind(isPhoto, windowName1, windowName2, photoName) ));
circleThread->Start();
area(isPhoto, photoName);
return 0;
}
这不是全部代码,而是重要的部分。我得到的错误是:
1>..\..\..\..\..\..\..\Program Files (x86)\OpenCV\samples\c\circle dection.cpp(130) :错误C2102:'&' 需要左值
1>..\..\..\..\..\..\..\Program Files (x86)\OpenCV\samples\c\circle dection.cpp(130) :错误 C3350:'系统::线程::线程启动':委托构造函数需要 2 个参数
解决方案
这里的问题是你试图使用一个函数 ThreadStart
具有不兼容签名的委托。 ThreadStart
是一个没有参数且没有返回值的委托。您正在尝试使用一个需要 4 个参数的方法。这行不通。
您需要传入一个不带参数的方法。
要在 C++ 中传递参数,最好的办法是创建一个将所有参数作为字段的新类。然后给它一个没有参数且没有返回值的方法,并将其用作 ThreadStart
目标。
ThreadHelper^ h = gcnew ThreadHelper();
h->Param1 = someValue;
ThreadStart^ threadDelegate = gcnew ThreadStart( h, &ThreadHelper::DoMoreWork );
上有一个完整的例子 ThreadStart
文档页
不隶属于 StackOverflow