Der Hauptersatz ist der Timer mit seinem Event.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).
Ersatz für DOS-Int 15h Funkt. 83h (Timer)
- 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)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- 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)
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!
-
- 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)
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 ...
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!
-
- 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)
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.AlterMann hat geschrieben:Es ließ sich prächtig mit Appliation.OnIdle und TBlockSerial.WaitingDataEx lösen.
-Michael
-
- 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)
Ich kann das erst Montags überprüfen, das Programm hab ich in der Firma.mschnell hat geschrieben:Aber vermutlich braucht dein Programm jetzt 100% CPU-Leistung (schau 'mal in den Task-Manager)
-Michael
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!
-
- 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)
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.
-
- 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)
Wann denn genau ? da sollte es eine Doku geben, sonst weiß man nicht was man da tut ....AlterMann hat geschrieben:Die Procedure OnIdle wird ja nicht öfter aufgerufen als sonst auch
-Michael
Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)
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.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.
-
- 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)
Oder, wenn's mehr "realtime" sein soll: TThread.theo hat geschrieben:Abhilfe: TTimer.
-Michael
-
- 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)
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.
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!
-
- 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)
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 ...
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!
Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)
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.
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.
-
- 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)
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-theo hat geschrieben:In einem separaten Thread könnte man im Main-Loop einfach sleepen z.B. sleep(100); //ms.
-Michael
Zuletzt geändert von mschnell am Di 19. Jan 2010, 09:26, insgesamt 2-mal geändert.
-
- 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)
Bitte um weitere Aufklärung ...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?![]()
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
Früher war alles besser. Und aus Holz!
-
- 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)
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
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