CDialog reagiert nicht

MortenV

Mitglied
Hi,
ich habe eine Anwendung die einen Dialog erzeugt. Dieser bearbeitet in Echtzeit Livebilder einer Kamera zur Objekterkennung. Wenn dieser Dialog aktiv ist, ist dieser so sehr mit Rechenoperationen ausgelastet, dass er (fast) nie Benutzerkommandos, wie z.B. das Schließen des Fensters, annimmt. Der Dialog wurde nonmodal erstellt.. mit Visual C++ 6
Habt ihr Tips oder Hinweise ?
 
Das ist der perfekte Kandidat für Threads. Wenn möglich würde ich das Bildererkennen in einen zweiten Thread auslagern, sodass die Oberfläche auch zum Zuge kommt.
 
Hier mal mein Ansatz..

Code:
UINT CDetectionDlg::PrepareDetection(LPVOID pParam){
   ... //Aufruf der Metoden zu Detektion  
  return( 0 );
   }

Code:
    void CDetectionDlg::StartThread(){
    	
    	AfxBeginThread(PrepareDetection,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);
    	MessageBox("Thread Started");
    }

Ich bekomme leider folgende Meldung:
error C2665: 'AfxBeginThread' : Durch keine der 2 Ueberladungen kann Parameter 1 vom Typ 'unsigned int (void *)' konvertiert werden
Fehler beim Ausführen von cl.exe.

Woran kann es liegen ? Muss die Methode für den Thread global definiert sein ?
 
Ja, entweder global, oder statisch. Du kannst allerdings deine CDialog-Klasse als den LPVOID-Parameter übergeben, dann kannst du da drin auf die Klasse zugreifen.
 
error C2665: 'AfxBeginThread' : Durch keine der 2 Ueberladungen kann Parameter 1 vom Typ 'unsigned int (void *)' konvertiert werden
Fehler beim Ausführen von cl.exe.
Hatt bei mir immer die gleiche Fehlermeldung, bis mir mal aufgefallen ist, dass ich vergessen habe eine Header-Datei einzubinden vielleicht liegt es ja daran?
Kann mich nicht mehr genau erinnern war entweder afxmt.h in der Deklaration oder afxmn.h in der Definition. Die Header Datei wird auf jeden Fall für die Verarbeitung von AfxBeginThread benötigt
 
Hast du die Funktion denn statisch deklariert? Man kann keine Member-Funktionen als ThreadProcs benutzen, da da ein impliziter this-Pointer auf die Klasse mitgeliefert werden müsste.
Pass mal spasshalber die Typen genau der AFX_THREADPROC an, also UINT und LPVOID. Sollte eigentlich so klappen. Evtl. kannst du noch versuchen, die Funktion auf AFX_THREADPROC zu casten:

AfxBeginThread( (AFX_THREADPROC)PrepareDetection, NULL, THREA...)

Header brauchst du keinen mehr, er erkennt die Funktion ja bereits, die Meldung besagt nur, dass er den ThreadProc-Typ nicht umwandeln kann, bzw. dass PrepareDetection auf keinen der beiden möglichen Typen passt.
 
Hi,
ich habe das Problem (unbewusst) anders gelöst:

Ich habe in den Dialog mit der Darstellung des detektierten Objektes einen Slider hinzugefügt.
Bei der Initialisierung des Ganzen werden Min-/ Max-Werte und die Position des Sliders gesetzt und zur Laufzeit OnHScroll() verwendet. Nun nimmt das Fenster wieder meine Aktionen entgegen und arbeitet völlig normal. Ich habe keine Ahnung warum, aber es funktioniert.

trotzdem vielen Dank,
die Version mit dem AfxBeginThread() hat aber auch funktioniert. Ich habe die eine globale Methode verwendet und "this" übergeben.
 

Neue Beiträge

Zurück