¿Roscar con .NET y OpenCV?
-
06-07-2019 - |
Pregunta
Tengo problemas para hacer que un hilo funcione con OpenCV . El problema es con la parte ThreadStart () de mi código.
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;
}
Esto no es todo el código sino la parte importante. Los errores que recibo son:
1 > .. \ .. \ .. \ .. \ .. \ .. \ .. \ Archivos de programa (x86) \ OpenCV \ samples \ c \ circle dection.cpp (130): error C2102: ' &erio;' requiere l-valor
1 > .. \ .. \ .. \ .. \ .. \ .. \ .. \ Archivos de programa (x86) \ OpenCV \ samples \ c \ circle dection.cpp (130): error C3350: ' System :: Threading :: ThreadStart ': un constructor delegado espera 2 argumento (s)
Solución
El problema aquí es que intenta utilizar una función para un delegado ThreadStart
que tiene una firma incompatible. ThreadStart
es un delegado que no tiene argumentos y no devuelve ningún valor. Estás intentando usar un método que toma 4 argumentos. Esto no funcionará.
Tendrá que pasar un método que no tenga argumentos.
Para pasar parámetros en C ++, su mejor apuesta es crear una nueva clase que tenga todos los parámetros como campos. Luego, asigne un método que no tenga parámetros y no devuelva ningún valor y utilícelo como objetivo de ThreadStart
.
ThreadHelper^ h = gcnew ThreadHelper();
h->Param1 = someValue;
ThreadStart^ threadDelegate = gcnew ThreadStart( h, &ThreadHelper::DoMoreWork );
Hay un ejemplo completo de esto en la página de documentación de ThreadStart