Hallo zusammen,
ist schon eine Weile her, aber trotzdem noch aktuell.Habe den Code aus bestimmten Gründen nicht angefaßt und war vor ca. 2 Wochen "genötigt", dies zu tun.Mein Progrämmchen hat nützliche Dienste erwiesen, aber es gab und gibt natürlich immer etwas zu verbessern.Und weil alles wesentliche bereits in diesem Thread steht, bleibe ich auch direkt hier und mach keinen neuen auf.
Ich habe mir ein neues GUI gebaut ( war notwendig, das alte war zuvoll gepflastert...aus Zeitgründen), neue Funktionen hinzugefügt und alte Routinen überarbeitet oder eliminiert.Einiges davon ne "Katastrophe", nun ich wußte vieles einfach nicht besser und bin trotzdem stolz, das ich von 0 auf 100 ein Ergebnis mit PureBasic hervorgebracht habe.Seitdem habe ich einiges dazugelernt und lerne natürlich immer noch.
Im Verlauf der Überarbeitung habe ich auch den Fehler gefunden, warum das GUI ( die Buttons, die Menus...) nicht so wirklich toll reagiert hat ( mußte zweimal klicken usw.)
Wen es interessiert: ich hatte in der Event Loop zuviel zusätzlichen Code drin, der den Update einiger Gadgets erledigt hat."Lustigerweise" bin ich darauf gekommen, weil man mir hier im Forum ( und auch anderswo) von der Verwendung von Threads abgeraten hatte.Also habe ich krampfhaft versucht, das Meiste im Main unterzubringen und Thread zu vermeiden.
Nachdem ich diesen Code in einen separaten Thread ausgelagert hatte, funktionierte das GUI wieder so wie ich mir das vorstellte.
Ich habe also einen Thread, der Gadgets updatet.Das geht sicher eleganter oder sicherer, ich weiß nur nicht wie.
Irgendwann gings nicht mehr ohne Threads, da ich nunmal ein paar Sachen parallel machen muß und ich nicht wußte, wie ich das ohne Threads bewerkstelligen konnte.Oft sehe ich auch WINAPI Codeschnippsel, aber ehrlich gesagt wollte ich das erstmal ohne WINAPI hinbekommen.
Ich verwende seit letztes Jahr bis zu 4 Threads in meinem Progrämmchen gleichzeitig und lustigerweise hat das bis jetzt keine Probleme verursacht, obwohl ich nur experimentell mit Mutexes gearbeitet habe.
So, nun zu meinem aktuellen Problem:
Nachdem ich das Programm die ganze Zeit ohne Probleme direkt im PB IDE/Debugger bearbeitet und ausgeführt hab, stürzt es nun - als eigenständige exe gespeichert und gestartet - sporadisch ab.
Windows hat ein Problem festgestelllt blabla und Programm muß beendet werden.Exception Code ist 0xC0000005, was wohl Access Violation bedeutet.Die Fehleradresse ist - zumindest mit einer bestimmten exe Version - immer die gleiche.Also im Moment ist dies z.B. 0x00017531.Ich nehme an, dies ist der Offset von da aus, wo das Programm im Speicher zu liegen kommt ( Base Image?).
Um auszuschließen, das es was mit dem Rechner zu tun hat, habe ich das Programm auf einem anderen Rechner getestet.Hier kam der Fehler sogar noch öfter und schneller.Mag daran liegen, das der zweite Rechner nen Dual Core ist ( Pentium M vs. Core 2 Duo).
Jaja..ich weiß..jetzt kommt gleich wieder: das haste nun von Deinen Threads...
Die Fehleradresse ist ja ein guter Hinweis, ich müßt jetzt "nur noch2 herausbekommen, was auf dieser Adresse zu liegen kommt, damit ich den Fehler beseitigen kann.Mit dem IDE Debugger bin ich da nicht wirklich weitergekommen.Ganz einfach deshalb, weil der Fehler nicht auftritt, solange der Debugger mitläuft..

(
Ich habe diesen Thread, der mein GUI updatet in Verdacht.Wenn ich ihn testweise nicht starten lasse, tritt das Problem nicht auf.Dies ist allerdings nicht so einfach zu beweisen, da der Fehler auch mit Thread nicht vorhersagbar auftritt.
Desweiteren habe ich nun Mutexe eingebaut, um alle Variablen zu schützen, die von mehreren zugegriffen werden.
Compiliere ich den Code als thread-safe, tritt der Fehler nicht mehr auf.Allerdings wird das Program auch merklich langsamer dadurch.
- wie kann ich dem Problem mit dem Crash auf die Spur kommen...?
- gibt es irgendwo eine Art "Best Practices" für die Thread-Programmierung...?
Die Hilfe zu den Threads ist mehr als dürftig und meine Recherche in den Foren hat nicht wirklich viel geholfen.Ich habe eine Menge Zeug gelesen, was Threads abgeblich nicht dürfen und das man sie am besten nicht verwenden soll.Ich will aber !!!
- wie kommuniziert man am besten mit Threads bzw. Threads untereinander...? Es geht um mehr als Signalisierung, es sollen auch Daten übergeben werden.
- welche Alternativen habe ich, um die geforderten Funktionalitäten ohne Threads zu realisieren...? Ich habe gelesen: Callbacks...?
Mir ist auch aufgefallen, das oft, wenn es um etwas kniffliges geht, einfach ein Stück Winapi Code präsentiert wird.Das ist sicher hier und da hilfreich, aber eigentlich wollte ich PureBasic sprechen und nicht WinApi.Sonst könnte ich ja gleich Visual-irgendwas nehmen.
Soll ich besser nen eigenen Thread ( oops..der war das böse Wort wieder...)für jedes dieser Themen im Forum öffnen, da dies ja doch recht umfangreich ist...?
Freue mich über jede Anregung bzw. Problemlösung...
Achso...die Struktur von meinem Projekt sieht so aus:
Main: ist eigentlich nur das GUI bzw. dessen Eventloop
Thread 1: beschafft Daten und speichert diese in Dateien sowie Variablen
Thread 2: testet etwas und speichert das Ergebnis in eine Variable
Thread 3: aktualisiert GUI Gadgets von Variablen, die die anderen beiden Threads mit Inhalten befüllen.
Thread 4 soll jetzt mal keine Rolle spielen, der wird normal nicht gestartet.
Grüße
TWELVE