Timer bleibt einfach stehen.

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
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.

Beitrag von satmax »

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.
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
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.

Beitrag von satmax »

Ich habe jetzt den Timer mal testweise durch
nEvent := AppEvent(@mp1,@mp2,@oXbp,pub_oIniSetting:nTimerEvent)
...
CASE nEvent == xbe_None
CheckWatchdogTimer(oAppDlg)
ersetzt. Mal sehen was passiert.
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
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.

Beitrag von satmax »

Der Fehler blieb, ist aber nun gefunden:

// 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
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. :)
Gruß
Markus
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: Timer bleibt einfach stehen.

Beitrag von AUGE_OHR »

satmax hat geschrieben:Hier ein Auszug aus der Methode goToEnd()
siehe dir mal o:setMarked() an ...

Code: Alles auswählen

METHOD goToEnd(oMLE)
LOCAL nLen := Len( oMLE:getData() )
   oMLE:setMarked({nLen+1,nLen+1})
RETURN self
gruss by OHR
Jimmy
Benutzeravatar
satmax
1000 working lines a day
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.

Beitrag von satmax »

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...
Gruß
Markus
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: Timer bleibt einfach stehen.

Beitrag von AUGE_OHR »

satmax hat geschrieben:Kurz angetestet, nein, das klappt nicht. Es wird nicht gescrollt.
hm ... ich benutze es wenn ich am Ende eines Memo "weiter schreiben" will.
satmax hat geschrieben:Es ist halt einfach nur gemein wenn so eine Methode ein Programm zum Stillstand bringt...
Ja ... mit dem GUI Thread, welcher auf der selben CPU läuft, erlebt man solche Probleme das dann die ganze Xbase++ Applikation "steht"
gruss by OHR
Jimmy
Antworten