- Was hast du schon zur Fehleranalyse unternommen?
Ich hab jegliche Funktion innerhalb des Threads und auch außerhalb des Threads einzeln auskommentiert um erst mal zu schauen ob ein Programmteil diesen Fehler verursacht.
- Kommentier mal den Inhalt der Execute Methode aus, so dass nur noch die leere Schleife über bleibt, und probier es dann nochmal.
Auch das hab ich alles gemacht. Der Fehler taucht dann trotzdem auf.
Ich hab die Vermutung das beim Beenden des Threads der Speicher falsch freigegeben wird. Unter Windows 2000 bekomme ich einen read Fehler an einer Speicherstelle.
- das "Inherited" gehört im Konstruktor normalerweise an den Anfang, nicht als letzte Zeile.
Danke für den Tipp. Hab ich ausgebessert.
Edit1: Es ist aber definitiv der Thread, denn wenn ich das Programm starte und beende ohne den Button geklickt zu haben, dann funktioniert dies korrekt.
Edit2: So, jetzt habe ich im Konstruktor des Thread FreeOnTerminate mal weggemacht (Default: false) und den Speicher in meinen Funktionen explizit mittles JoyThread.Free hinter JoyThread.Waitfor aufgerufen und siehe da, es funktioniert.
Nun nur noch die Frage, warum der Speicher nicht korrekt freigegeben wird, wenn ich FreeOnTerminate := true habe?!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.BtnactivateClick(Sender: TObject); begin if Assigned(JoyThread) then begin JoyThread.Terminate; JoyThread.WaitFor; JoyThread.Free; JoyThread := nil; BtnActivate.Caption := 'Aktiviere Joystick'; end else begin try JoyThread := TThreadJoystick.Create(@JoyData,self.Handle); BtnActivate.Caption := 'Deaktiviere Joystick'; except on E: EAccessViolation do begin showmessage('Der Thread konnte nicht gestartet werden, weil die Treiber DLL nicht vorhanden ist.'); end; end; end; end; |
"So...selbst die Capitolmatratze, die hier auf jedem Karosseplan umgerutscht ist, was will sie von mir? Zahlen. Aber so ist das. Als Chef in meiner Position, da bist du so einsam wie...Gott."