Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Für Fragen von Einsteigern und Programmieranfängern...
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6765
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von af0815 »

AlterMann hat geschrieben:Und das was mir heute am meisten abgeht, sind ja eigentlich die Krücken die wir damals als Ersatz für ereignisgesteuerte Programmierung verwendeten: Der direkte Zugriff auf Hardwareinterrupts (Auch weil ich sehr oft nicht weiß, daß es ja Ersatz dafür gibt).
Der Hauptersatz ist der Timer mit seinem Event.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von RSE »

Als ich angefangen habe, war DOS schon nicht mehr sooo aktuell, ich bin dann recht schnell auf Win gewechselt. Unter DOS hab ich nie Interrupts benutzt, sondern immer nur repeat until keypressed. Seit ich nun mit Win programmiere nutze ich den Timer trotzdem nur sehr selten. Er ist eigentlich nur dann vonnöten, wenn man pollen muss oder tatsächlich eine Uhrzeit (Tageszeit) abwarten muss. Das kommt doch aber sehr selten vor, weil es eigentlich für alles entsprechende Events gibt?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von AlterMann »

Nur um das ganze mit einem Feedback abzurunden:

Es ließ sich prächtig mit Appliation.OnIdle und TBlockSerial.WaitingDataEx lösen.
Die Kommunikation funktioniert um nichts schlechter als seinerzeit interruptgesteuert ...
Früher war alles besser. Und aus Holz!

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von mschnell »

AlterMann hat geschrieben:Es ließ sich prächtig mit Appliation.OnIdle und TBlockSerial.WaitingDataEx lösen.
Aber vermutlich braucht dein Programm jetzt 100% CPU-Leistung (schau 'mal in den Task-Manager), das es permanent den Port-Status aktiv pollt und nicht wie früher auf einen Interrupt wartet. Das ist in einem Multritasking System unzulässig, da es alle parallel laufenden Prozesse verlangsamt.

-Michael

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von AlterMann »

mschnell hat geschrieben:Aber vermutlich braucht dein Programm jetzt 100% CPU-Leistung (schau 'mal in den Task-Manager)
-Michael
Ich kann das erst Montags überprüfen, das Programm hab ich in der Firma.
Ich denke aber nicht, daß das so problematisch ist. Die Procedure OnIdle wird ja nicht öfter aufgerufen als sonst auch, und es wird eigentlich nur bei jedem Aufruf geschaut ob ein Zeichen im Buffer der seriellen Schnittstelle wartet. Nur wenn das der Fall ist passiert ein bißchen mehr.

Aber ich schau mir das natürlich am Montag an.
Früher war alles besser. Und aus Holz!

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von mse »

OnIdle wird nur einmal aufgerufen, wenn die event queue leer ist. Auf Linux, wo im Gegensatz zu Windows keine dauernden events gesendet werden, könnte dies zum Stillstand deines Programm führen, bis beispielsweise die Maus bewegt wird.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von mschnell »

AlterMann hat geschrieben:Die Procedure OnIdle wird ja nicht öfter aufgerufen als sonst auch
Wann denn genau ? da sollte es eine Doku geben, sonst weiß man nicht was man da tut ....

-Michael

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von theo »

mse hat geschrieben:OnIdle wird nur einmal aufgerufen, wenn die event queue leer ist. Auf Linux, wo im Gegensatz zu Windows keine dauernden events gesendet werden, könnte dies zum Stillstand deines Programm führen, bis beispielsweise die Maus bewegt wird.
Da hat mse leider recht. OnIdle ist auf Linux nicht für polling geeignet. Leider wird dieses Event auch in gewissen SimpleIPC Demos verwendet, welche dann auf Linux nicht richtig zu funzen scheinen. Abhilfe: TTimer.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von mschnell »

theo hat geschrieben:Abhilfe: TTimer.
Oder, wenn's mehr "realtime" sein soll: TThread.

-Michael

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von AlterMann »

Wie oft OnIdle wirklich aufgerufen wird, kann ich nicht sagen, aber darauf habe ich ja keinen Einfluß genommen.
Auch wenn das dem Muliplattformgedanken hinter Lazarus so gar nicht entsprechen mag, es ist mir eigentlich nicht wichtig ob es auf Linux funktionieren würde, mit Linux hab ich nichts am Hut und ich glaube das wird sich auch nicht so bald ändern.

Das ganze -trotz momentaner Funktionstüchtigkeit- mit TThread zu verwirklichen hab ich ohnedies vor, da ich mich mit TThread vertraut machen möchte und diese Routinen in einer Unit eingebettet sind die ich für verschiedene Projekte brauchen werde.

Bei diesem (ersten) Programm ist mir die CPU-Auslastung nicht wichtig, da es immer nur kurz auf einem Notebook verwendet wird um ein Gerät vor Ort zu programmieren, da muß kein anderes Programm Rechenzeit bekommen, aber das ist natürlich ein Ausnahmefall.
Früher war alles besser. Und aus Holz!

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von AlterMann »

Es ist natürlich so wie Michael vermutet, die Anwendung braucht 100% Systemleistung.

Nur:
Wieso ändert sich das wenn ich TThread verwende?
Das Polling findet dann eben in der Procedure execute statt und läuft unabhängig vom Hauptthread, aber wer hindert den Nebenthread daran, nun seinerseits 100% Rechenzeit zu verschlingen? Ich verstehe immer noch nicht wie das den Hardwareinterrupt ersetzen soll ...
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von theo »

Es geht ja um OnIdle. Das kommt unter Windows offenbar zu oft.
Deshalb hättest du mit einem TTimer mehr Kontrolle. In einem separaten Thread könnte man im Main-Loop einfach sleepen z.B. sleep(100); //ms.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von mschnell »

theo hat geschrieben:In einem separaten Thread könnte man im Main-Loop einfach sleepen z.B. sleep(100); //ms.
Kann man. Ist dann aber immer noch polling (nicht so realtime, verbrät unnötige Rechenzeit). Besser ist es einfach (z.B. von einem CPM-Port) zu lesen, dann bleibt der Thread im Treiber stehen, und braucht überhaupt keine Rechenzeit. Wenn dann ein Zeichen ankommt wird der Thread sofort aktiviert. SAchnelle Reaktionen sollten direkt im Thread passieren (GUI geht da aber nicht) Mit TThread.Synchronzie kann man dann im Mainthread weitermachen, wenn es sinnvoll ist-

-Michael
Zuletzt geändert von mschnell am Di 19. Jan 2010, 09:26, insgesamt 2-mal geändert.

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von AlterMann »

mschnell hat geschrieben:Kann man. Ist dann aber immer noch polling ()nicht so realtime, verbrät unnötige Rechenzeit.
Genau das ist der Punkt, das hätte ich auch gemeint.

Besser ist es einfach (z.B. von einem CPM-Port) zu lesen,

Was ist das?

dann bleibt der Thread im Treiber stehen,

heißt das ich müßte selbst einen Gerätetreiber schreiben? :shock:

und braucht überhaupt keine Rechenzeit. Wenn dann ein Zeichen ankommt wird der Thread sofort aktiviert.

Das wäre ja haargenau wie meine Interrupt Service Routines, aber genau das geht ja anscheinend nicht :?:



-Michaek
Bitte um weitere Aufklärung ...
Früher war alles besser. Und aus Holz!

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von mschnell »

Sorry, Typo. Ich meinte als Beispiel einen COM-Port (Serielle Schnittstelle). Ein TCP/IP-Socket hat dieselbe Eigenschaft (nennt sich "blocking" /Byte Stream).

Den Treiber muss man nur dann selber schreiben, wenn man spezielle Hardware verwendet. Für serielle Schnittstellen und TCP/IP und diverse andere gibt es im System entsprechende Treiber.

Es ist ja dann auch ein Interrupt-Service. Allerdings im Treiber. Im Userland-Code ist das bei Linux und Windows nicht möglich.(OK, es gibt da Workarounds wie IOP (oder so ähnlich) für Linux und Kithara für Windows). da würde ich aber die Finger von lassen.

-Michael

Antworten