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 ?