DataObjects() not Thread-safe !?
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: DataObjects() not Thread-safe !?
Ich muß gestehen, das ich die Web-Version der NG nicht mag. Unübersichtlich, sperrig zu bedienen, grottenlangsam.
Aber klar, immer noch besser als garnichts. Ich mach das aber auch immer über meinen Thunderbird. Das klappt inzwischen ganz gut.
Jan
Aber klar, immer noch besser als garnichts. Ich mach das aber auch immer über meinen Thunderbird. Das klappt inzwischen ganz gut.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: DataObjects() not Thread-safe !?
Hallo
irgendetwas scheint mit den DataObjects() doch nicht zu stimmen. Meist geht ja die neuzuweisung eines solchen nach dem neuladen einer DLL wie ich weiter oben schrieb.
Oft ergibt sich aber auch "Interne Datenstructuren zerstört"
oSessionData := nil
oSessionData := Dataobject():new() --> Hier knallts, Thread abgebrochen. Danach kann kein Thread diese Zeile mehr ausführen bezw. an die oSessionData Public Variable ein neues Object zuweisen. Nach Neustart läufts erneut.
Gruss Carlo
irgendetwas scheint mit den DataObjects() doch nicht zu stimmen. Meist geht ja die neuzuweisung eines solchen nach dem neuladen einer DLL wie ich weiter oben schrieb.
Oft ergibt sich aber auch "Interne Datenstructuren zerstört"
oSessionData := nil
oSessionData := Dataobject():new() --> Hier knallts, Thread abgebrochen. Danach kann kein Thread diese Zeile mehr ausführen bezw. an die oSessionData Public Variable ein neues Object zuweisen. Nach Neustart läufts erneut.
Gruss Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: DataObjects() not Thread-safe !?
Hallo Carlo,
die Meldung kenn ich leider auch zur Genüge, zum Glück mit abnehmender Tendez. Aber bislang noch nie im Zusammenhang mit DataObjects.
Jan
die Meldung kenn ich leider auch zur Genüge, zum Glück mit abnehmender Tendez. Aber bislang noch nie im Zusammenhang mit DataObjects.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: DataObjects() not Thread-safe !?
Guten Morgen
benutzt jemand DataObjects erfolgreich Lesend und Schreiben in mehreren Threads?
Alle im laufe des Programmablaufs wechselnden Daten habe ich in Datenbanken verfrachtet. Und dann Ruhe gehabt.
Viele Angaben die sich nie ändern und häufig benutzt werden halte ich noch immer in einem Dataobject vor.
Seit einiger Zeit habe massenhaft abgestorbene Threads beim Zugriff auf DataObjects.
In diesen Fällen lässt sich die EXE dann nicht mehr beenden. Mit Taskmanager kann "Prozess beenden" gewählt werden, das schliesst das Programmfenster der Prozess der EXE bleibt aber bestehen und kann nur durch einen Neustart des Rechners "gekillt" werden.
Hat AGP doch recht mit seiner Aussage dass die DataObjects nicht Threadsave sind?
Cu Carlo
benutzt jemand DataObjects erfolgreich Lesend und Schreiben in mehreren Threads?
Alle im laufe des Programmablaufs wechselnden Daten habe ich in Datenbanken verfrachtet. Und dann Ruhe gehabt.
Viele Angaben die sich nie ändern und häufig benutzt werden halte ich noch immer in einem Dataobject vor.
Seit einiger Zeit habe massenhaft abgestorbene Threads beim Zugriff auf DataObjects.
In diesen Fällen lässt sich die EXE dann nicht mehr beenden. Mit Taskmanager kann "Prozess beenden" gewählt werden, das schliesst das Programmfenster der Prozess der EXE bleibt aber bestehen und kann nur durch einen Neustart des Rechners "gekillt" werden.
Hat AGP doch recht mit seiner Aussage dass die DataObjects nicht Threadsave sind?
Cu Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: DataObjects() not Thread-safe !?
Moin Carlo,
ich arbeite in verschiedenen Projekten teilweise intensiv mit Threads. Und mit DataObjects sowieso. Und hatte bislang noch keinerlei Probleme mit dieser Zusammenstellung.
Jan
ich arbeite in verschiedenen Projekten teilweise intensiv mit Threads. Und mit DataObjects sowieso. Und hatte bislang noch keinerlei Probleme mit dieser Zusammenstellung.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: DataObjects() not Thread-safe !?
Hallo Jan
hast du die DataObjects dann lokal in einem Thread oder benutzt du ein globales DataObject lesend und schreiben gleichzeitig aus MEHREREN Threads?
Cu Carlo
hast du die DataObjects dann lokal in einem Thread oder benutzt du ein globales DataObject lesend und schreiben gleichzeitig aus MEHREREN Threads?
Cu Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: DataObjects() not Thread-safe !?
Hallo Carlo,
bislang nur lokale DataObjects. Ein PUBLIC möchte ich mal später einführen für programmweite Vorgaben. So weit bin ich aber noch nicht.
Hast Du das Problem mit lokalen oder systemweiten DataObjects?
Jan
bislang nur lokale DataObjects. Ein PUBLIC möchte ich mal später einführen für programmweite Vorgaben. So weit bin ich aber noch nicht.
Hast Du das Problem mit lokalen oder systemweiten DataObjects?
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: DataObjects() not Thread-safe !?
Wenn man nur lesend auf eine Public / private zugreift, sollte das auch aus Threads funktionieren,
aber niemals sind die dafür gedacht automatisch konkurierende Schreibzugriffe auszuhalten, das gilt auch für DataObjects.
Um das zu gewährleisten müsste man Sperrmechanismen einführen, die Geschwindigkeit kosten würden (ähnlich DBF exclusive gegen shared geöffnet ...).
Wenn an sowas machen will, muss man sich eine Klasse schreiben, die die Zugriffe hintereinander legt, siehe dazu
SYNC
Declares a method which is synchronized across any number of threads
aber niemals sind die dafür gedacht automatisch konkurierende Schreibzugriffe auszuhalten, das gilt auch für DataObjects.
Um das zu gewährleisten müsste man Sperrmechanismen einführen, die Geschwindigkeit kosten würden (ähnlich DBF exclusive gegen shared geöffnet ...).
Wenn an sowas machen will, muss man sich eine Klasse schreiben, die die Zugriffe hintereinander legt, siehe dazu
SYNC
Declares a method which is synchronized across any number of threads
Gruß
Hubert
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: DataObjects() not Thread-safe !?
Hallo Jan
mein Problem ist mit systemweiten Dataobjects in einer Public Var.
Beim Anlegen des Objects schreibe ich alles benötigte rein, danach LESE ich nur noch.
Ich bin jetzt am umschreiben, mache aus dem DataObject eine Klasse mit Klassen Vars und teste erneut.
Gruss Carlo
mein Problem ist mit systemweiten Dataobjects in einer Public Var.
Beim Anlegen des Objects schreibe ich alles benötigte rein, danach LESE ich nur noch.
Ich bin jetzt am umschreiben, mache aus dem DataObject eine Klasse mit Klassen Vars und teste erneut.
Gruss Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: DataObjects() not Thread-safe !?
Sind Publics nicht Thread-Local ?
Ich nutze für solche Aufgaben eine Funktion mit STATIC Variable, bei einfachen Strings ist es einfach, aber es sollte auch bei Objekten gehen, da diese ja immer per Referenz übergeben werden ...
Code: Alles auswählen
*-----------------------------------------------------------------------------
Function DatenVerzeichnis(cDatenVerz)
static cDatVerz := NIL
do case
case cDatenVerz = NIL .and. cDatVerz = NIL // einmal init
cDatVerz := ProgVerzeichnis()
case ! IsNil(cDatenVerz)
cDatVerz := cDatenVerz // Plausi fehlt noch
if ! empty(cDatVerz) .and. right(cDatVerz,1) # "\"
cDatVerz += "\"
endif
if substr(cDatVerz,2,2) # ":\" .and. left(cDatVerz,2) # "\\" // kein Laufwerkspfad und kein UNC angegeben,
cDatVerz := ProgVerzeichnis()+cDatVerz // dann ProgVerz vorstellen.
endif
endcase
return cDatVerz
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9388
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 362 Mal
- Kontaktdaten:
Re: DataObjects() not Thread-safe !?
Nein, PUBLICs sind global und in allen Threads sichtbar.
Und ich bin mir sicher, dass hier ein ganz anderes Problem vorliegt als eine vermeintlich fehlende Thread-Sicherheit von DataObjects.
Und ich bin mir sicher, dass hier ein ganz anderes Problem vorliegt als eine vermeintlich fehlende Thread-Sicherheit von DataObjects.
Herzlich,
Tom
Tom
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: DataObjects() not Thread-safe !?
Hallo Tom
Irgendwo muss ich ja mal was ändern um weiterzukommen.
Gruss Carlo
Ja, nur welches? Hättest du dazu auch einen Tip?Und ich bin mir sicher, dass hier ein ganz anderes Problem vorliegt
Irgendwo muss ich ja mal was ändern um weiterzukommen.
Gruss Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9388
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 362 Mal
- Kontaktdaten:
Re: DataObjects() not Thread-safe !?
Hallo, Carlo.
Zum Verständnis.
Du erzeugst globale DataObjects. Dann gibt es von Dir erzeugte Xbase-DLLs, die zur Laufzeit geladen werden, vermutlich in einem Serverkontext. Bis dahin geht alles fein. In diesen DLLs werden die DataObjects u.U. manipuliert, also ergänzt. Jetzt tritt eine Änderung ein, die das Rekompilieren der DLLs auslöst, und danach sind die DataObjects weg? oder defekt? oder wieder auf dem vorigen Stand? Ist das irgendwie das, was Dich umtreibt?
Zum Verständnis.
Du erzeugst globale DataObjects. Dann gibt es von Dir erzeugte Xbase-DLLs, die zur Laufzeit geladen werden, vermutlich in einem Serverkontext. Bis dahin geht alles fein. In diesen DLLs werden die DataObjects u.U. manipuliert, also ergänzt. Jetzt tritt eine Änderung ein, die das Rekompilieren der DLLs auslöst, und danach sind die DataObjects weg? oder defekt? oder wieder auf dem vorigen Stand? Ist das irgendwie das, was Dich umtreibt?
Herzlich,
Tom
Tom
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: DataObjects() not Thread-safe !?
Hallo Tom
die Sache mit den Xbase-DLL's verwende ich nur zum Entwickeln der Ajax-Antworten in einem Serverkontext. Das fertige Programm ist mit allem als eine EXE gelinkt. Ich habe in einem vollständigen Programm keinen Code in eigenen Xbase-DLL's.
Seit ich begonnen habe DataObjects einzusetzen habe ich Fehler die ich früher gar nicht kannte. Und das Ausmass wird immer mehr.
Aktuell löst der Programmstart das erstellen und befüllen des Globalen DataObjects aus. Ist dieses erstellt werden die darin enthaltenen Vars nur noch von den verschiedenen Thread gelesen. z.B. a := oData:www_Path
Das Problem ist nun dass dies eigentlich sehr gut funktioniert sich aber im laufe von Stunden immer mehr Thread's einfach Aufhängen und das Programm nur noch durch einen Neustart des Rechners beendet werden kann. Auf dem Client zeigt sich ein gehängter Thread höchstens durch den Hinweis "Keine Verbindung zum Server" durch erneutes Klicken wird dann einfach ein neuer gestartet und alles läuft weiter ...
Das von dir erwähnte Problem beim Test bezw. Rekompilieren während der Entwicklung habe ich in den Griff bekommen indem ich zuerst das Object zerstöre und dann neu aufbaue.
Gruss Carlo
die Sache mit den Xbase-DLL's verwende ich nur zum Entwickeln der Ajax-Antworten in einem Serverkontext. Das fertige Programm ist mit allem als eine EXE gelinkt. Ich habe in einem vollständigen Programm keinen Code in eigenen Xbase-DLL's.
Seit ich begonnen habe DataObjects einzusetzen habe ich Fehler die ich früher gar nicht kannte. Und das Ausmass wird immer mehr.
Aktuell löst der Programmstart das erstellen und befüllen des Globalen DataObjects aus. Ist dieses erstellt werden die darin enthaltenen Vars nur noch von den verschiedenen Thread gelesen. z.B. a := oData:www_Path
Das Problem ist nun dass dies eigentlich sehr gut funktioniert sich aber im laufe von Stunden immer mehr Thread's einfach Aufhängen und das Programm nur noch durch einen Neustart des Rechners beendet werden kann. Auf dem Client zeigt sich ein gehängter Thread höchstens durch den Hinweis "Keine Verbindung zum Server" durch erneutes Klicken wird dann einfach ein neuer gestartet und alles läuft weiter ...
Das von dir erwähnte Problem beim Test bezw. Rekompilieren während der Entwicklung habe ich in den Griff bekommen indem ich zuerst das Object zerstöre und dann neu aufbaue.
Gruss Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo