WaitForSingleObject Problem
-
net schrieb:
Martin Richter schrieb:
Einzig korrekter Weg: AutoDelete im Thread auf False setzen!
das muss der thread aber selber machen, sonst haste ja das gleiche problem...
Nein... mach es einfach so wie es in der MSDN-DOu steht:
dwCreateFlags
Specifies an additional flag that controls the creation of the thread. This flag can contain one of two values:
CREATE_SUSPENDED Start the thread with a suspend count of one. Use CREATE_SUSPENDED if you want to initialize any member data of the CWinThread object, such as m_bAutoDelete or any members of your derived class, before the thread starts running. Once your initialization is complete, use CWinThread::ResumeThread to start the thread running. The thread will not execute until CWinThread::ResumeThread is called.
-
Fazit:
CWinThread* vgl_thread = AfxBeginThread( MASTER_scan_img, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL ); vgl_thread->m_bAutoDelete = FALSE; vgl_thread->ResumeThread(); WaitForSingleObject(vgl_thread->m_hThread,INFINITE); delete vgl_thread; MessageBox("jetzt");
-
OK! So geht es natürlich auch und ist sicherlich auch klarer!
Danke für die Ergänzung ich vergesse das immer wieder!
-
Jochen Kalmbach schrieb:
Fazit:
CWinThread* vgl_thread = AfxBeginThread( MASTER_scan_img, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL ); vgl_thread->m_bAutoDelete = FALSE; vgl_thread->ResumeThread(); WaitForSingleObject(vgl_thread->m_hThread,INFINITE); delete vgl_thread; MessageBox("jetzt");
oder so:
CWinThread* vgl_thread = AfxBeginThread ( MASTER_scan_img, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL ); HANDLE hthread = vgl_thread->m_hThread; vgl_thread->ResumeThread(); WaitForSingleObject (hthread,INFINITE);
...aber ist ja beides recht fummelig. da drängt sich einem doch die frage auf, ob man nicht besser auf 'CWinThread' verzichtet und gleich winapi 'CreateThread' nimmt...
-
net schrieb:
oder so:
CWinThread* vgl_thread = AfxBeginThread ( MASTER_scan_img, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL ); HANDLE hthread = vgl_thread->m_hThread; vgl_thread->ResumeThread(); WaitForSingleObject (hthread,INFINITE);
NEIN! Das ist ja auch wieder falsch!!!
Du hast hier wieder das "m_bAutoDelete" vergessen...
Das "kopieren" des Thread-Handles bringt Dir nichts, wenn dieses Handle im automatisch ausgeführeten Destruktor innerhalb des Threads, geschlossen wird.
Somit würde dann dein Wait auf ein falsches Handle warten (was vermutlich auch als Fehlercode zurückkommt).
Das Wait wird AFAIK nie mit "WAIT_OBJECT_0" zurückkommen...PS: CWinThread hat schon seine Berechtigung, wenn Du z.B. mit Messages arbeiten willst... dann ist es mit CWinThread recht einfach.
-
Jochen Kalmbach schrieb:
NEIN! Das ist ja auch wieder falsch!!!
wieso? der thread wird 'suspended' erzeugt. dann kann er das 'CWinThread' objekt doch nicht löschen...
-
Du kopierst Dir doch nur das Handle (also den Wert)!
Wenn Du den Thread wieder laufen lässt, und er z.B. sich gleich beendet, dann hat er das Handle schon via CloseHandle geschlossen, bevor Du noch die Wait-Funktion aufruefen kannst. Der Zahlenwert in Deinem Handle mag ja noch stimmen, aber das Handle ist ungültig!Also ein kopieren eines Handlewertes hilft Dir nicht viel, wenn das Handle geschlossen wird...
Ok, Du könntest
HANDLE hthread = DuplicateHandle(..., vgl_thread->m_hThread, ...);
verwenden... aber jetzt wird es so langsam umständlich...
-
Jochen Kalmbach schrieb:
Wenn Du den Thread wieder laufen lässt, und er z.B. sich gleich beendet, dann hat er das Handle schon via CloseHandle geschlossen, bevor Du noch die Wait-Funktion aufruefen kannst.
das kann bei deinem code aber auch passieren...
-
net schrieb:
Jochen Kalmbach schrieb:
Wenn Du den Thread wieder laufen lässt, und er z.B. sich gleich beendet, dann hat er das Handle schon via CloseHandle geschlossen, bevor Du noch die Wait-Funktion aufruefen kannst.
das kann bei deinem code aber auch passieren...
Warum? Er setzt doch auto-delete auf false.
-
???????? schrieb:
Warum? Er setzt doch auto-delete auf false.
stimmt. hast recht
also sorgt 'autodelete' nicht nur dafür, dass der 'CWinThread' gelöscht wird, sondern macht auch noch ein 'CloseHandle' (musses ja auch).
insofern scheint jochens variante doch die einzig gute zu sein...
-
net schrieb:
insofern scheint jochens variante doch die einzig gute zu sein...
-
Jochen Kalmbach schrieb:
net schrieb:
insofern scheint jochens variante doch die einzig gute zu sein...
Wie gut, dass ich den Einwurf noch gemacht habe, damit Du diesen Auftritt bekommst <gd&rvvf>...