public Thread

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

public Thread

Beitrag von Wonderer »

Hallo,

ich habe mit MEMVAR eine Variable oThread deklariert. In einer Prozedur im Programm-Ablauf erstelle ich dann ein Thread-Objekt mit PUBLIC.

Wenn ich jetzt das gesamte Programm beende wollte ich abfragen ob Objekt/Variable vorhanden ist zum evtl.Abbrechen des Threads.

Code: Alles auswählen

if oThread <> nil .and. oThread:active
  // do something
  oThread:quit()
endif
Das funktioniert so nicht - ich bekomme eine Fehlermeldung, dass die Variable nicht bekannt ist. :roll:

Muss ich das überhaupt so machen oder kann ich sicher sein, dass keine Threads überbleiben wenn ich dann anderswo QUIT aufrufe?

danke schon mal...
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: public Thread

Beitrag von brandelh »

das Hauptprogramm beendet alle laufenden Threads, aber ob dein Thread dann schon alles erledigt hat ist eine andere Frage.
An der Art der Aufgabe muss man erkennen, man einen Thread einfach abwürgen darf (z.B. die Uhranzeige oben links) oder nicht (z.B. Verbuchen im Hintergrund ...)

...\XPPW32\source\samples\basics\THREAD

hier ist das Beispiel COFFEE.PRG bei dem du sehen kannst wie man Threads gegenseitig warten läßt.
Das Schneckenrennen kann man sicher einfach abwürgen :-)
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: public Thread

Beitrag von Jan »

Mit MEMVAR eine Variable deklarieren? Das funktioniert nicht. Die wird dann bei der ersten Zuweisung automatisch eine Private. Möchtest Du die als PUBLIC haben, mußt Du die explizit als PUBLIC oThread erzeugen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: public Thread

Beitrag von Wolfgang Ciriack »

Und von außen läßt sich ein Thread nicht durch Quit beenden.
Viele Grüße
Wolfgang
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: public Thread

Beitrag von Tom »

Module, die in Threads laufen, werden mit der Programmbeendigung auch beendet. Allerdings sollten die Threadobjekte immer LOCALs sein.

Es empfiehlt sich, die Anzahl der in Threads geöffneten Module einfach mitzuzählen, beispielsweise über eine Set-Get-Funktion:

Code: Alles auswählen

FUNCTION RunningThreads(nSet)
STATIC nThreadsRunning := 0
IF nSet # NIL
  nThreadsRunning += nSet
ENDIF
RETURN nThreadsRunning
RunningThreads() liefert die Anzahl, RunningThreads(1) erhöht um 1, RunningThreads(-1) dekrementiert. Bei Null läuft keiner. Mit dem Erzeugen eines neuen Threads zählt man hoch, wird der Threadcode per RETURN beendet, zählt man runter. Will der Benutzer dann das Programm beenden und es laufen noch Threads, kann man über diesen Zustand informieren. Eine andere Variante wäre die Funktion "ThreadInfo()", deren Ergebnis man auswerten kann.

Man muss das allerdings nicht tun. Wie Hubert schrieb, werden bei Programmbeendigung auch alle Threads beendet. Problematisch kann das nur werden, wenn in Threads DLLs geladen werden. Das kann in diesem Fall dazu führen, dass die EXE oder eine DLL hängenbleibt.
Herzlich,
Tom
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: public Thread

Beitrag von Wonderer »

brandelh hat geschrieben:das Hauptprogramm beendet alle laufenden Threads, aber ob dein Thread dann schon alles erledigt hat ist eine andere Frage.
An der Art der Aufgabe muss man erkennen, man einen Thread einfach abwürgen darf (z.B. die Uhranzeige oben links) oder nicht (z.B. Verbuchen im Hintergrund ...)
Klingt logisch, danke.
hier ist das Beispiel COFFEE.PRG bei dem du sehen kannst wie man Threads gegenseitig warten läßt.
Ok, danke - wait und signal hatte ich schon überflogen im Handbuch.
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: public Thread

Beitrag von Wonderer »

Jan hat geschrieben:Mit MEMVAR eine Variable deklarieren? Das funktioniert nicht. Die wird dann bei der ersten Zuweisung automatisch eine Private.
Aber genau so ist es im Handbuch erklärt - am Start mit MEMVAR deklarieren und dann später mit PUBLIC anlegen - das funktioniert auch,
die Variable ist danach verwendbar in anderen Methoden als die wo die PUBLIC var Anweisung steht.

Wenn ich versuche vor allem Code (nach define) eine PUBLIC Variable anzulegen dann bringt mir der Compiler ne Fehlermeldung die allerdings
keinen sehr hilfreichen Text hat ( Procedure MAIN doesn not end with RETURN )
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: public Thread

Beitrag von Wonderer »

Wolfgang Ciriack hat geschrieben:Und von außen läßt sich ein Thread nicht durch Quit beenden.
Ja danke, das hab ich auch gerade festgestellt - klingt auch ziemlich gut dass man auf Kommunikation und eigene Aktion setzt.. :)
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: public Thread

Beitrag von Wonderer »

Tom hat geschrieben:Module, die in Threads laufen, werden mit der Programmbeendigung auch beendet. Allerdings sollten die Threadobjekte immer LOCALs sein.

Es empfiehlt sich, die Anzahl der in Threads geöffneten Module einfach mitzuzählen <snip...>
Ok, danke für die Funktion.
Man muss das allerdings nicht tun. Wie Hubert schrieb, werden bei Programmbeendigung auch alle Threads beendet. Problematisch kann das nur werden, wenn in Threads DLLs geladen werden. Das kann in diesem Fall dazu führen, dass die EXE oder eine DLL hängenbleibt.
Ah interessant, gut dass ich gefragt hab. :)
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: public Thread

Beitrag von Jan »

Ralf,

eben nicht. Mit MEMVAR oThread sagst Du nur, das es die gibt. Und das Du vor die Variablennamen im Code nicht jedes Mal ein MEMVAR-> setzen mußt. Ob das eine Public oder Private sein wird, erklärtst Du erst durch PUBLIC oThread. Wenn Du das weg läßt, dann wird oThread automatisch als PRIVATE erzeugt.

Du hattest nur geschrieben, das Du oThread als MEMVAR deklariert hast. Aber nicht, als was Du die dann als PUBLIC erzeugt hast. Ich war daher davon ausgegangen, das Du der Meinung warst, durch MEMVAR oThread hättest Du die automatisch als PUBLIC angelegt. DAS allerdings funktioniert so eben nicht.

Sorry, ich hatte oben in meinen vorigen Kommentaren den Begrifff "deklarieren" falsch benutzt. Ich wollte Dich damit nicht irritieren :-D

Jan
Wonderer hat geschrieben:
Jan hat geschrieben:Mit MEMVAR eine Variable deklarieren? Das funktioniert nicht. Die wird dann bei der ersten Zuweisung automatisch eine Private.
Aber genau so ist es im Handbuch erklärt - am Start mit MEMVAR deklarieren und dann später mit PUBLIC anlegen - das funktioniert auch,
die Variable ist danach verwendbar in anderen Methoden als die wo die PUBLIC var Anweisung steht.

Wenn ich versuche vor allem Code (nach define) eine PUBLIC Variable anzulegen dann bringt mir der Compiler ne Fehlermeldung die allerdings
keinen sehr hilfreichen Text hat ( Procedure MAIN doesn not end with RETURN )
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: public Thread

Beitrag von AUGE_OHR »

Jan hat geschrieben:Und das Du vor die Variablennamen im Code nicht jedes Mal ein MEMVAR-> setzen mußt.
ein Tip zum Thema MEMVAR-> http://www.xbaseforum.de/viewtopic.php?f=16&t=8909
gruss by OHR
Jimmy
Antworten