Registriert: So Okt 23, 2005 08:45 Beiträge: 9 Wohnort: Dresden
Ich Bastel in meinem aktuellem Project das erste mal mit Threads rum, und Wenn ich darin Showmessage(...) oder Ein Selbst gebautes Message-Form verwende (einfach nur zeigen oder erstellen und zeigen und danach wieder zerstören... selber Effect) wenn ich dann das Programm schliesse bekomm ich eine Exception durch die TWinControl.DestroyWindowHandle... Kann mir jemand sagen woran das liegt und wie ich das verhinder?
Ich bin mir auch sehr sicher das alle Threads beim schliessen schon beendet sind (alle Threads tragen sich in eine TList ein und kurz vorm Terminieren wieder aus und beim schliessen des Hauptforms frag ich den Count der TList ab)
Ich hoffe Ihr könnt mir helfen, schonmal Danke an alle die es versuchen
Registriert: So Okt 23, 2005 08:45 Beiträge: 9 Wohnort: Dresden
Wenn ich aber wenn ich ein Form create is das doch nicht die selbe Resource...
Code:
procedure TMyThread.Meldung(Text:String);
var MF: TMeldungForm;
begin
MF := TMeldungForm.Create(nil);
try
MF.Label1.Caption:= Text;
MF.ShowModal;
finally
MF.free;
MF :=nil;
end;
end;
und ich denk nicht das das bei Showmessage anders ist...
[EDIT] Das mit den Threads funtzt alles einwandfrei (auch gemeinsam genutzte Variablen) ausser ich versuche aus dem Threads heraus eine Nachricht anzuzeigen...
Registriert: So Okt 23, 2005 08:45 Beiträge: 9 Wohnort: Dresden
Ich hab Obrigen code nochmal ausprobiert und festgestellt das eine andere Exception in dem fall aufgerufen wird.
TCanvas.RequiredState ruft eine EInvalidOperation.CreateRes auf... ich denk mal dies liegt am nil als Create Argument.
Wenn ich aber wenn ich ein Form create is das doch nicht die selbe Resource...
Und wo denkst du werden die Messages fuer diese Form behandelt?
SonicFX hat geschrieben:
[EDIT] Das mit den Threads funtzt alles einwandfrei (auch gemeinsam genutzte Variablen) ausser ich versuche aus dem Threads heraus eine Nachricht anzuzeigen...
Das ist mit Threads immer so, alles funtzt einwandfrei bis zum crash
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Tokter etwas ähnliches gibt es bei uns im Wiki auch in Deutsch. Mag vielleicht nicht ganz so umfangreich sein aber ich denke doch mal ausreichend.
SonicFX: Wie Tokter schon sagte. Wenn du auch verschiedene Variablen oder Klassen zugreifst, dann solltest du dir genau überlegen was alles synchronisiert werden muss. Und vor allem wann etwas Synchronisiert werden muss. OnTerminate einer Threadklasse wird von Hause aus schon synchronisiert.
Fenster und Threads gehen grundsätzlich. Wenn du ein Fenster in einem neuen Thread erstellst werden die Nachrichten dann in diesem Thread abgearbeitet. Allerdings sobald du komplexere Fenster hast in denen auch noch mit Bitmaps (GDI) gearbeitet wird, dann gibt es nach einer Zeit Fehler. Aber prinzipiell sollte sowohl ein ShowMessage als auch ein TForm.Create funktionieren. Dabei spielt es auch keine Rolle ob du bei Create ein Nil übergeben hast oder nicht. Habe so etwas selber schon häufig genug gemacht. Allerdings wäre ich immer sehr vorsichtig damit. Und nach möglichkeit würde ich die Fenster aus Threads raus lassen.
Je nachdem was du vor hast würde es sich aber sowieso auch anbieten ein Event zu machen welches Synchronisiert aufgerufen wird und welches dann die Meldung anzeigt. Aber da stellt sich mir wie üblich die Frage was genau du damit vor hast?
Registriert: So Okt 23, 2005 08:45 Beiträge: 9 Wohnort: Dresden
Ich umgeh das Problem jetzt einfach indem ich Die Meldungen in eine Liste, eines Forms welches immer da ist, schreiben lass.
Da das eh nur für den User is damit ers Sieht und nicht damit arbeite sollte das weniger Problematisch sein.
Fenster und Threads gehen grundsätzlich. Wenn du ein Fenster in einem neuen Thread erstellst werden die Nachrichten dann in diesem Thread abgearbeitet.
Diese Aussage stimmt nur wenn du das Fenster von Hand mittels Win32 API calls selbst erzeugt hast und dann auch deine eigene Message Loop in dem Thread durchlaeufst. Wenn du von TForm sprichst ist das falsch, erstens ist die VCL nicht thread safe und zweitens behandelt ein Thread von sich aus ueberhaubt keine Nachrichten. Wenn das bei dir nicht abgestuerzt ist dann ist das pures Glueck. Wenn du das sauber machen willst dann erstellst du alles VCL verwannte im Haupt Thread und alle anderen Thread greifen synchonisiert darauf zu wenn sie was angezeigt haben moechten.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich weiß, dass die VCL nicht Threadsafe ist. Deswegen sagte ich ja auch einfache Fenster. Das war ein Erfahrungbericht und keine technische Sache. So lange die Fenster (TForm) einfach gehalten sind kannst du es durchaus in einem Thread erstellen. Auch wenn man es nach möglichkeit vermeiden sollte. Sich deswegen auf die WindowsAPI zu stürzen halte ich persönlich auch nicht unbedingt für sinnvoll. Das ist aber reine Gschmackssache und bisher habe ich es auch ohne hinbekommen. Das meist in dem man alleine schon die Struktur der Anwendung verändert hat.
Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.