Einzelnen Beitrag anzeigen

Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Brauche ich einen Thread ?

  Alt 16. Sep 2009, 19:33
Wie der Titel vermuten lässt, bin ich nicht der Held in Sachen Threads, weil ich damit eher nicht arbeite und diese bisher auch nicht wirklich einsetzen musste.

Versuche ich noch mal eine Erklärung:

Ist allein die CallBack-Routine aktiv und lässt sich durch das DVB-Prog regelmäig 'anschieben', übergebene EPG-Daten mit vorhandenen Daten in meinen Listen aus Records und Arrays auf Aktualität zu prüfen und ggf. neue Daten zu schreiben, ist alles in bester Ordnung.
Da alles dynamisch ist (und sein muss), prüfe ich penibelst auf ungültige Zeiger, Array-Größen, u.s.w.
Diese Routinen sind auch schon etwa 2 Jahre alt und laufen in einer Vorgängerversion in anderer Konstellation problemlos.
Das kann (und hat) wochenlang laufen ohne einen Fehler, Hänger oder sonst was.

Neben den globalen EPG-Daten beschreibe ich weitere globale Variablen, in denen ich mir die Anzahl der aktuell vorhandenen (ggf. upgedateten) EPG-Datensätze (integer, wird max. 50-60.000) merke und was zuletzt gemacht wurde -> Datensatz neu oder update (beides boolean).


Die zeite wichtige Funktion ist ein Timer mit Intervall := 1000.
Hier prüfe ich zunächst mit einer ebenfalls globalen Var, ob sich die Anzahl der aktuellen EPG-Daten seit letzem Aufruf verändert hat (if Total_EPG > Total_EPG_Mem then ...).
Ist das nicht der Fall -> exit.
Wenn doch, werden noch die Var EPG_New und EPG-Update evaluiert und entsprechend reagiert.
Die Reaktion besteht für beide eigentlich nur darin darin, das ich die Datenanzeige nur neu aufbaue (neu, ggf. Sortierung) oder einfach nur auffrische (Update).
Mehr passiert da erst mal/eigentlich nicht...
Ach ja - die func übernimmt auch die eigentliche Display-initialisierung nach Laden vorhandener Daten (Total_EPG_Mem = 0).
Auch habe ich hier mal experimentiert und häppchenweise was per zweitem Timer mit zufälligen Zeiten 'angeboten'.
Kein Problem ...

Wie oben beschrieben blockiert der Timer die CallBack so lange, bis die Anzeige (wieder-) hergestellt ist.
Das hat ne kleine Ewigkeit absolut sauber funktioniert.
Nur kommen jetzt GELEGENTLICH Zugriffsverletzungen.

Es kann also nur am 'Zusammenspiel der beiden Funtkionen liegen, denn jede einzeln für sich lüppt bestens.
Da ich 'nur' der Progger bin und mich nicht wirklich mit Interna und dem Ablauf auf Thread- und/oder Prozessor-Ebene beschäftigt habe (und will), vermute ich folgendes:
-> Die Timer-func ist noch nicht fertig und es kommt ein CallBack
-> CallBack schreibt Daten, die der TImer gerade liest oder umgekehrt
oder
-> ... die DLL selbst 'verweigert' die Annahme (zeitkritisch ?) und das DVB-Prog macht die Access-Violation ?

Wie kann ich das effektiv und dauerhaft verhindern ?
Das passiert wie gesagt NICHT immer - gelegentlich ...
Deshalb die Frage: Brauche ich einen Thread ?
... oder löst der das überhaupt ?
  Mit Zitat antworten Zitat