Forum: PC-Programmierung HI-Timer in VB6


von E_D (Gast)


Lesenswert?

Hallo Forianer,
ich hoffe, einer von euch hatte schon selbiges Problem, und konnte es
lösen.
Über Jahre hinweg habe ich unter VB6 ein schönes Anwenderprogramm
entwickelt, welche die zu verarbeitenden Daten über die serielle
Schnittstelle bekommt. Dazu benutze ich einen Timer, das Unterprogramm
zyklisch aufzurufen, welches den Eingangspuffer pollt, und die
Datenframes zusammensetzt. Es ist nicht der Standard-Timer von
Microsoft, sondern HITIME.OCX von Mabry. D.h. mit dem kann ich bis zu
1ms-Interrupts auslösen. Ich benutze ihn bis etwa 10ms runter, je nach
Datenaufkommen an der seriellen.
Nun das Problem :
Unter Windows-ME läuft das ganze Super, ohne jegliches Problem.
Unter Windows-XP läuft es auch, nur das der HiTimer nach ca. 65000
Aufrufen des Unterprogramms stirbt, d.h. das Unterprogramm wird nicht
mehr aufgerufen. Der Rest des Programs, auch normale Standard-Timer
laufen weiter. Der HiTimer ist nur noch durch Re-Start des Programs
wieder zum Leben zu erwecken.

Ich habe versucht, vor dem 'kritischen' Zeitpunkt in den
Eigenschaften zu verändern, kurz anzuhalten, und wieder weiter laufen
zu lassen; nichts hilft.
Hat jemand ne' Idee ?

Danke und viele Grüße
ED

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Ja, verwende Callbacks, Events, Interrupts oder wie auch immer das in VB
heisst

von Wolfram (Gast)


Lesenswert?

Ist zwar etwas hart von Tobi ausgedrückt aber er hat recht.

Lass das Polling, auch schon zu Doszeiten hat man bei höheren
Datenraten den Interrupt benutzt.
Verlagere das Abholen der Zeichen in eine Eventroutine ,die aktiviert
wird wenn neue Zeichen ankommen. Setze dort den Frame zusammen und
aktiviere ein Event wenn du einen kompletten Frame hast.
Solltest du beim Polling bleiben wollen, so vergrößere den Puffer für
die serielle Schnittstelle und überlege dir wie schnell du auf einen
Frame reagieren willst. Vergiss dabei Zeiten unter 20ms das wird auf
diese Weise nur Problematisch. Im Puffer der Schnittstelle kann mehr
als ein Zeichen liegen und ich denke du wirst sehr schnell einsehen,
dass der Programmcode übersichtlicher wird wenn du das ganze
Eventbasiert machst.
Am besten wird es allerdings, wenn das ganze in einem eigenen Thread
läuft.

von E_D (Gast)


Lesenswert?

Dankeschön für Eure Tips !
Werde jetzt am Wochenende mal sehen, was ich da machen kann.
Eins habe ich noch versucht, den Hitimer ausgetauscht gegen einen
normalen. Vom prinzip geht das ohne Absturz des Timer auch unter XP,
jedoch laufen mehr Zeichen ein, als so abgeholt werden können...
Mal schaeuen, wie man das per Interrupt löst.
Viele Grüße
ED

von E_D (Gast)


Lesenswert?

Habe das Problem lokalisiert :
Es hat den HiTimer anscheinend gestört, das ich in der eigenen
HiTimer-Subroutine die Intervalwerte geändert habe, ohne vorher den
HiTimer zu disablen...
VG ED

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.