Timer bleibt einfach stehen.
Moderator: Moderatoren
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Timer bleibt einfach stehen.
Ich habe ein kleines Tool geschrieben, wo manchmal der Timer einfach stehen bleibt. Klicke ich das Fenster an läuft sofort alles weiter. So lange das Programm nur im Vordergrund ist tritt dieser Fehler bisher nicht auf.
Normal wird der Timer alle 5 Sekunden aufgerufen. Die Ausführungszeit liegt unter 1 Sekunde. Sollte es passieren das die Timerfunktion ein 2x aufgerufen wird, wird die Funktion sofort wieder verlassen.
So erfolgt der Aufruf:
oTimerWatch:=tdTimerEvent(pub_oIniSetting:nTimerEvent /* 5 Sekundne*/,{|| CheckWatchdogTimer(oAppDlg) },.t.)
Es ist auch ein 2. Thread aktiv, eine Windows Callback Function um Windows Nachrichten von anderen Programmen zu empfangen.
Normal wird der Timer alle 5 Sekunden aufgerufen. Die Ausführungszeit liegt unter 1 Sekunde. Sollte es passieren das die Timerfunktion ein 2x aufgerufen wird, wird die Funktion sofort wieder verlassen.
So erfolgt der Aufruf:
oTimerWatch:=tdTimerEvent(pub_oIniSetting:nTimerEvent /* 5 Sekundne*/,{|| CheckWatchdogTimer(oAppDlg) },.t.)
Es ist auch ein 2. Thread aktiv, eine Windows Callback Function um Windows Nachrichten von anderen Programmen zu empfangen.
Gruß
Markus
Markus
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Timer bleibt einfach stehen.
Ich habe jetzt den Timer mal testweise durch
ersetzt. Mal sehen was passiert.nEvent := AppEvent(@mp1,@mp2,@oXbp,pub_oIniSetting:nTimerEvent)
...
CASE nEvent == xbe_None
CheckWatchdogTimer(oAppDlg)
Gruß
Markus
Markus
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Timer bleibt einfach stehen.
Der Fehler blieb, ist aber nun gefunden:
// Auszug aus der Funktion die ein Log am Bildschirm anzeigt:
Hier ein Auszug aus der Methode goToEnd()
Offensichtlich funktioniert ::Keyboard(xbeK_DOWN) nur wenn das Fenster aktiv und im Vordergrund ist...
Habe jetzt meine Funktion etwas abgeändert damit ich ohne oMle:goToEnd() auskomme und nun läuft es wie es soll.
// Auszug aus der Funktion die ein Log am Bildschirm anzeigt:
Code: Alles auswählen
IF oMle== NIL
oMle := tdMle(13,1,6,80,oAppDlg:drawingArea ,.f.,,,,.t.,.t.,.t.,.t.,.f.)
oMle:setData(DToC(Date())+ " " + TIME()+": " +cTxt + CRLF )
ELSE
nLen:= LEN(oMle:GetData())
IF nLen > 4096
oMle:setData(cTxt+ SUBSTR(oMle:GetData(),1,4096-1024) ) // + (nLen-LEN(cTxt)
else
oMle:setData(DToC(Date())+ " " + TIME()+": " +cTxt + CRLF+ oMle:GetData())
ENDIF
// Folgende Zeile wurde aufgerufen um immer am Ende des Logs zu stehen. War das Programm
// im Hintergrund war genau in der Zeile Schluß (TopDown)
oMle:goToEnd() // problem im Hintergrund!!!
Hier ein Auszug aus der Methode goToEnd()
Code: Alles auswählen
******* Move cursor to bottom row
DO WHILE ::lineFromChar() < nTotLines
::Keyboard(xbeK_DOWN)
ENDDO
******* Move cursor to end of line
IF ::editable
postAppEvent(xbeP_Keyboard,xbeK_END,,self)
ENDIF
Habe jetzt meine Funktion etwas abgeändert damit ich ohne oMle:goToEnd() auskomme und nun läuft es wie es soll.
Gruß
Markus
Markus
- AUGE_OHR
- Marvin
- Beiträge: 12903
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 44 Mal
Re: Timer bleibt einfach stehen.
siehe dir mal o:setMarked() an ...satmax hat geschrieben:Hier ein Auszug aus der Methode goToEnd()
Code: Alles auswählen
METHOD goToEnd(oMLE)
LOCAL nLen := Len( oMLE:getData() )
oMLE:setMarked({nLen+1,nLen+1})
RETURN self
gruss by OHR
Jimmy
Jimmy
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Timer bleibt einfach stehen.
Kurz angetestet, nein, das klappt nicht. Es wird nicht gescrollt. Aber ich benötige diese Funktion nicht mehr. Ich habe die Log Anzeige einfach "umgedreht". Das neueste ist nun oben und die älteren Einträge werden unten rausgeschoben.
Es ist halt einfach nur gemein wenn so eine Methode ein Programm zum Stillstand bringt...
Es ist halt einfach nur gemein wenn so eine Methode ein Programm zum Stillstand bringt...
Gruß
Markus
Markus
- AUGE_OHR
- Marvin
- Beiträge: 12903
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 44 Mal
Re: Timer bleibt einfach stehen.
hm ... ich benutze es wenn ich am Ende eines Memo "weiter schreiben" will.satmax hat geschrieben:Kurz angetestet, nein, das klappt nicht. Es wird nicht gescrollt.
Ja ... mit dem GUI Thread, welcher auf der selben CPU läuft, erlebt man solche Probleme das dann die ganze Xbase++ Applikation "steht"satmax hat geschrieben:Es ist halt einfach nur gemein wenn so eine Methode ein Programm zum Stillstand bringt...
gruss by OHR
Jimmy
Jimmy