Thread-Übergreifendes DbCloseAll() [Erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Thread-Übergreifendes DbCloseAll() [Erledigt]

Beitrag von Jan »

Ich habe zwei Threads. In dem Hauptthread werden die dbf geöffnet und gelesen/geschrieben. Je nach dem, was in dem Nebenthread (macht alle 10 Sekunden eine Kontrolle, ob alles OK ist) passiert sollen diese dbf aber geschlossen werden. Nun werden dbf aber natürlich Thread-Lokal geöffnet - wie also bekomme ich das hin, das ich die dbf im Hauptthread schließen kann?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Thread-Übergreifendes DbCloseAll()

Beitrag von brandelh »

du musst signale setzen oder gesharte Variablen benutzen um dem jeweiligen Thread mitzuteilen, dass etwas geschehen soll - und es im richtigen Thread erledigen lassen.
Das ist ähnlich dem Kaffeeautomaten Beispiel bei Threads.

Ob das so sinnvoll ist weiß ich nicht.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Thread-Übergreifendes DbCloseAll()

Beitrag von Tom »

Einfach eine Set-Get-Funktion "CloseData" einführen, die u.a. vom Hauptthread geprüft wird:

Code: Alles auswählen

FUNCTION CloseData(lSet)
STATIC lCloseData := .F.
IF PCount()=1
  lCloseData := lSet
ENDIF
RETURN lCloseData
CloseData() ohne Parameter gibt zurück, ob ein Close ausgeführt werden soll. CloseData(.T.) setzt die Antwort auf ja, CloseData(.F.) setzt sie auf nein. Damit könnte der Haupthread auf die Situation reagieren, dass er plötzlich keine Tabellen mehr hat. Ähliche Set-Get-Funktionen könnten parallel darüber informieren, ob aktuell die Tabellen geöffnet sind oder nicht. Eine PUBLIC könnte das allerdings auch bewerkstelligen.

Ansonsten kann man natürlich auch versuchen, den Zerospace zu verwenden, also über DbRequest() und DbRelease() die Workspaces zwischen den Threads zu verschieben. Ich glaube allerdings nicht, dass Du das in Deinem konkreten Fall verwenden könntest.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Thread-Übergreifendes DbCloseAll()

Beitrag von Jan »

Hallo Hubert und Tom,

das hab ich jetzt mit einer PUBLIC gemacht, die ich im Hauptthread an passender Stelle berücksichtige.

Danke für die Tipps.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten