Ersatz für DOS-Int 15h Funkt. 83h (Timer)
-
- 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)
Du meinst also man sollte blockierende Read-Befehle auf dem Port verwenden? Die warten ja dann, bis auf dem Port was ankommt und dann geht´s erst weiter. Was passiert dann eigentlich, wenn das Programm vorher beendet werden soll? Muss dann der Thread "abgeschossen" werden? Hab selbst kaum Ahnung von Threads.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!
Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)
Da kann man nat. Dinge tun, die man sonst nicht tun kann.RSE hat geschrieben:Du meinst also man sollte blockierende Read-Befehle auf dem Port verwenden? Die warten ja dann, bis auf dem Port was ankommt und dann geht´s erst weiter. Was passiert dann eigentlich, wenn das Programm vorher beendet werden soll? Muss dann der Thread "abgeschossen" werden? Hab selbst kaum Ahnung von Threads.
Bspw. kann man einen wartenden TTCPBlockSocket in einem Child-Thread einfach vom Haupt-Thread aus abwürgen afaik.
Wenn das Terminated flag gesetzt ist, wird dann der Thread beendet.
-
- 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)
Leider nein. Der Mainthread kann TThread.Terminate aufrufen oder TThread.Terminated := True setzem , um dem Thread zu sagen, dass er sich beenden soll, indem er auf die Execute - Prozedur verlässt. Leider kann er dass in einem blocking Read nicht tuntheo hat geschrieben:Wenn das Terminated flag gesetzt ist, wird dann der Thread beendet.

-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)
Und genau da hakt's bei mir im Augenblick.mschnell hat geschrieben: Es ist ja dann auch ein Interrupt-Service. Allerdings im Treiber. Im Userland-Code ist das bei Linux und Windows nicht möglich.
Auch wenn ich euch bestimmt schon auf die Nerven gehe, aber das will einfach nicht in meinen Schädel.
Ihr sagt mir - zurecht - ich soll weg von meinen alten Denkmustern, hin zu ereignisgesteuerter Programmierung.
Auch wenn (treiberintern) eine ISR läuft und die empfangenen Zeichen in einen Buffer schreibt, sobald ich (auf Verdacht) jenen Buffer abragen muß ob was drin ist, ist das wieder Pollingbetrieb.

Warum löst der Treiber dann kein Event aus, beim Empfang eines Zeichens?

Der Vorschlag von Theo in der TThreadprocedure den Buffer zu Pollen und mit einem Sleeptimer zu verhindern, daß die TThreadprocedure die ganze Rechenzeit frisst, ist zwar wahrscheinlich das beste was man aus der vorhandenen Situation machen kann, aber befriedigend ist es irgendwie nicht.
Entweder habe ich noch nicht durchschaut wo es hängt oder aber (in diesem speziellen Punkt) hat es einen Rückschritt gegeben.
Ich glaube nämlich sehr wohl, daß der IRQ-Baustein intern verwendet wird, nur habe ich auf Anwendungsebene nix davon ...
Früher war alles besser. Und aus Holz!
- af0815
- Lazarusforum e. V.
- Beiträge: 6764
- 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)
Zwischen Dir und dem I/O Port liegen einige Schichten, die den Zugriff auf die Hardware abstrahieren.AlterMann hat geschrieben: Entweder habe ich noch nicht durchschaut wo es hängt oder aber (in diesem speziellen Punkt) hat es einen Rückschritt gegeben.
Ich glaube nämlich sehr wohl, daß der IRQ-Baustein intern verwendet wird, nur habe ich auf Anwendungsebene nix davon ...
Kurzum bei den 'neuen' Systemen greifst du nicht direkt auf die Hardware durch, sondern auf eine virtuelle. Diese greift dann über den Treiben auf die wirkliche durch.
Bsp. Serielle über USB. Dort greifst du auf den Port zu, das löst einen entsprechenden Softwareinterupt aus, der über den USB Treiber auf den Schnittstellenbaustein das entsprechende Hardwareregister ausliest. Somit greifst du in wirklichkeit auf etwas zu, was es gar nicht gibt und unter DOS etc. gar nicht funktionieren würde.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- 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)
./.
Zuletzt geändert von mschnell am Di 19. Jan 2010, 23:51, insgesamt 1-mal geändert.
-
- 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)
./.
Zuletzt geändert von mschnell am Di 19. Jan 2010, 23:51, insgesamt 1-mal geändert.
-
- 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)
./.
Zuletzt geändert von mschnell am Di 19. Jan 2010, 23:51, insgesamt 1-mal geändert.
-
- 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)
Nein, Der Timeout ist ja einige Sekunden, also viel langsamer als der Zeichenempfang. Gepollt wird nur auf Thread-Abbruch.AlterMann hat geschrieben:ist das wieder Pollingbetrieb.![]()
Events sind eine Angelegenheit der speziellen Programmiersprache viele Sprachen bieten so etwas garnicht. Zwischen Treiber und Programmiersprache und Treiber liegt nach das OS, das alle Programmiersprachgen unterstützen muss. Zwischen OS und Anwenderprogramm gilt der Posix-Standard. Da gibt es, soweit ich weiß, keine Events.AlterMann hat geschrieben:Warum löst der Treiber dann kein Event aus, beim Empfang eines Zeichens?![]()
Genau. Frisst zwar nicht 100% Rechenzeit, aber bei langem, Sleep wird die Datenrate geringer und bei kurzem Sleep die CPU-Last höher. Keine Anpassung an die tatsächliche Datenrate,AlterMann hat geschrieben:Der Vorschlag von Theo in der TThreadprocedure den Buffer zu Pollen und mit einem Sleeptimer zu verhindern, daß die TThreadprocedure die ganze Rechenzeit frisst, ist zwar wahrscheinlich das beste was man aus der vorhandenen Situation machen kann, aber befriedigend ist es irgendwie nicht.
Wie man's nimmt. Standardisierung ist immer ein Rückschritt in Bezug auf Performance und Einfachheit eines bestimmten Problems, aber ein Fortschritt im "globalen"AlterMann hat geschrieben:Entweder habe ich noch nicht durchschaut wo es hängt oder aber (in diesem speziellen Punkt) hat es einen Rückschritt gegeben.
Genau. Wenn jedes Programm sich einzeln um Hardware-Interrupts kümmern müsste, könnten nicht viele zusammen auf einem Rechner laufen (von Portierbarkeit wollen wir gar nicht erst reden <siehe af0815>). So was ist nur im Embedded-Bereich sinnvoll. und auch da zieht Linux immer größere Kreise.AlterMann hat geschrieben:Ich glaube nämlich sehr wohl, daß der IRQ-Baustein intern verwendet wird, nur habe ich auf Anwendungsebene nix davon ...
-Michael
-
- 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)
Polling heißt für mich immermal prüfen, ob eine Bedingung erfüllt ist. Demnach ist das vergeschlagene Vorgehen (Timer stellen und immer nach x Zeit nachsehen, ob Daten vorliegen) für mich Polling. Etwas Event-ähnliches wäre ein blockierender Aufruf, bei dem aber wieder das Problem eines Abbruchs ohne Datenempfang besteht. Regelt man den Abbruch mittels Timeout, dann könnte man das als Polling auf Thread-Abbruch bezeichnen, aber darauf hat sich AlterMann in dem Satz nicht bezogen, wenn ich das richtig interpretieremschnell hat geschrieben:Nein, Der Timeout ist ja einige Sekunden, also viel langsamer als der Zeichenempfang. Gepollt wird nur auf Thread-Abbruch.AlterMann hat geschrieben: ist das wieder Pollingbetrieb.![]()

Was sind dann Windows-Messages, die du z.B. bekommst, wenn eine bestimmte Datei geändert wurde, DirectShow mit der Wiedergabe eines Songs fertig ist, ein Fenster geschlossen werden soll etc.? Für mich sind das alles Events des Betriebssystems.mschnell hat geschrieben:Zwischen OS und Anwenderprogramm gilt der Posix-Standard. Da gibt es, soweit ich weiß, keine Events.
Es ist ja wohl kein Problem den Timer zu benutzen, um herauszufinden, ob überhaupt Daten ankommen und dann den gesamten Puffer auf einmal zu leeren. Falls dann noch weitere Daten zu erwarten sind, kann ein entsprechend an die Puffergröße angepasster Timerwert verwendet werden. Sobald man davon ausgeht, dass hier der Flaschenhals an der Datenübertragungsrate der Hardware liegt und nicht am verarbeitenden Programm, kann man so nicht mehr von verringerter Datenrate reden. Aber das betrifft die ursprüngliche Fragestellung auch nur noch sehr peripher!mschnell hat geschrieben:..., aber bei langem, Sleep wird die Datenrate geringer und bei kurzem Sleep die CPU-Last höher.
Das kann so allgemein wohl nicht stehen bleiben. Bestenfalls kann man sagen, dass es immer ein Problem geben wird, welches sich durch eine Standardisierung verkompliziert. Der Großteil sollte dabei vereinfacht werden, denn das ist der Zweck der Standardisierung. Wie kompliziert ein Problem ist, beinhaltet für mich nämlich auch, wie verständlich die Umsetzung der Lösung ist, und genau da liegt der Vorteil von Standards. Man kennt sie und sie treten überall wieder auf. Der unbekannte Anteil sinkt.mschnell hat geschrieben:Standardisierung ist immer ein Rückschritt in Bezug auf Performance und Einfachheit eines bestimmten Problems
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!
-
- 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)
Das verhindert immer noch eine schnelle Reaktion auf die ankommenden Daten. Z.B. eine Antwort auf einen Datenblock in einem Kommunikations-Protokoll.RSE hat geschrieben:Es ist ja wohl kein Problem den Timer zu benutzen, um herauszufinden, ob überhaupt Daten ankommen und dann den gesamten Puffer auf einmal zu leeren.
--Michael
-
- 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)
Richtig, aber das ist was anderes als die Datenrate. Die Frage ist nun, wie reaktionsschnell muss das ganze sein? Ich glaue nicht, dass die CPU-Last bei 10ms Polling-Intervall auffällt, und das sollte für die meisten Fälle mehr als schnell genug sein. Aber das sollte AlterMann wohl besser wissen.
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)
Genau das hätte ich auch gedacht, die Mausklicks, Tasaturevents ...RSE hat geschrieben: Was sind dann Windows-Messages, die du z.B. bekommst, wenn eine bestimmte Datei geändert wurde, DirectShow mit der Wiedergabe eines Songs fertig ist, ein Fenster geschlossen werden soll etc.? Für mich sind das alles Events des Betriebssystems.
Irgendwie hab ich das Gefühl um die serielle SS pfeift sich keiner mehr, weil die eh ausstirbt (glaubt man) ...
Im konkreten Fall kommt unter Umständen stunden- bis tagelang nichts vom externen Gerät.
Aber wenn dann was kommt schickt das Gerät ein best. Zeichen, wartet auf ein anderes als Antwort, schickt daraufhin einen String (6-30 Zeichen lang) wartet auf ein Ack.
Natürlich wird sich dieses spezielle Problem mit einem Timer lösen lassen ...... und die nächste Aufgabenstellung wieder, aber ein bißchen anders ...

Aber sei's wie sei, ich muß mich da erst einmal ein bißchen reinknien und schauen wie ich das am besten löse
Danke für die zahlreichen Antworten.
Christian
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)
Für Diese Anwendung gibt es doch sicher Komponenten? Ich kenne leider nur meine eigenen aus MSEgui und kann dir für Lazarus keine entsprechende nennen. Mit der Windows API geht das mit WriteFile() mit lpOverlapped Parameter:AlterMann hat geschrieben: Irgendwie hab ich das Gefühl um die serielle SS pfeift sich keiner mehr, weil die eh ausstirbt (glaubt man) ...
http://msdn.microsoft.com/en-us/library ... S.85).aspx
ReadFile() mit lpOverlapped Parameter:
http://msdn.microsoft.com/en-us/library ... S.85).aspx
WaitforSingleObject():
http://msdn.microsoft.com/en-us/library ... S.85).aspx
und GetOverLappedResult():
http://msdn.microsoft.com/en-us/library ... S.85).aspx
welche in einen separaten thread laufen.
Beispielcode gibt es in der ziemlich betagten unit msecommport:
http://mseide-msegui.svn.sourceforge.ne ... s?view=log
oder auch in tpipereader:
http://mseide-msegui.svn.sourceforge.ne ... n&view=log
Martin
-
- 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)
WOW !mse hat geschrieben: Beispielcode gibt es in der ziemlich betagten unit msecommport:
http://mseide-msegui.svn.sourceforge.ne ... s?view=log
oder auch in tpipereader:
http://mseide-msegui.svn.sourceforge.ne ... n&view=log
Tuts das auch mit NoGUIApplication ?
-Michael