Обработка потоков с помощью .NET и OpenCV?
-
06-07-2019 - |
Вопрос
У меня возникли проблемы с получением потока для работы OpenCV.Проблема связана с частью моего кода 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:'&' требует l-значения
1>..\..\..\..\..\..\..\ Program Files (x86)\OpenCV\samples\c\circle dection.cpp (130) :ошибка C3350:'System::Threading::Запуск потока' :конструктор делегата ожидает 2 аргумента (ов)
Решение
Проблема здесь в том, что вы пытаетесь использовать функцию для ThreadStart
делегат, который имеет несовместимую подпись. ThreadStart
является делегатом, который не имеет аргументов и не возвращает значения.Однако вы пытаетесь использовать метод, который принимает 4 аргумента.Это не сработает.
Вместо этого вам нужно будет передать метод, который не принимает аргументов.
Чтобы передать параметры на C ++, лучше всего создать новый класс, который содержит все параметры в виде полей.Затем дайте ему метод, который не имеет параметров и не возвращает значения, и используйте его в качестве ThreadStart
цель.
ThreadHelper^ h = gcnew ThreadHelper();
h->Param1 = someValue;
ThreadStart^ threadDelegate = gcnew ThreadStart( h, &ThreadHelper::DoMoreWork );
Полный пример этого есть на сайте ThreadStart
страница документации