Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Thread von ausserhalb beenden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.06.2003, 15:45 Uhr
Dirk22



Hi,

ich habe mir einen Worker-Thread erstellt. Nun möchte ich ihn auch vorzeitig von ausserhalb dieses Threads beenden können. In der MSDN habe ich nur AfxEndThread() gefunden. Doch damit kann man den Thread nur innerhalb des Threads beenden und ich möchte meinen Thread von irgendeiner Funktion aus beenden können.

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.06.2003, 15:48 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hallo,
wenn du den Thread selber startest müsstest du ein CWinThread bzw einfaches HANDLE haben...


C++:
TerminateThread(winthreadVariable->m_hThread,0/*exitcode*/);


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.06.2003, 16:17 Uhr
Dirk22



Vielen vielen Dank für deine Antwort. Das funktioniert wunderbar.

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.06.2003, 16:25 Uhr
virtual
Sexiest Bit alive
(Operator)


Vorsicht! In der MSDN steht aber auch, daß TerminateThread nur in Ausnahmefällen genutzt werden sollte. Ich denke, die saubere Lösung wäre, den Worker mit dem Mainthread mittels eines Events zu synchronisieren und dann ggf. zu beenden.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.06.2003, 16:51 Uhr
Dirk22



Danke für deine Warnung. Ich will ja auch gerne eine saubere Lösung programmieren. Aber ich bin absoluter Anfänger was Threads betrifft und habe von Synchronisation und eigenen Events noch keine Ahnung.
Warum sollte TerminateThread nur in Ausnahmefällen benutzt werden?
Kannst du mir bitte zeigen, wie man es anders macht, oder mir einen guten Link dazugeben, denn mit der Hilfe komme ich leider noch nicht immer ganz klar. Immer wenn ich ein Thema verstanden habe, dann kapiere ich die Hilfe auch und kann sie gut zum Nachschlagen gebrauchen. Aber etwas ganz Neues aus der Hilfe lernen, klappt bei mir bisher leider nur ab und zu gut. Bei Threads hat es auf jeden Fall bisher nicht so gut geklappt.

mfg
Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.06.2003, 17:03 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


das meint virtual:


TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination.


Bis jetzt (ich habe das noch nicht so oft gebraucht) hat das TerminateThread bei mir immer funktioniert, natürlich ist die andere Methode besser ...
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.06.2003, 20:54 Uhr
virtual
Sexiest Bit alive
(Operator)


Das hauptproblem bei TerminateThread ist, daß nicht alle Resourcen korrekt abgeräumt werden. Einerseits werden also Memoryleaks auftreten (fallen erst bei längerem Laufen des Programms auf), oder aber Semaphore werden nicht freigegeben, was im Zweifel im Deadlock endet.

Ich komme eigentlich aus der UNIX Ecke, deshalb sind meine Aussagen bzgl. WIndows API Grundsätzlich mit Vorsicht zu geniesen.

Eine saubere Synchronisations könnte zB so aussehen:

Mittels CreateEvent Erstellst Du eine Event-Semaphore (oder wie das die Jungs von MS auch immer nennen mögen), möglichst in not-signaled State. Mal in der MSDN nachblättern...

Dann Startest Du Deinen Workerthread.
Der Workersthread sollte in Regelmäßigen Abständen prüfen, ob das Event-Semaphore im Signaled state ist und - wenn dem so ist - sich beenden. Ich kann mir vorstellen, daß man das mit WaitForSingleObject hinbekommen kann - Mal in der MSDN nachblättern, insbes. der letzte Parameter, der angibt, wie lange man warten soll.

Im Mainthread setzt Du, wenn Du dich beendest, Die Event-Semaphore auf Signaled State. (SignalEvent oder SetEvent, oder wie auch immer), schau mal in der ... ach - du weisst schon

Danach machst Du ein WaitForSingleObject auf das Threadhandle des Workerthreads, um zu warten, bis der Thread sich gejoint hat. Mag sein,. daß das Windows API da auch elegantere Möglichkeiten bietet, schau mal in der ....
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 23.06.2003 um 20:55 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: