DataObjects() not Thread-safe !?

Hier können die Unterschiede, Fehler und Probleme zwischen den Versionen bzw. bei der Migration besprochen werden

Moderator: Moderatoren

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: DataObjects() not Thread-safe !?

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: DataObjects() not Thread-safe !?

Beitrag von ramses »

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

Gruss Carlo
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: DataObjects() not Thread-safe !?

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: DataObjects() not Thread-safe !?

Beitrag von ramses »

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

Gruss Carlo
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: DataObjects() not Thread-safe !?

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: DataObjects() not Thread-safe !?

Beitrag von ramses »

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

Gruss Carlo
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: DataObjects() not Thread-safe !?

Beitrag von Jan »

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
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: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DataObjects() not Thread-safe !?

Beitrag von brandelh »

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

Gruß
Hubert
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: DataObjects() not Thread-safe !?

Beitrag von ramses »

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
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: DataObjects() not Thread-safe !?

Beitrag von brandelh »

ramses hat geschrieben: Mo, 23. Jul 2018 9:43 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.
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
wenn man ein Objekt zurück bekommt, sollte das immer eine gültige Referenz auf das Original sein, Zuweisungen sollten also möglich sein, Lesen auf jeden Fall.
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: DataObjects() not Thread-safe !?

Beitrag von Tom »

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.
Herzlich,
Tom
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: DataObjects() not Thread-safe !?

Beitrag von brandelh »

Beim Lesen kann ich es mir auch nicht vorstellen :!:
Gruß
Hubert
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: DataObjects() not Thread-safe !?

Beitrag von ramses »

Hallo Tom
Und ich bin mir sicher, dass hier ein ganz anderes Problem vorliegt
Ja, nur welches? Hättest du dazu auch einen Tip?

Irgendwo muss ich ja mal was ändern um weiterzukommen.

Gruss Carlo
Valar Morghulis

Gruss Carlo
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: DataObjects() not Thread-safe !?

Beitrag von Tom »

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?
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: DataObjects() not Thread-safe !?

Beitrag von ramses »

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

Gruss Carlo
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: DataObjects() not Thread-safe !?

Beitrag von ramses »

Hallo

DataObjekte aus der App entfernt und damit die Probleme auch.

Gruss Carlo
Valar Morghulis

Gruss Carlo
Antworten

Zurück zu „Unterschiede Version 1.9 <-> 2.0“