Problem mit Timer
-
Hallo,
ich benutze den C++ Borland Builder 5 und habe ein Programm geschrieben, mit dem man eine Hardware über die serielle Schnittstelle anspricht.
d.h. es werden in regelmäßigen Abständen vom Pc aus Befehle an die Hardware gesendet. die Hardware antwortet auch erfolgreich.
Die Befehle, die ich an die Hardware sende werden mit Hilfe eines Timers gesendet. alle 50ms werden ca. 5 befehle nacheinander gesendet und dann beginnt die geschichte wieder von vorne.
dies funktioniert ganz gut, jedoch kommt es oft vor, dass sich die Hardware "aufhängt" sobald ich eine andere Form öffne in meinem Porgramm oder wenn ich irgendwelche Buttons drücke.
ich habe herausgefunden, dass sich die Hardware dann aufhängt, wenn 2 Befehle in zu kurzen Abständen erfolgen.
Wenn ich keine Buttons oder Formulare öffne/schließe läuft der Befehlsablauf mit dem Timer reibungslos.Tja und nun stell ich mir die Frage warum das so ist?
Hat jemand Tipps oder nen hinweis wie man das Problem beheben kann?Gruß Crabs
-
Hallo,
lagere das Versenden der Befehle / Empfangen der Antworten in einen separaten Thread aus. Wenn du die Suche zum Thema "Threads" bemühst, wirst du genug Beiträge finden.
Es gibt sogar ein Hauseigenes Tutorial zu Threadshttp://bcb-tutorial.c-plusplus.net/inhalt.html
MfG
-
Danke für die schnelle Antwort.
Hab mir mal das Tutorial angesehen und ausprobiert.
Nur finde ich, dass die Sache mit nem Timer besser zu handhaben ist, da ich den zeitlichen Abruf der Daten variable halten kann und dies kann ich bequem über den Objectinspektor einstellen. Außerdem erwarte ich das ein Timer zuverlässig läuft, sonst bräuchte man keine implementieren.
Ich denke dasd Problem liegt an den Prioritäten. Ich sehe anhand einer LED Anzeige, die ich für die Datenüberwachung habe: bei einem Klick auf ein Formular wird der Datenabruf unterbrochen für eine kurze Zeit. Vielleicht muss man die Pioritäten ändern, nur weiß ich nicht wo man das ändern könnte!?!
-
mr_crabs schrieb:
Nur finde ich, dass die Sache mit nem Timer besser zu handhaben ist, da ich den zeitlichen Abruf der Daten variable halten kann und dies kann ich bequem über den Objectinspektor einstellen.
Mit einem Thread kannst du den zeitlichen Abruf empfangener Daten sehr variabel halten. Ein Thread läuft "parallel" zum Hauptprogramm... Wenn der Thread Daten vollständig empfangen hat, kann er das Hauptprogramm benachrichtigen (Flag setzen etc) - wann du dann darauf eingehst ist ja deine Sache. Das ist doch voll variabel. Außerdem kannst du einen Thread auch anhalten. Du hast also alle Möglichkeiten mit einem Thread zeitliche Abläufe so zu gestalten, wie du es im Programm brauchst. Im Prinzip hast du mehr Möglichkeiten, weil das Versenden und Empfangen von Daten das Hauptprogramm nicht "lahmlegt". Ein Thread ist ja ein "Programm neben deinem Programm".
mr_crabs schrieb:
Außerdem erwarte ich das ein Timer zuverlässig läuft, sonst bräuchte man keine implementieren.
Du hast zu Anfang geschrieben, dass es um 50ms-Bereiche geht. Ein Timer ist im 2-stelligen Millisekunden nicht mehr allzu genau, das habe ich hier im Forum schon oft gelesen. KAnnst ja mal die Suchfunktion dazu bemühen... da findest du zB. sowas: TTimer Genauigkeit
mr_crabs schrieb:
Ich denke dasd Problem liegt an den Prioritäten. Ich sehe anhand einer LED Anzeige, die ich für die Datenüberwachung habe: bei einem Klick auf ein Formular wird der Datenabruf unterbrochen für eine kurze Zeit. Vielleicht muss man die Pioritäten ändern, nur weiß ich nicht wo man das ändern könnte!?!
Ich denke immernoch das Threads das Problem am Besten lösen würden. Auch wenn ein Timer wesentlich einfacher ist. Wären Threads und Timer gleichwertig, würde es nicht Beide geben. Ein Thread bietet dir viel mehr Möglichkeiten.
-
Windows ist kein Echzeitbetriebssystem... Timer sind Nachrichtengesteuert...
Ob und wann ein Timer ausgelöst wird, ist deshalb nicht wirklich vorhersehbar und hängt von den Umständen ab. Und sobald Du irgendwas im Formular machst (verschieben reicht da völlig aus), löst Du eine ganze Menge von Nachrichten aus, die ebenfalls abgearbeitet werden müssen. Wenn Du dann noch Button-Funktionen ausführen willst... In der Zeit, in der eine Funktion läuft, werden die Nachrichten nicht abgearbeitet und der Timer somit viel zu spät ausgelöst.Durch das Auslagern in einen Thread verhindest Du, dass sich die Kommunikationroutine und die Anwendungsfuntkionen gegenseitig ins Gehege kommen, da beides unabhängig voneinander läuft.