Hallo zusammen,
gleich zu Anfang: ich erwarte nicht dass mein Problem gelöst wird, es geht mir nur um eventuelle Tipps zum weiteren Vorgehen.
Folgende Situation
- ich verwende Delphi 6
- von 48 analogen Eingängen sollen Spannungen erfasst und aufgezeichnet werden
- es kommen 3 Interfaces der Fa. PICOTech (ADC-24) mit je 16 Kanälen zum Einsatz
- die Interfaces sind über USB (mit einem Hub) mit dem PC verbunden
- PICOTech stellt eine
DLL zur Verfügung, mit der
DLL können die handles der Interfaces abgefragt werden
- die Abfrage von je 16 Werten (ein Interface) dauert relativ lange (ca. 0,8 sec)
- in einer vom mir erstellten Thread-Klasse werden im Execute zyklisch 16 Werte eines Interface abfragt und in einem A/B Puffer ablegt
- Über die Thread-Sicherheit der
DLL kann ich nichts sagen
- ich erstelle drei Instanzen der Thread-Klasse und versorge sie mit dem
handle
- im Hauptprogramm läuft ein Timer der zyklisch die Puffer abfragt und die Werte anzeigt.
- das Hauptprogramm läuft ca. 3 Stunden und bricht dann mit einem Stack-Overflow ab. Dieser Effekt ist auf verschiedenen PCs mit versch. Windows-Versionen nachvollziebar.
- die Thread-Klasse war zunächst recht „naiv“ programmiert, dann habe ich mir überlegt, dass USB als eine gemeinsame Resurce geschützt werden sollte. Ich übergebe jetzt im Construtor allen drei Threads eine globale critical section, die ich vor der Verwendung des USB-Busses setze (enter) und nach der Abfrage der Werte wieder zurücksetze (leave). Das hat leider nichts gebracht,
- Den Zugriff auf den Puffer habe ich nicht geschützt, da vom Hauptprogramm nur gelesen wird, da bin ich mir schon unsicher ob das ok ist.
- die Wahrscheinlickeit für den stack overflow scheint zu steigen, wenn ich den Zyklus des Timers im Hauptprogramm verkürze. Eigentlich sind 0,5 s aussreichend, bei 100 ms kommt der overflow schon nach 30 Minten
Ich vermute der Stack-Overflow ist ein Folgefehler, habe aber keine Idee wie ich da weiterkomme. Trotz Wochenende bin ich für jeden Tipp dankbar.