Dbcloseall() im Thread
Moderator: Moderatoren
- Manfred
- Foren-Administrator
- Beiträge: 21200
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Dbcloseall() im Thread
Hi,
ich habe gerade etwas interessantes gehört. Es wurden in einem Thread mehrere Dbf geöffnet. Diese DBF werden dann per DbCloseAll() geschlossen und direkt danach der Thread über quit verlassen. Das soll zur Folge haben, dass kurz vorher angehängte Datensätze im Index kaputt sind. Wenn man aber vor dem Threadende eine Pause einlegt, dann klappt es.
ich habe gerade etwas interessantes gehört. Es wurden in einem Thread mehrere Dbf geöffnet. Diese DBF werden dann per DbCloseAll() geschlossen und direkt danach der Thread über quit verlassen. Das soll zur Folge haben, dass kurz vorher angehängte Datensätze im Index kaputt sind. Wenn man aber vor dem Threadende eine Pause einlegt, dann klappt es.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2936
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Dbcloseall() im Thread
Wo hast du denn gelauscht, wäre ja interessant, ob da was dran ist.
Viele Grüße
Wolfgang
Wolfgang
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Dbcloseall() im Thread
In den Thread-Beispielen wird ein Thread nicht einfach abgeschossen, sondern man setzt eine Nachricht oder Endebedingung.
Danach wartet man im MAIN Thread, bis die anderen sich selbst beendet haben.
Es ist schon denkbar, dass beim "Abschießen" von außen interne Puffer nicht sauber gelehrt werden.
Danach wartet man im MAIN Thread, bis die anderen sich selbst beendet haben.
Es ist schon denkbar, dass beim "Abschießen" von außen interne Puffer nicht sauber gelehrt werden.
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21200
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: Dbcloseall() im Thread
Es ist anscheinend so. Wenn man die DBF einzeln schließt und ein Sleep(x) vor Thread:quit macht, dann klappt es. Gehört habe ich es von einem XUG Mitglied.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Dbcloseall() im Thread
es gab schon seit längerer Zeit immer mal wieder Berichte hier, dass dbCloseAll() solche Probleme meldet und warum kein Sleep
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21200
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: Dbcloseall() im Thread
OK,
wenn man sich das jetzt im nachhinein auf der Zunge zergehen läßt, dann klingt das schon verständlich. Irgendwie ein Timingproblem. Aber xbase++ soll ja eigentlich (deshalb ist es ja relativ leicht einzusetzen) dem Entwickler solche Überlegungen abnehmen. DbCloseAll() heißt für mich alles dicht. Das diese Funtkion evtl. nicht schnell genug ist, bevor der Thread evtl. gekillt wurde.....
Wobei sich mir jetzt kurz die Frage stellt: Was passiert eigentlich, wenn man in einem thread DBF öffnet und den thread killt, bevor die geschlossen wurden? Hatten wir das schonmal zum Thema im Forum?
wenn man sich das jetzt im nachhinein auf der Zunge zergehen läßt, dann klingt das schon verständlich. Irgendwie ein Timingproblem. Aber xbase++ soll ja eigentlich (deshalb ist es ja relativ leicht einzusetzen) dem Entwickler solche Überlegungen abnehmen. DbCloseAll() heißt für mich alles dicht. Das diese Funtkion evtl. nicht schnell genug ist, bevor der Thread evtl. gekillt wurde.....
Wobei sich mir jetzt kurz die Frage stellt: Was passiert eigentlich, wenn man in einem thread DBF öffnet und den thread killt, bevor die geschlossen wurden? Hatten wir das schonmal zum Thema im Forum?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2936
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Dbcloseall() im Thread
Was passiert denn eigentlich, wenn man ein
eingerichtet hat, und das aufrufende Programm schließt, wird der Codeblock atEnd noch ausgeführt, bevor das Programm endet, oder nicht ?
Code: Alles auswählen
oThread:atEnd:={|| dbcloseall(),....}
Viele Grüße
Wolfgang
Wolfgang
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Dbcloseall() im Thread
Keine Ahnung, das soll man ja eigentlich nicht ... aber probiere es aus
Einfach eine SET ALTERNATE aufmachen und mit ? ThreadID(),time(),"Ich bin hier" dbcloseall() ersetzen und MAIN QUIT aufrufen.
Mal sehen was in der Textdatei ankommt ...
Eventuell also die Warteschleife maximal auf einige Sekunden begrenzen ...
Einfach eine SET ALTERNATE aufmachen und mit ? ThreadID(),time(),"Ich bin hier" dbcloseall() ersetzen und MAIN QUIT aufrufen.
Mal sehen was in der Textdatei ankommt ...
vor dem Quit sollte man eigentlich warten bis alle Threads :active := .f. liefern, aber falls einer davon in einer Endlosschleife hängt, wäre das fatal.Solange ein Thread Programmcode ausführt, hat die Instanzvariable :active den Wert .T. (wahr).
Wenn der Thread beendet ist, wird der Rückgabewert der Funktion, die im neuen Thread ausgeführt wurde, an die Instanzvariable :result zugewiesen.
Eventuell also die Warteschleife maximal auf einige Sekunden begrenzen ...
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Dbcloseall() im Thread
PS: die Workspaces sind ja Thread LOCAL, somit kann dbcloseall() im MAIN keine Dateien im Thread schließen.
Andererseits müsste ein QUIT - laut Definition von Alaska "wir kümmern uns um alles ..." und "Clipper kompatibel" wirklich ALLE Dateien sauber schließen.
Die Betonung liegt auf MÜSSTE !
Andererseits müsste ein QUIT - laut Definition von Alaska "wir kümmern uns um alles ..." und "Clipper kompatibel" wirklich ALLE Dateien sauber schließen.
Die Betonung liegt auf MÜSSTE !
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Dbcloseall() im Thread
Ich habe das DbCloseAll() am Ende aller Threads durch eine eigene Funktion ersetzt, die die WorkSpaceList() abarbeitet, alle Relationen löst (!), alle Scopes löscht, alle Filter löscht und erst dann die Dateien schließt, und zwar einzeln. Damit waren Probleme an dieser Stelle weitgehend verschwunden. Außerdem ignoriere ich im Fehlersystem "Fehler beim Schließen" einfach, protokolliere sie jedoch. Gibt aber keine (mehr).
Herzlich,
Tom
Tom
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2517
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Dbcloseall() im Thread
Wäre es nicht besser den Thread nicht zu beenden sondern nur schlafen zu legen, in einem Threadpool und dann für einen neuen Job ein schlafengelegter Thread mit neuer Aufgabe neu zu starten?
Damit waren bei mir sämtliche Probleme nicht mehr vorhanden.
Gruss
Carlo
Damit waren bei mir sämtliche Probleme nicht mehr vorhanden.
Gruss
Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Dbcloseall() im Thread
Ich denke es kommt darauf an was man will und wenn es geht ...
Gruß
Hubert
Hubert