HANDLE von QThread für WaitForSingleObject

Alles rund um die Programmierung mit Qt
Antworten
diddely
Beiträge: 49
Registriert: 9. Juli 2008 16:19

HANDLE von QThread für WaitForSingleObject

Beitrag von diddely »

Hi,

ich bräuchte für die obige Win32 Funktion einen HANDLE von meinem QThread.

Code: Alles auswählen

QThread::currentThreadId
In der Doku steht, dass diese Funktion für interne Sachen genutzt wird.
Kann mir das jemand bestätigen?

Ich möchte, dass WaitForSingleObject auf meinen Thread wartet.

Gruß
diddely
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Wenn ich mich richtig erinner, kann man die windows threadID mit WaitForSingleObject benutzen, um zu warten bis der thread sich beendet hat ...

wenn du sowas nutzen willst, solltest du QTThread nicht verwenden. QTThread ist da viel komfortabler, liefert sogar events fuers beenden.

Schauen ob nen thread sich beendet hat, tut man aber immer von einem anderen thread aus. also mit QTThread::currentThreadId (definition mal genauer anschauen, die is statisch ! also quasi global, und kein von der instanz abhaengiges member !!! ) bekommst immer die ID von dem thread wo grad bist ... zum warten aufs beenden irgendwie ungünstig !
Die ThreadId von dem QTThread, den als variable irgendwie vor dir hasst, kannst nicht direkt abfragen !

ansonsten, will man auf beliebige dinge warten, braucht man keine threadID eigentlich ... sondern WaitForSingleObject will nen Handle von nem WIndows Event. das koennt man sich selber bauen.
besser aber, wenn man die QTThread klasse soweiso benutzt, dann auch die QT-Syncmechanismen verwenden ...
QWaitCondition waere da was entsprechendes !
Ich möchte, dass WaitForSingleObject auf meinen Thread wartet.
QThread schickt das signal finished() und terminated() ... quasi als letztes bevor er sich verabschieded, das kannst doch nutzen !

Ciao ...
diddely
Beiträge: 49
Registriert: 9. Juli 2008 16:19

Beitrag von diddely »

ich verwende schon WaitForMultipleObjects in Verbindung mit meiner RS232 Kommunikation.
Ich habe ein Thread,das auf Daten (RS232) wartet.

Wenn nun aber jemand das Programm beendet , soll "WaitForSingleObject" auch signalisiert werden, damit es nicht unnötig weiter auf Daten wartet und blockt.

Deswegen wollte ich auch das Thread Handle mit übergeben.
Damit "WaitForMultipleObjects" entweder bei "Thread Exit" oder "Daten da" entblockiert wird.

Ich habe es jetzt so gelöst:

Habe ein Win32-Event-Objekt erzeugt, welches an meine WaitForMultipleObject übergeben wird.
Beim zerstören des Threads rufe ich "SetEvent" auf und entblockiere so die Wartefunktion.


Würde ich an mein Thread-Handle rankommen, bräuchte ich das manuelle "SetEvent" nicht mehr.

Edit:
Werde mir mal finished() & .... genauer anschauen.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

theorethisch koenntest du beim loslaufen deines threads, also bevor er in das wait laeuft, mittels currentThreadId() die threadid abfragen ... und deinem steuerthread ueber ne variable mitteilen.
ob das ding das wirkliche threadhandle ist, hab ich keine ahnung.

elegant waer das aber auch ned ...
Ich habe ein Thread,das auf Daten (RS232) wartet.

Wenn nun aber jemand das Programm beendet , soll "WaitForSingleObject" auch signalisiert werden, damit es nicht unnötig weiter auf Daten wartet und blockt.
Was ich bei deinem aufbau ned ganz verstehe:
Der Thread an der seriellen Schnittstelle laeuft doch in ner schleife, richtig ? Der pollt doch die daten da ? Oder bekommst du events von da ?
Iss aber eigentlich egal ... die daten die ankommen bereitest du auf und laesst den anderen thread die daten abholen ??? und steuerst das ueber nen event ? das heist der andere thread wartet (blockiert) bis daten da sind ? Das ist aber ned dein Mainthread oder ?

Ciao ...
Antworten