Nachrichten abarbeiten

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Nachrichten abarbeiten

Beitrag von UliTs »

Ich habe oft das Problem, dass sich ein xBase-Programm scheinbar aufhängt.
Das passiert, wenn ein Fenster geschlossen wird und anschließend in dem ursprünglichen Fenster weitergearbeitet wird. In diesem Moment wird die folgende Schleife durchlaufen.

Code: Alles auswählen

  WHILE  (nEvent := AppEvent(@mp1,@mp2,@oXbp,1)) <> xbe_None
     oXbp:HandleEvent(nEvent,mp1,mp2)
  END
Wenn ich dann ein anderes Programm (z.B. Total Commander) anklicke und anschließend wieder das xBase-Programm, wird die Schleife sofort beendet und man kann weiter arbeiten ...
Hat jemand eine Idee, woran das liegen könnte?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Nachrichten abarbeiten

Beitrag von georg »

Hallo, Uli -


nein, keine Idee. Aber ein paar Fragen:

Das Dialogfenster, das geschlossen wurde, wurde im gleichen oder einem eigenen Thread bearbeitet?
Hast Du mal versucht, Event und Objekt zu lokalisieren, welche zum "Hängen" führen? (z.B. über den Debugger?)
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Nachrichten abarbeiten

Beitrag von brandelh »

Wird SetAppWindow() verstellt oder zeigt es auf das steuernde Fenster ?
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Nachrichten abarbeiten

Beitrag von georg »

Hallo, Uli -


Nachtrag: bist Du Dir mit Deiner Event-Schleife sicher?

Code: Alles auswählen

WHILE  (nEvent := AppEvent(@mp1,@mp2,@oXbp,1)) <> xbe_None
Wenn kein Event ankommt, weil 1/100 Sekunde ohne Event verstrichen ist, dann würde xbe_None zurückgegeben, und das sollte Deinen Event-Loop beenden. Also kommen Events, die auch verarbeitet werden.

Besteht die Möglichkeit, dass eine Funktion ausgeführt wird, die immer wieder das gleiche Event postet?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Nachrichten abarbeiten

Beitrag von UliTs »

Danke für die schnellen Antworten.

Hallo Georg,

läuft in dem gleichen Thread.
Es wird ein Event nach dem anderen abgearbeitet. Ich habe den Eindruck, dass bei der Abarbeitung immer neue Events erzeugt werden und dies durch Wechsel in ein anderes Programm und anschließendem Wechsel zum xBase-Programm zurück unterbrochen wird...

Hallo Hubert,

Ja, SetAppWindow() wird immer wieder verstellt und zeigt auf das aktuelle Fenster ...
Wie kommst Du auf diese Frage?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Nachrichten abarbeiten

Beitrag von georg »

Hallo, Uli -


was vorstellbar wäre: ein SetAppFocus() auf das geschlossene Fenster (das Objekt existiert ja, so lange es referenziert wird), der quasi im Loop läuft. Wenn der Focus auf ein anderes Programm geht (es dürfte egal sein, welches), wird der Focus auf ein Xbase-Part gelegt, das noch funktionsfähig ist, und das Programm kommt aus dem Teufelskreis, äh, Event-Loop raus, der sich immer wieder selbst initiiert.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Nachrichten abarbeiten

Beitrag von brandelh »

Wenn SetAppFocus() auf dem falschen Fenster liegt, erhält dieses den Eingabefocus ohne dass dies ersichtlich sein muss.

Ich habe solche Blockaden erlebt wenn ich zwei Felder mit Plausiprüfung hintereinander hatte.
Die Rückverweisung hat zur Endlosschleife geführt.

Ich frage mich sowieso, warum deine Eventschleife so aussieht ?
Da muss doch noch was außenrum sein ;-)

Gerade beim Verkürzen der Zeilen kann man leicht übersehen worin das eigentliche Problem liegt ;-)
Gruß
Hubert
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Nachrichten abarbeiten

Beitrag von Herbert »

...dann musst du nach all deinen PostAppEvent suchen. Diese stehen in der Regel für Helprequests oder Closebefehle bei Buttons. Könnte es sein, dass du irgendwo so einen Button programmtechnisch aktivierst?
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Nachrichten abarbeiten

Beitrag von AUGE_OHR »

UliTs hat geschrieben:Es wird ein Event nach dem anderen abgearbeitet.
Ich habe den Eindruck, dass bei der Abarbeitung immer neue Events erzeugt werden und dies durch Wechsel in ein anderes Programm und anschließendem Wechsel zum xBase-Programm zurück unterbrochen wird...
ich würde behaupten das du immer noch in Zeile 2 bis ...

IMHO gehört das oXbp:HandleEvent(...) in den OTHERWISE Teil einer DO CASE Abfrage wobei zuerst xbe_None bearbeitet werden sollte.
gruss by OHR
Jimmy
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Nachrichten abarbeiten

Beitrag von UliTs »

Hallo allerseits,

schon einmal Danke für die entgegengebrachte Hilfe!
Jimmy, was meinst Du mit DO CASE und OTHERWISE? Wofür wird das Deiner Meinung nach benötigt?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Nachrichten abarbeiten

Beitrag von brandelh »

Falls das Problem noch besteht, zeig uns doch bitte die komplette Eventloop.
Wenn du dann Bedingung in eine Funktion auslagerst du je Befehl eine Zeile verwendest, kannst du LOGGING einbauen (set alternate to oder mein DebugPrint()) ...
so wirst du schnell sehen was wirklich abläuft und die Lösung ist einfacher.
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Nachrichten abarbeiten

Beitrag von UliTs »

Hallo Hubert,

die Schleife habe ich vollständig im ersten Beitrag abgebildet.
Ich fuerchte, ich kann nicht mehr berichten.
Wenn ich etwas herausbekommen habe, werde ich berichten.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Nachrichten abarbeiten

Beitrag von brandelh »

So wie ich das sehe, wird die Schleife oben maximal 1/100 Sekunden warten, eventuelle Events abarbeiten, wieder warten und bei xbe_None beenden.

Diese Schleife selbst steuert weder den aktuellen Fokus, noch kann Sie die Ursache sein dass das Programm hängt.
Es ist aber keinesfalls gesichert, dass die Schleife nach einer gewissen Zeit tatsächlich beendet wird (im Gegensatz zu meiner Funktion mit ähnlichem Vorhaben).
Denn falls jemand dauernd die Maus bewegt, oder andere Sachen macht, bleibt er in dieser Schleife - ob das ein Problem ist kann ich nicht beurteilen.

Code: Alles auswählen

set console off // bei GUI extrem wichtig !
set alternate to ... / ON
...
? seconds(),"nEventLoop"
WHILE  (nEvent := AppEvent(@mp1,@mp2,@oXbp,1)) <> xbe_None
     ? seconds(),nEvent,mp1,mp2
     oXbp:HandleEvent(nEvent,mp1,mp2)
END
? seconds(),"Ende"
so könnte man dokumentieren was und wie lange in der Schleife geschieht.
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Nachrichten abarbeiten

Beitrag von UliTs »

Hallo Hubert,

danke für den Tipp. Blöderweise komme ich an die Eventschleife nicht dran und kann sie so nicht ändern ...

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
DelUser01

Re: Nachrichten abarbeiten

Beitrag von DelUser01 »

Hallo Uli

Frage: was meinst Du mit "scheinbar" aufhängt?
UliTs hat geschrieben:Ich habe oft das Problem, dass sich ein xBase-Programm scheinbar aufhängt
Hat es sich nun aufgehängt oder reagiert es nach einiger Zeit wieder?

Vielleicht wäre das für Dich ein weiterer Ansatz für Deine Fehlersuche:
Vor Monaten hatte ich das Problem, dass meine Programme nach der Anforderung zum Schließen sich nicht mehr sofort beendeten sondern es teilweise sehr lange dauerte.
Nach einiger Zeit der Fehlersuche bin ich dahintergekommen:
Durch einen Fehler von mir wurden die laufenden Threads nicht mehr gezielt beendet. In diesen Threads wird verschiedenes abgearbeitet und es waren einige DBFs geöffnet. Bis diese Threads beendet/abgeschossen wurden reagierte das Hauptprogramm scheinbar nicht mehr.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Nachrichten abarbeiten

Beitrag von AUGE_OHR »

UliTs hat geschrieben: Blöderweise komme ich an die Eventschleife nicht dran und kann sie so nicht ändern ...
was meinst du damit du kommst nicht ran ? der Source Code ist doch wohl in deinem Besitz, oder ?

sollte es, wie Roland bemerkte, ein offener Thread sein dann könnte man das doch abfragen

Code: Alles auswählen

   aInfo := ThreadInfo( THREADINFO_TID + ;
                        THREADINFO_SYSTHND + ;
                        THREADINFO_FUNCINFO + ;
                        THREADINFO_TOBJ )

   AEVAL( aInfo, { | a | LogText( Var2Char( a ) ) } )
...

PROCEDURE LogText()
LOCAL iMax    := PCOUNT()
LOCAL i
LOCAL cString := ""
LOCAL xValue

   FOR i := 1 TO iMax - 1
      cString += Var2Char( PValue( i ) ) + CHR( 9 )
   NEXT
   cString += Var2Char( PValue( iMax ) )

   SET CONSOLE OFF
   SET ALTER ON
   ? cString
   SET ALTER OFF
   SET CONSOLE ON
RETURN
aber ich frage mich immer noch "was" deine Eventschleife mit xbe_None "so" soll ... :-k
gruss by OHR
Jimmy
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Nachrichten abarbeiten

Beitrag von UliTs »

Es läuft jetzt viel stabiler.
Vermutlich lag es an folgendem: ich arbeite mit modalen Dialogen.
Öffne ich nun einen modalen Dialog aus einem bereits dargestellten modalen Dialog, habe ich bisher nach Darstellung des neuen Dialogs den alten Dialog aus dem Sichtbereich des Desktop geschoben, um so ein "hide()" zu simulieren.
Jetzt schiebe ich erst den bisherigen Dialog aus dem Sichtbereich heraus und öffne anschließend den neuen Dialog. Dann gibt es nach dem Schließen des neuen Dialogs keine Probleme mehr :-) .

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten