Eine Thread-Klasse erstellen
-
Hallo!
ich hätte gern eine klasse die ich wie bei java als thread starten kann. aber ohne mfc oder externe andere libs (z.b. boost). reines winapi.
z.b:
class MyThread { public: HANDLE h; bool laufe; MyThread() { h=CreateThread(..); // Thread erzeugen } ~MyThread() { CloseHandle(h); } public void beendeThread() { // laufe auf false, damit thread beendet wird laufe=false; } static void CALLBACK ThreadFunc() { // initialisieren ... laufe=true; while (laufe) { // arbeiten } // deinitialisieren } };ist das so in etwa möglich? wie kann ich von der ThreadFunc auf die membervariable laufe zugreifen??
thx
sn0b
-
Wegen dem Zugriff auf die Attribute: übergib deiner ThreadFunc einfach nen this-Zeiger.
-
MSDN schrieb:
CloseHandle
Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, then close all handles to the thread.
-
danke! aber wie mach ich das? das übergeben des this zeigers??
das das CloseHandle() den thread nicht zu macht ist mir auch schon aufgefallen.
deswegen möchte ich ja laufe auf false setzen damit er selber ausgeht.... kann man das so machen??
-
[cpp]
class MyThread {
public:
HANDLE h;
bool laufe;MyThread() {
h=CreateThread(ThreadFuncProxy,..., this, ...);
// Thread erzeugen, "this" als PVOID ThreadParameter rübergeben
}virtual ~MyThread()
{
beendeThread(); // Thread muß beendet sein, BEVOR
CloseHandle(h);
}/// thread bescheid sagen, daß er sich demnächst beenden soll.
/// virtual, da du das u.u. anders - z.B. mit einem Event - lösen mußt
/// Design-Regel: darf beliebig oft aufgerufen werden, ohne das
/// was schlimmes passiert
virtual void sendeBeendeThread() {
laufe=false;
// Warten das Thread beendet ist:
WaitForSingleObject(h, INFINITE);
}/// beende thread. Wirklich. Kommt erst zurück wenn thread nicht mehr
virtual void beendeThread()
{
sendeBeendeThread();
// Warten das Thread beendet ist:
WaitForSingleObject(h, INFINITE);
// statt dessen evtl. Wait mit timeout + TerminateThread falls nicht von allein
}
/// hier drin alles...
virtual unsigned Run()
{
// initialisieren ...
laufe=true;while (laufe) {
// arbeiten
}// deinitialisieren
}protected:
*static unsigned CALLBACK ThreadFuncProxy(PVOID threadParam)
{
MyThread * instance = (MyThread ) threadParam;
return instance->Run();
}
};
[/cpp]so in etwa...
Kommt halt darauf an, welche weiteren Funktionen der Win32 - Threads du zugänglich machen willst.
-
SUPER! Vielen Dank!! Genauso hab ich mir das vorgestellt!!!

ciao
sn0b
-
Wenn du in deinem Programm Funktionen des Laufzeitsystems verwendest genügt CreateThread() nicht mehr, du solltest in diesem Fall besser _beginthreadex() verwenden.
mfg JJ
-
Moin,
ich probeir mich auch gerade an der Threadprogrammierung iner Klasse, bzw. allgemein an der Threadprogrammierung und scheitere

Ich hab mein Code eigentlich genauso gehalten, wie in dem Beispiel hier. Jeodhc bekomme ich folgenden Fehler:error C2664: 'CreateThread' : Konvertierung des Parameters 1 von 'unsigned int (void *)' in 'struct _SECURITY_ATTRIBUTES *' nicht moeglich
Ist die Parameterreihenfolge so korrekt, wie sie hier im CreateThread angegeben ist ? Was sind die anderen Parameter ?
Die ThreadFuncProxy habe ich nur in der .h Datei als static deklariert, wie in dem Beispiel. Habe ich irgendwas vergessen ?

the-FoX
-
Ist die Parameterreihenfolge so korrekt, wie sie hier im CreateThread angegeben ist ?
Nö.
(denk ich mal)Mußt Du in MSDN gucken
-
was muss da genau übergeben werden:
h=CreateThread(ThreadFuncProxy,..., this, ...);this pointer von was? was sonst noch?
cu
-
this pointer von thread-klasse.