Seite 1 von 1

Thread abschießen möglich - wie?

Verfasst: Sa, 08. Jul 2017 17:11
von DelUser01
Habe da ein dummes Problem...

Es läuft ein Thread welcher über eine Fremd-DLL mit DllCall() auf Daten wartet. Beim Aufruf kann ich kein Timeout o.ä angeben. Wenn das Dateineinlesen beendet ist wartet die Funktion bis zum nächsten Event. Wenn jetzt aber nichts mehr kommt, dann bleibt die mit DllCall aufgerufene Funktion und damit der Thread quasi hängen.

Mit QUIT kann er von Xbase++ schon beendet werde - ich möchte das aber ohne QUIT machen.

Vermutlich sehe ich den Wald vor lauter Bäumen nicht - aber es geht mit wie dem Thread - ich hänge fest.

Kann man das lösen?

Re: Thread abschießen möglich - wie?

Verfasst: Sa, 08. Jul 2017 17:17
von AUGE_OHR
hi,

wie rufst du den Thread auf ?
was macht der DLL Aufruf ?
wieso "wartest" du in einem Thread ?

gewöhnlich wird ein Thread mit o:setInterval(NIL) beendet (aber nicht wenn er in einer Schleife "wartet")

Re: Thread abschießen möglich - wie?

Verfasst: Sa, 08. Jul 2017 17:26
von DelUser01
Der Thread hört permanent einen TAPI-Kanal ab.
Verschiedene Ursachen können aber verantwortlich dafür sein, dass auf dem Kanal nichts mehr kommt.
Die aufgrufene Funktion wartet auf den nächsten Event - und es kommt eben keiner mehr...

Es ist keine Standard MS-TAPI.

Ergänzung:
Vermutlich ist das so wie wenn ich Sleep() verwende - da geht ja auch (fast) nichts mehr.

Re: Thread abschießen möglich - wie?

Verfasst: Sa, 08. Jul 2017 17:57
von AUGE_OHR
es geht doch wohl (nur) um die Schleife in einem Thread wo du nicht raus kommst ?

Code: Alles auswählen

DO WHILE .NOT. lExit
jetzt muss man nur lExit an den Thread bei Aufruf übergeben um es später in "Main" zu ändern.

---

ich weiss ja nicht auf was du "wartest" aber wenn du auf einen (Notify) Event "wartest" solltest du es native versuchen da du in die Windows Event Loop eingreifst.

Re: Thread abschießen möglich - wie?

Verfasst: Sa, 08. Jul 2017 19:56
von DelUser01
Eine Schleife ist natürlich schon beteiligt - das wäre ja einfach.
Hier hängt das Zeugs:

Code: Alles auswählen

nRet := DllCall( GsCtiDll() , ;
DLL_CDECL + DLL_CALLMODE_COPY , ;
"mtapiGetMessage" , ;
GsCtiHandleVar() ,;
@cMsg , ;
dnCTIgetmsglen )
Wenn alles normal abläuft meldet sich DllCall() immer wieder zurück.
In verschiedenen Fehlersituationen gehen mir im Moment die letzten 1-2 übertragenen Zeilen verloren. Wenn ich die auch noch haben will riskiere ich den Hänger.

Re: Thread abschießen möglich - wie?

Verfasst: Sa, 08. Jul 2017 20:18
von AUGE_OHR
hi,

nun wird mir langsam klar was dein Problem ist : es läuft alles im Xbase++ Thread

in ot4xb gibt es :

Code: Alles auswählen

DELEGATED_EVAL(bBlock, ... params ... ) - Eval a codeblock at the GUI thread

Re: Thread abschießen möglich - wie?

Verfasst: Sa, 08. Jul 2017 20:37
von DelUser01
Danke Jimmy - schaue ich mir an.

Re: Thread abschießen möglich - wie?

Verfasst: Sa, 08. Jul 2017 21:25
von AUGE_OHR
vermutlich handelt es sich um das selbe Problem mit TAPI wie in diesem Thread
viewtopic.php?f=27&t=164

grob gesagt geht es darum das zum DLL Aufruf ein "Callback" Slot gehört wo man die Windows Events abfangen kann.

Re: Thread abschießen möglich - wie?

Verfasst: Sa, 08. Jul 2017 21:56
von Werner_Bayern
AUGE_OHR hat geschrieben: Sa, 08. Jul 2017 21:25 grob gesagt geht es darum das zum DLL Aufruf ein "Callback" Slot gehört wo man die Windows Events abfangen kann.
Was jetzt wunderbar mit dem neuen EXTERN Befehl funktioniert!
Siehe 2. Beispiel in der Hilfe (Ermittlung aller sichtbaren Fenster-Titel des Desktops).