Entwickler-Ecke

Sonstiges (Delphi) - MessageDlg-Problem bei Multithreading


AXMD - So 19.02.06 12:41
Titel: MessageDlg-Problem bei Multithreading
Morgen!

Hab gerade eines meiner Programme multithreading-fähig gemacht - funktioniert auch alles super. Einzig MessageDlg macht mir Probleme. Das Problem ist schwer beschreibbar, daher hab ich die EXE angehängt. Reproduzierbar durch folgendes: eine oder mehrere Dateien kopieren und nachdem das geschehen ist, das selbe nochmal. Kopiert man mehrere Dateien, wird der MessageDlg, der "Destination file already exists. Replace?" fragt, immer "größer" (schwer zu beschreiben wie gesagt), bis man nichtmal mehr das Fenster schließen kann. Jemand eine Idee, woran das liegen könnte?

AXMD


BenBE - So 19.02.06 13:05

Die VCL ist nicht Thread-Sicher *g* ;-) Erklärt das dein Problem?


AXMD - So 19.02.06 13:51

Das erklärt das Problem, löst es aber nicht -_-

AXMD


Motzi - So 19.02.06 15:19

Lösung MessageBox-API verwenden oder aber MesssageDlg-Aufrufe synchronisieren (im primären Thread aufrufen). Möglichkeiten der Synchronisierung: TThread.Synchronize() oder per SendMessage eine Message an die MainForm welche dann die entsprechende Aktion ausführt.

Gruß, Motzi


AXMD - So 19.02.06 15:26

user profile iconMotzi hat folgendes geschrieben:
MesssageDlg-Aufrufe synchronisieren (im primären Thread aufrufen)


Hört sich gut an. Wie kann am besten anstellen? Das Problem ist nämlich, dass ich zwei oder drei lokale Variablen des Threads dazu setzen muss...

AXMD


AXMD - So 19.02.06 18:12

Für alle, die die Lösung interessiert:

MessageDlg in einer Methode des Threads deklarieren...


Delphi-Quelltext
1:
2:
3:
4:
procedure TFileCopierThread.MsgDlg;
begin
  FMsgDlgResult := MessageDlg('Destination file already exists. Replace? ', mtConfirmation, [mbYes, mbNo, mbYesToAll, mbNoToAll], 0);
end;


... und dann (wie Motzi richtig gesagt hat) per Synchronize aufrufen - eben dort, wo man's braucht (ich hatte Probleme damit, weil die zu "synchronisierende" Methode keine Parameter haben darf! Das mit den Parametern ist aber über Variablen (private oder protected) lösbar, ebenso das Result):


Delphi-Quelltext
1:
Synchronize(MsgDlg);                    


AXMD

PS.: Vielen Dank nochmal an user profile iconChristian S. ;)