Seite 1 von 1

Nachrichten abarbeiten

Verfasst: Di, 01. Jul 2014 11:50
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

Re: Nachrichten abarbeiten

Verfasst: Di, 01. Jul 2014 12:24
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?)

Re: Nachrichten abarbeiten

Verfasst: Di, 01. Jul 2014 12:29
von brandelh
Wird SetAppWindow() verstellt oder zeigt es auf das steuernde Fenster ?

Re: Nachrichten abarbeiten

Verfasst: Di, 01. Jul 2014 12:44
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?

Re: Nachrichten abarbeiten

Verfasst: Di, 01. Jul 2014 12:52
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

Re: Nachrichten abarbeiten

Verfasst: Di, 01. Jul 2014 12:55
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.

Re: Nachrichten abarbeiten

Verfasst: Di, 01. Jul 2014 13:12
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 ;-)

Re: Nachrichten abarbeiten

Verfasst: Di, 01. Jul 2014 13:59
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?

Re: Nachrichten abarbeiten

Verfasst: Di, 01. Jul 2014 21:26
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.

Re: Nachrichten abarbeiten

Verfasst: Mi, 02. Jul 2014 13:20
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

Re: Nachrichten abarbeiten

Verfasst: Mi, 02. Jul 2014 13:27
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.

Re: Nachrichten abarbeiten

Verfasst: So, 20. Jul 2014 23:22
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

Re: Nachrichten abarbeiten

Verfasst: Mo, 21. Jul 2014 1:25
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.

Re: Nachrichten abarbeiten

Verfasst: Di, 09. Sep 2014 12:44
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

Re: Nachrichten abarbeiten

Verfasst: Di, 09. Sep 2014 22:31
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.

Re: Nachrichten abarbeiten

Verfasst: Mi, 10. Sep 2014 1:12
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

Re: Nachrichten abarbeiten

Verfasst: Di, 16. Sep 2014 13:24
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