AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Threads und stack overflow bei Hardware am USB

Threads und stack overflow bei Hardware am USB

Ein Thema von yogie · begonnen am 17. Mär 2019 · letzter Beitrag vom 18. Mär 2019
Antwort Antwort
yogie

Registriert seit: 11. Sep 2003
Ort: bei Goslar
213 Beiträge
 
Delphi 6 Professional
 
#1

Threads und stack overflow bei Hardware am USB

  Alt 17. Mär 2019, 07:45
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.
Kompatibilität ist ein Euphemismus für n i c h t einhunderprozentige Austauschbarkeit
http://b-und-l-service.de/

Geändert von yogie (17. Mär 2019 um 07:51 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#2

AW: Threads und stack overflow bei Hardware am USB

  Alt 17. Mär 2019, 08:33
Meinst du mit Buffer ein Array im Stack ?
Könnte es einfach ein Speicherüberlauf sein ?
Evtl. sollte man über die Datenstruktur nachdenken, Queue vielleicht.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.772 Beiträge
 
Delphi 12 Athens
 
#3

AW: Threads und stack overflow bei Hardware am USB

  Alt 17. Mär 2019, 09:20
Als Datenstruktur käme evtl. auch ein Ringpuffer in Betracht.

Die Frage ist auch, welche Stelle genau den Stacküberlauf auslöst.
Mittels MadExcept oder Eurekalog könnte man im Absturzfall einen
Stacktrace bekommen, der einem das evtl. zeigt.

Eine kostenlose, aber nicht ganz so schöne Stacktrace Variante
findet man in der JEDI JCL.

Evtl. könnte man auch mal auf ein neueres Delphi wechseln, da hat
sich auch beim Multithreading usw. einiges getan und wenn man solche
Drittanbieter Bibliotheken braucht, tut man sich mit neueren Versionen
auch leichter, da die Unterstützung für so alte Versionen inzwischen
doch (verständlicherweise!) schwindet...

Grüße
TurboMagic
  Mit Zitat antworten Zitat
yogie

Registriert seit: 11. Sep 2003
Ort: bei Goslar
213 Beiträge
 
Delphi 6 Professional
 
#4

AW: Threads und stack overflow bei Hardware am USB

  Alt 17. Mär 2019, 09:41
... prima, auch am Wochenende gibt es Antworten.

Bei dem Buffer handelt es sich nur um zwei abwechselnd beschriebene statische Datenfelder. Das ist ausreichend, da es sich um langsame Vorgänge handelt. (alle 10 Minuten eine Messung speichern)

Ich habe jetzt mal die ganzen Threads usw. durch eine Simulation der
Daten ersetzt und bekomme trotzdem einen Gehler. Diesmal ist eine access violation, der stack overflow ist dann wohl ein Folgefehler. Damit hatte
ich nun garnicht gerechnet. Der Fehler tritt erst nach ca. 20 Minuten Laufzeit auf.

Für die Anzeige habe ich mir einen frame gebaut (nichts aufregendes nur ein paar edits und labels), den erzeuge ich beim Start 16 mal als Element
eines Feldes vom type frame. Da werden dann die Daten angezeigt. Ich muss dort mal weiter suchen.

Also threads und Hardware sind wohl erstmal nicht die Schuldigen.
Trotzdem: DANKE
Kompatibilität ist ein Euphemismus für n i c h t einhunderprozentige Austauschbarkeit
http://b-und-l-service.de/

Geändert von yogie (17. Mär 2019 um 10:08 Uhr)
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
670 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Threads und stack overflow bei Hardware am USB

  Alt 17. Mär 2019, 14:03
Stack overflows sind normalerweise Folge eines rekursiven Aufrufs einer Routine, eventuell auch indirekt (A -> B -> C -> A ...). Ohne den Kode deiner Execute-Methoden zu sehen (und wie dein Timer mit den Threads interagiert) ist eine weitere Diagnose nicht möglich. Aber ich habe da eher eine Programmierfehler im Verdacht, da der Fehler ja an der Zahl der Aufrufe zu hängen scheint, nicht an der Frequenz.
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.449 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Threads und stack overflow bei Hardware am USB

  Alt 17. Mär 2019, 14:59
Neben dem, was Peter Below schrieb, gibt es noch den Fall, dass z.B. durch Application.ProcessMessages ein neuer Timer-Event ausgelöst wird, während der alte noch läuft.
Delphi-Quellcode:
procedure TMyForm.MyTimerTimer(Sender);
begin
  // Code
  Application.ProcessMessages;
  // mehr Code
  Application.ProcessMessages;
  // noch mehr Code
end;
Jedes Application.ProcessMessages kann dazu führen, dass der Timer neu ausgelöst wird, wenn der Code länger läuft als das Timer-Intervall.

Dabei läuft dann auch der Stack ganz langsam voll. Je kürzer das Intervall, desto schneller.
Thomas Mueller
  Mit Zitat antworten Zitat
yogie

Registriert seit: 11. Sep 2003
Ort: bei Goslar
213 Beiträge
 
Delphi 6 Professional
 
#7

AW: Threads und stack overflow bei Hardware am USB

  Alt 18. Mär 2019, 11:05
Hallo zusammen,
nochmals danke!
Das Proplem ist gelöst. Der Stackoverflow hatte mich auf eine falsche Spur gesetzt.
Letzlich war es ein Timer-Event in Zusammenhang mit Application.ProcessMessages. Im Hintergrund liefen unsichtbar 16 kleine Grafiken mit, die erst auf Anforderung des Anwenders angezeigt werden sollen. Die hatte ich übersehen. Je mehr Daten die Grafiken enthielten, desto länger dauerte ihr refresh. Irgendwann war das dann zu lang. Ich denke der Stackoverflow war dann nur ein Folgefehler. Bei der Fehlersuche konnte och die Abbrüche auch ohne die Threads nur mit Dummy-Daten erzeugen. Fazit: wieder was gelernt und immer die komplette Verarbeitungskette anschauen, auch wenn sie für den Anwender unsichtbar ist.
Kompatibilität ist ein Euphemismus für n i c h t einhunderprozentige Austauschbarkeit
http://b-und-l-service.de/
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz