Dbcloseall() im Thread

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Dbcloseall() im Thread

Beitrag von Manfred »

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.
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!!
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: Dbcloseall() im Thread

Beitrag von Wolfgang Ciriack »

Wo hast du denn gelauscht, wäre ja interessant, ob da was dran ist.
Viele Grüße
Wolfgang
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Dbcloseall() im Thread

Beitrag von brandelh »

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.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Dbcloseall() im Thread

Beitrag von Manfred »

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!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Dbcloseall() im Thread

Beitrag von brandelh »

es gab schon seit längerer Zeit immer mal wieder Berichte hier, dass dbCloseAll() solche Probleme meldet und warum kein Sleep ;-)
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Dbcloseall() im Thread

Beitrag von Manfred »

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?
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!!
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: Dbcloseall() im Thread

Beitrag von Wolfgang Ciriack »

Was passiert denn eigentlich, wenn man ein

Code: Alles auswählen

oThread:atEnd:={|| dbcloseall(),....} 
eingerichtet hat, und das aufrufende Programm schließt, wird der Codeblock atEnd noch ausgeführt, bevor das Programm endet, oder nicht ?
Viele Grüße
Wolfgang
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Dbcloseall() im Thread

Beitrag von brandelh »

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 ...
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.
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.
Eventuell also die Warteschleife maximal auf einige Sekunden begrenzen ...
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Dbcloseall() im Thread

Beitrag von brandelh »

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 !
Gruß
Hubert
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: Dbcloseall() im Thread

Beitrag von Tom »

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
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Dbcloseall() im Thread

Beitrag von ramses »

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
Valar Morghulis

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

Re: Dbcloseall() im Thread

Beitrag von brandelh »

Ich denke es kommt darauf an was man will und wenn es geht ...
Gruß
Hubert
Antworten