Vorteile von CWinThread
-
Hallo erstmal,
dies ist mein erster beitrag in diesem forum. Und zu diesem anlass möchte ich einmal alle recht herzlich grüssen. Dies forum ist wirklich klasse, und gerade jetzt hat es mir bei einem Problem sehr gut geholfen ...
Aber nun zu meinem thema:
Ich habe in den FAQ zum thema threads überwiegend die nutzung von CWinThread als vorschlag gefunden. Ich muss zugeben, ich progge seit ca 4 Jahren mit winapi und mfc, aber den CWinThread hab ich noch nie gefunden *schäm*.
Aber ich frage mich, was der CWinThread so tolles kann, ausser nen riesen overhead mitzuschleppen. Oft brauch man doch nur ein ganz kleines gerüst, also einfach eine funktion, die eine endlosschleife aufnehmen kann.
Ich habe mir für diesen Zweck mal eine klasse MiniThread geschrieben und mich würde mal eure Meinung dazu interessieren:Kleine erklährung vorweg:
Das einzige, was man tun muss, ist eine Klasse von MiniThread abzuleiten und die virtuelle Funktion Run zu implementieren. Der Benutzer muss dann nurnoch ein Objekt dieser Klasser erzeugen und MiniThread::Start() ausführen, und schon läuft der code in Run in einem neuen Thread ab.
Zusätzlich hab ich noch ne kleine Samaphore eingebaut, mit der man das ganzer per Lock und Unlock Threadsafe machen kann.MiniThread.h
#ifndef _MINI_THREAD_H__INCLUDED_ #define _MINI_THREAD_H__INCLUDED_ #include <process.h> #include <afxmt.h> typedef unsigned (__stdcall *exec_t)(void *); class MiniThread { private: static unsigned __stdcall Execute(MiniThread *th); CSemaphore m_csSemaphore; protected: virtual unsigned Run()=0; HANDLE m_hThread; DWORD m_dwThreadID; void Unlock(); void Lock(); public: MiniThread(); virtual ~MiniThread(); void Start(); }; #endif //ifndef _MINI_THREAD_H__INCLUDED_
MiniThread.cpp
#include "stdafx.h" #include "MiniThread.h" MiniThread::MiniThread() { m_dwThreadID = 0; m_hThread = (HANDLE)_beginthreadex(NULL, 0, (exec_t)&Execute, (void *)this, CREATE_SUSPENDED, (unsigned *)&m_dwThreadID); } MiniThread::~MiniThread() { TerminateThread(m_hThread,0); WaitForSingleObject(m_hThread, INFINITE); CloseHandle(m_hThread); } unsigned __stdcall MiniThread::Execute(MiniThread *th) { return th->Run(); } void MiniThread::Start() { ResumeThread(m_hThread); } void MiniThread::Lock() { m_csSemaphore.Lock(); } void MiniThread::Unlock() { m_csSemaphore.Unlock(); }
also, wie gesagt ... was haltet ihr davon, und warum schwört ihr so auf CWinThread ?
grüsse
-
Das hier so viele CWinThread Fans sind war mir neu :). Das ist doch im Prinzip auch nichts anderes eine Kapselung von Funktionen zum Umgang mit Threads. Deine kleine Klasse macht ja im Prinzip nichts anderes (nur mal kurz überflogen).
Der Bereich Multithreading ist einer der wenigen, wo ich eigentlich komplett auf MFC (CWinThread) verzichte.
Wahrscheinlich war der Hinweis auf CWinThread nur, um das Rad nicht nochmal zu erfinden.
-
CSemaphore??? Ist das MFC? Dann gehört es nicht nach WinAPI!
-
Original erstellt von WebFritzi:
CSemaphore??? Ist das MFC? Dann gehört es nicht nach WinAPI!jupp, sorry ... is mir nach dem posten auch aufgefallen, hab aber bis jetzt den edit-button noch nicht gefunden ... ich bitte um vergebung
Allerdings, wenn man die Semaphore rausschmeisst oder sie mit CreateSemaphore(...) realisiert würds schon wieder hierher gehören...
[edit]
ahhh ... wer suchet, der findet...
[/edit]grüsse
[ Dieser Beitrag wurde am 13.03.2003 um 13:22 Uhr von soUrcerer editiert. ]
[ Dieser Beitrag wurde am 13.03.2003 um 13:23 Uhr von soUrcerer editiert. ]
-
Da ist ja nun so ein schönes Thread-Beisiel bei beginthread in der MSDN. Wieso hast Du dieses nicht umgesetzt?
Stichwort: Beendigung eines mit beginthread erstellten Threads
-
diese lösung hab ich von der common c++ lib abgeguckt ...
benutze die eigentlich nur, weil sie so schön schlank ist ...
aber ich werd mir das beispiel mal in der MSDN anschaun.so habs mal grad angeschaut: ja... da wird _endthread() zum threadende benutzt ... jetzt hab ich mal die commonc++ sources durchsucht und bin auf kein vorkommen von _endthread() gestossen ... die lösen das auch ausschliesslich mit TerminateProcess() ....
hab auch noch keine "schlimmen auswirkungen" mit den terminierten Threads gehabt ... was meint ihr kann da passieren ... und warum macht die commonc++ auch keine _endthread() ?!?
[edit]
hm ... TerminateThread ist schon zimlich "böse" ... hab ich grad mal nachgelesen... ich gebe zu, keine elegante lösung
aber was denken sich die jungs von der commonc++ dabei?[/edit]
grüsse
[ Dieser Beitrag wurde am 14.03.2003 um 14:13 Uhr von soUrcerer editiert. ]
-
_endthread/ex sind Funktionen, die dem Thread sofort und auf der Stelle das Licht ausknipsen. Destruktoren werden beispielsweise nicht mehr aufgerufen. Angeforderte Ressourcen, die noch auf Freigabe warten (z.B. File-Handles), bleiben vorhanden. Am Besten ist's, wenn Du den Thread einfach auslaufen lässt oder eben irgendwo ein einfaches return einfügst.
TerminateProcess beendet keine Threads, sondern, wie der Name schon sagt, den kompletten Process. Diese Funktion gehört zu den Funktionen, die man nur in allergrößter Not verwendet. Das ist nun wirklich gnadenloses abwürgen. Du fährst doch bestimmt auch den Rechner runter bevor Du den Stecker ziehst, oder?
[edit] Ich sehe gerade TerminateThread in Deinem Code. Wenn Du das öfter ausführst, geht Dir irgendwann die Puste aus. Dabei wird nun wirklich gar nichts mehr freigegeben. Sogar der Thread-Stack bleibt Dir erhalten. TerminateThread ist ebenfalls eine Funktion, die nur in allergrößter Not aufgerufen werden darf. [/edit]
[ Dieser Beitrag wurde am 14.03.2003 um 14:14 Uhr von -King- editiert. ]
-
meine natürlich nicht TerminateProcess() sonder TerminateThread(), hat aber die gleichen auswirkungen wie TerminateProcess(), nur eben ausschliesslich auf den Thread.
(weise nochmal auf mein edit im vorigen beitrag hin)
grüsse