Klassen Variable verliert Inhalt
Moderator: Moderatoren
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2513
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Klassen Variable verliert Inhalt
Guten Morgen
ich jage zur Zeit einen merkwürdigen Fehler.
Während längerer Berechnungen in denen das Xbase Programm den zugehörigen CPU Kern voll auslastet kommt es ab und zu
dazu dass eine Klassenvariable plötzlich nicht mehr das zugewiesene Objekt enthält sondern nur noch den Wert NIL
Was dann dann die Berechnung beendet.
Weiss jemand was das sein könnte?
ich jage zur Zeit einen merkwürdigen Fehler.
Während längerer Berechnungen in denen das Xbase Programm den zugehörigen CPU Kern voll auslastet kommt es ab und zu
dazu dass eine Klassenvariable plötzlich nicht mehr das zugewiesene Objekt enthält sondern nur noch den Wert NIL
Was dann dann die Berechnung beendet.
Weiss jemand was das sein könnte?
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9361
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Klassen Variable verliert Inhalt
Objekte sind in anderen Variablen immer nur als Referenzen verfügbar. Wenn anderswo das Objekt manipuliert - z.B. auch geNILt - wird, ist es auch aus der Objektvariablen verschwunden.
Herzlich,
Tom
Tom
-
- 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: Klassen Variable verliert Inhalt
Hallo Tom
genau das ist das Problem, die Variable wird eigentlich nirgendwo geNILt. Aber ich führe nochmals einen neuen Code-Review durch ....
genau das ist das Problem, die Variable wird eigentlich nirgendwo geNILt. Aber ich führe nochmals einen neuen Code-Review durch ....
Valar Morghulis
Gruss Carlo
Gruss Carlo
-
- 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: Klassen Variable verliert Inhalt
Momentan scheint es so dass mit gezielt eingebauten Pausen das Problem nicht auftritt wenn die Pausen so gewählt werden dass der verwendete CPU-Kern nicht über ca. 80% belastet wird.
Merkwürdig!
Merkwürdig!
Valar Morghulis
Gruss Carlo
Gruss Carlo
-
- 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: Klassen Variable verliert Inhalt
Gelöst.
Ganz ohne Anpassungen am eigentlichen Code oder an den Funktionen.
Die Lösung hinterlässt jedoch grosse Fragen und arge Zweifel ......
Ganz ohne Anpassungen am eigentlichen Code oder an den Funktionen.
Die Lösung hinterlässt jedoch grosse Fragen und arge Zweifel ......
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9361
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Klassen Variable verliert Inhalt
Prozesspriorität? Virenscannerausnahme? Was war die Lösung?
Herzlich,
Tom
Tom
-
- 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: Klassen Variable verliert Inhalt
Nachtrag:
das wars leider auch nicht.
Das was bis jetzt hilft sind Pausen einzubauen.
Ich verstehe es nicht!!
das wars leider auch nicht.
Das was bis jetzt hilft sind Pausen einzubauen.
Ich verstehe es nicht!!
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Frank Grossheinrich
- Rekursionen-Architekt
- Beiträge: 142
- Registriert: Fr, 31. Mär 2017 15:06
- Wohnort: Eschborn
- Hat sich bedankt: 5 Mal
- Danksagung erhalten: 81 Mal
- Kontaktdaten:
Re: Klassen Variable verliert Inhalt
Tach Ramses,
... weil es sich so ungewöhnlich anhört ...
Code-Review abgeschlossen? Wirklich nicht/nirgends geNILt?
Leitest du von der Klasse (deren Klassenvariable sich seltsam verhält) ab?
Gibt es/verwendst du Casts zu dieser Klassenvariablen?
Was für ein Objekt steckt in der Klassenvariablen? Hat sich dieses Objekt pulverisiert?
Das sind so Fragen, die mir in den Kopf kommen.
Denn, was du beschreibst - gebe ich gerne zu - kann und darf nicht sein.
Gruß
Frank
... weil es sich so ungewöhnlich anhört ...
Code-Review abgeschlossen? Wirklich nicht/nirgends geNILt?
Leitest du von der Klasse (deren Klassenvariable sich seltsam verhält) ab?
Gibt es/verwendst du Casts zu dieser Klassenvariablen?
Was für ein Objekt steckt in der Klassenvariablen? Hat sich dieses Objekt pulverisiert?
Das sind so Fragen, die mir in den Kopf kommen.
Denn, was du beschreibst - gebe ich gerne zu - kann und darf nicht sein.
Gruß
Frank
We love Xbase++, and you?
-
- 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: Klassen Variable verliert Inhalt
Hallo Frank
Danke der Nachfrage.
Ja. Der Code - Review habe ich ohne Resultate abeschlossen.
In dem Objekt das ab und zu genilt erscheint ist der Vater aller Töchterobjekte.
Es gibt keine Casts und es sind alles in Xbase geschriebene Klassen.
Meist lassen sich Total-Crash's durch testen der Variable ::oParent auf Objekt abfangen, selten jedoch nicht und obwohl auch
auf isMemberVar() getestet gibts doch einen Totalcrash. Siehe Beispiel.
Wenn ich die CPU-Belastung des Kerns der für das verwendete Programms verwendet wird mit Pausen sleep() auf ca. 80% halte tritt das Problem auch bei tagelangem Rechnen nicht auf. Ohne diese Sleeps kann es Minuten bis mehrere Stunden bis zum Crash dauern ......
Aus purer Ratlosigkeit habe ich seit langer Zeit auch noch die alte 1.9.355 Version ausgegraben. Aber auch damit besteht das Problem
Danke der Nachfrage.
Ja. Der Code - Review habe ich ohne Resultate abeschlossen.
In dem Objekt das ab und zu genilt erscheint ist der Vater aller Töchterobjekte.
Es gibt keine Casts und es sind alles in Xbase geschriebene Klassen.
Meist lassen sich Total-Crash's durch testen der Variable ::oParent auf Objekt abfangen, selten jedoch nicht und obwohl auch
auf isMemberVar() getestet gibts doch einen Totalcrash. Siehe Beispiel.
Code: Alles auswählen
if valtype(::oParent) = "O"
if IsMemberVar( ::oParent, "cFileName" ) .and. IsMemberVar( self, "cFileName" )
::cFileName := ::oParent:cFileName
// Fehlermeldung über Errorblock -> tritt selten auf
// ERROR BASE/2266
// Empfänger der Nachrichten ist kein Objekt: cFileName
endif
else
// Fehlermeldung an User und ProgrammEnde --> tritt öfters auf
endif
Aus purer Ratlosigkeit habe ich seit langer Zeit auch noch die alte 1.9.355 Version ausgegraben. Aber auch damit besteht das Problem
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Frank Grossheinrich
- Rekursionen-Architekt
- Beiträge: 142
- Registriert: Fr, 31. Mär 2017 15:06
- Wohnort: Eschborn
- Hat sich bedankt: 5 Mal
- Danksagung erhalten: 81 Mal
- Kontaktdaten:
Re: Klassen Variable verliert Inhalt
Hallo Carlo,
weitere Fragen ...
- ist das "alter" Code, der seit Jahren läuft und plötzlich das Absturzverhalten zeigt oder neuer Code?
- Multi-Threading im Spiel (was ich vermute)?
- kann ich mal ein xpperror.log sehen? An welcher Stelle knallt es?
- ich gehe davaon aus, dass :oParent diese von dir angesprochene Klassenvariable ist!?
- wann und wie oft wird :oParent geschrieben? Also der Inhalt verändert?
- wie ist :Parent deklariert?
- sind die Methoden, in der der Fehler passiert/in der die Klassenvariable beschrieben wird besonders geschützt? Attribute?
Das Folgende sind nur Mutmaßungen von mir, ... wenn die Klassenvariable in verschiedenen Threads verwendet wird und alle lustig darauf rumhämmern, das aber nicht abgesichert ist, dann könnte ich mir so ein Verhalten vorstellen. Denn z.B. dein Code ist ja keine abgeschottete Transaktion. Du prüfst zwar, ob ::oParent ein Objekt ist, aber eine Schrecksekunde später kann es das schon nicht mehr sein. Soll heißen, dass zwischen Zeile 1 und 4 deines Code viel passieren kann in einem anderen Thread??? So könnte ich mir auch erklären, dass Sleeps das Verhalten ändert. Denn damit wird die Wahrscheinlichkeit, dass irgend etwas zwischen deine Zeile 1 und 4 "reinhüpft" geringer, mit Glück nichtig.
In aller Regel sind solche nicht-deterministischen Probleme Timing Probleme.
Ich möchte eigentlich auf das SYNC Attribut von Methoden hinaus ... kann es so etwas sein? Bzw. helfen?
Konnte ich mich ein bisschen erklären?
Grüße
Frank
weitere Fragen ...
- ist das "alter" Code, der seit Jahren läuft und plötzlich das Absturzverhalten zeigt oder neuer Code?
- Multi-Threading im Spiel (was ich vermute)?
- kann ich mal ein xpperror.log sehen? An welcher Stelle knallt es?
- ich gehe davaon aus, dass :oParent diese von dir angesprochene Klassenvariable ist!?
- wann und wie oft wird :oParent geschrieben? Also der Inhalt verändert?
- wie ist :Parent deklariert?
- sind die Methoden, in der der Fehler passiert/in der die Klassenvariable beschrieben wird besonders geschützt? Attribute?
Das Folgende sind nur Mutmaßungen von mir, ... wenn die Klassenvariable in verschiedenen Threads verwendet wird und alle lustig darauf rumhämmern, das aber nicht abgesichert ist, dann könnte ich mir so ein Verhalten vorstellen. Denn z.B. dein Code ist ja keine abgeschottete Transaktion. Du prüfst zwar, ob ::oParent ein Objekt ist, aber eine Schrecksekunde später kann es das schon nicht mehr sein. Soll heißen, dass zwischen Zeile 1 und 4 deines Code viel passieren kann in einem anderen Thread??? So könnte ich mir auch erklären, dass Sleeps das Verhalten ändert. Denn damit wird die Wahrscheinlichkeit, dass irgend etwas zwischen deine Zeile 1 und 4 "reinhüpft" geringer, mit Glück nichtig.
In aller Regel sind solche nicht-deterministischen Probleme Timing Probleme.
Ich möchte eigentlich auf das SYNC Attribut von Methoden hinaus ... kann es so etwas sein? Bzw. helfen?
Konnte ich mich ein bisschen erklären?
Grüße
Frank
We love Xbase++, and you?
-
- 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: Klassen Variable verliert Inhalt
Hallo Frank
- es ist gewachsener Code.
Auf das Absturzverhalten wurde bis jetzt einfach nicht getestet.
Neuerdings gehört vor dem Rollout auch ein Pen-Test zur Qualitätsprüfung dazu den der Code nun nicht mehr besteht.
- Ja es ist ein Multi-Threading Programm.
- Der Fehler tritt mit Verweis auf die Zeile ::cFileName := ::oParent:cFileName auf geloggt wird neben dem Callstack nur
ERROR BASE/2266
Empfänger der Nachrichten ist kein Objekt: cFileName
- in ::oParent wird nur in SYNC Methoden der Vaterklasse geschrieben. Alle Töchter lesen diese nur noch. (rechte seite von := )
aber die Töchter können durchwegs noch unterwegs sein wenn im Vater Thread ::oParent geändert wird....
ohjeeee, ohjeeeee könnte dies die Ursache sein????? Das ändern von ::oParent im Vater Thread ändert diesen gleichzeitig auch in allen
Variablen der Töchter die diesen zugewiesen bekommen haben?
- in ::oParent wird über die Sync Methode sehr viel geschrieben
- ::oParent ist als EXPORTED: VAR deklariert
- Die Methode die ::oParent liest ist nicht geschützt.
Auf das Objekt und die Member prüfe ich erst seit ich wegen der Qualitätsprüfung auf der "Problemsuche" bin.
- es ist gewachsener Code.
Auf das Absturzverhalten wurde bis jetzt einfach nicht getestet.
Neuerdings gehört vor dem Rollout auch ein Pen-Test zur Qualitätsprüfung dazu den der Code nun nicht mehr besteht.
- Ja es ist ein Multi-Threading Programm.
- Der Fehler tritt mit Verweis auf die Zeile ::cFileName := ::oParent:cFileName auf geloggt wird neben dem Callstack nur
ERROR BASE/2266
Empfänger der Nachrichten ist kein Objekt: cFileName
- in ::oParent wird nur in SYNC Methoden der Vaterklasse geschrieben. Alle Töchter lesen diese nur noch. (rechte seite von := )
aber die Töchter können durchwegs noch unterwegs sein wenn im Vater Thread ::oParent geändert wird....
ohjeeee, ohjeeeee könnte dies die Ursache sein????? Das ändern von ::oParent im Vater Thread ändert diesen gleichzeitig auch in allen
Variablen der Töchter die diesen zugewiesen bekommen haben?
- in ::oParent wird über die Sync Methode sehr viel geschrieben
- ::oParent ist als EXPORTED: VAR deklariert
- Die Methode die ::oParent liest ist nicht geschützt.
Auf das Objekt und die Member prüfe ich erst seit ich wegen der Qualitätsprüfung auf der "Problemsuche" bin.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Klassen Variable verliert Inhalt
Ihr redet hier aber schon von immer von ein und demselben Object, welches dann in versch. Threads benutzt wird? Nicht sowas:
Das ist komplett gekapselt.
Ihr redet von sowas:
Code: Alles auswählen
thread1:
local oStatic := xbpStatic():new()…
oStatic:cargo := "blabla"
thread2:
local oStatic := xbpStatic():new()…
oStatic:cargo := "hallo"
Ihr redet von sowas:
Code: Alles auswählen
local oStatic := xbpStatic():new(), oThread1 := Thread():new(, "Thread1"), oThread2 := Thread():new(, "Thread2")
oStatic:cargo := "blabla"
oThread1:start("functionirgendwas", oStatic)
oThread2:start("functionirgendwas", oStatic)
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
-
- 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: Klassen Variable verliert Inhalt
Hallo Frank
nach einigen Anpassungen bewältigt der Code nun auch die hohen Anforderungen des Pen-Tests.
Es war wie du vermutet hast. Das lesen der Objekt Variable erfolgt jetzt auch nur noch über eine Sync Methode der Parentklasse
und das Problem ist beseitigt.
DANKE für den Tip.
Hallo Werner
Ja es ist ein Objekte auf dass aus mehreren Threads zugegriffen wird.
nach einigen Anpassungen bewältigt der Code nun auch die hohen Anforderungen des Pen-Tests.
Es war wie du vermutet hast. Das lesen der Objekt Variable erfolgt jetzt auch nur noch über eine Sync Methode der Parentklasse
und das Problem ist beseitigt.
DANKE für den Tip.
Hallo Werner
Ja es ist ein Objekte auf dass aus mehreren Threads zugegriffen wird.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Frank Grossheinrich
- Rekursionen-Architekt
- Beiträge: 142
- Registriert: Fr, 31. Mär 2017 15:06
- Wohnort: Eschborn
- Hat sich bedankt: 5 Mal
- Danksagung erhalten: 81 Mal
- Kontaktdaten:
Re: Klassen Variable verliert Inhalt
Hallo Carlo,
Danke für die Rückmeldung.
Ich hoffe, dass sich am Status nichts mehr geändert hat und der Code immer noch sicher läuft ...
Du verwendest die Klassenvariable wie eine Art PUBLIC (wenn ich das richtig verstanden habe).
Und ja, man sollte das Schreiben .AND. das Lesen "schützen".
Das erste Beispiel bei SYNC sagt es eigentlich:
// A class for managing a queue is programmed in this example.
// The queue is realized using an array that can be accessed
// from multiple threads via the methods :put() and :get().
// Four threads are started in the Main() procedure which are
// accessing the queue. If either method :put() or :get() is
// declared without the SYNC attribute, a runtime error will
// occur sooner or later because the Queue object will fall
// into an inconsistent state.
Nun denn, Gefahr erkannt, Gefahr gebannt.
Das, was du beschrieben hattest, hatte mich einfach stutzig gemacht. Solche elementaren Fehler gibt es in Xbase++ einfach nicht mehr. Dann würden zu viele sehr komplexe Anwendungen nicht mehr laufen.
Gruß
Frank
Danke für die Rückmeldung.
Ich hoffe, dass sich am Status nichts mehr geändert hat und der Code immer noch sicher läuft ...
Du verwendest die Klassenvariable wie eine Art PUBLIC (wenn ich das richtig verstanden habe).
Und ja, man sollte das Schreiben .AND. das Lesen "schützen".
Das erste Beispiel bei SYNC sagt es eigentlich:
// A class for managing a queue is programmed in this example.
// The queue is realized using an array that can be accessed
// from multiple threads via the methods :put() and :get().
// Four threads are started in the Main() procedure which are
// accessing the queue. If either method :put() or :get() is
// declared without the SYNC attribute, a runtime error will
// occur sooner or later because the Queue object will fall
// into an inconsistent state.
Nun denn, Gefahr erkannt, Gefahr gebannt.
Das, was du beschrieben hattest, hatte mich einfach stutzig gemacht. Solche elementaren Fehler gibt es in Xbase++ einfach nicht mehr. Dann würden zu viele sehr komplexe Anwendungen nicht mehr laufen.
Gruß
Frank
We love Xbase++, and you?
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Klassen Variable verliert Inhalt
Servus Frank,
besagtes Beispiel ist leider nicht sehr zielführend. Erstens läuft es auch ohne sync-Methoden ohne Fehler durch und 2. ist es m. M. n. nicht logisch aufgebaut:
Da werden 4 Thread gestartet, die per :get() Werte aus der Queue holen. Soweit so gut. Aber beim Start der 4 Threads sind noch keine Werte in der Queue und das sorgt dafür, dass es zu keinem Runtime-Fehler kommt.
Damit erscheint erstmal NIL am Bildschirm.
Erst danach wird eine Schleife mit 40000 Durchgängen gestartet, die die Queue befüllt. Vermutlich stehen in dieser Zeit sogar die 4 Threads? Erst danach läuft das Runterzählen geregelt ab. Es liefert aber trotz sync-Methoden jedesmal ein anderes Ergebnis und landet nicht - wie vermutlich ursprünglich gewollt - sauber bei 0.
Was ihr damit zeigen möchtet, dürfte klar sein, aber das Beispiel tuts nicht richtig.
Ist nicht böse gemeint, nur wenn andere sich aufgrund dieses Threads das Beispiel anschauen - wie ich jetzt zum 1. Male - sich nicht wundern.
besagtes Beispiel ist leider nicht sehr zielführend. Erstens läuft es auch ohne sync-Methoden ohne Fehler durch und 2. ist es m. M. n. nicht logisch aufgebaut:
Da werden 4 Thread gestartet, die per :get() Werte aus der Queue holen. Soweit so gut. Aber beim Start der 4 Threads sind noch keine Werte in der Queue und das
Code: Alles auswählen
IF ::nCount > 0
Damit erscheint erstmal NIL am Bildschirm.
Erst danach wird eine Schleife mit 40000 Durchgängen gestartet, die die Queue befüllt. Vermutlich stehen in dieser Zeit sogar die 4 Threads? Erst danach läuft das Runterzählen geregelt ab. Es liefert aber trotz sync-Methoden jedesmal ein anderes Ergebnis und landet nicht - wie vermutlich ursprünglich gewollt - sauber bei 0.
Was ihr damit zeigen möchtet, dürfte klar sein, aber das Beispiel tuts nicht richtig.
Ist nicht böse gemeint, nur wenn andere sich aufgrund dieses Threads das Beispiel anschauen - wie ich jetzt zum 1. Male - sich nicht wundern.
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>