Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - ShowModal und Thread


Fienix - Do 19.03.09 18:21
Titel: ShowModal und Thread
Ich habe einen Thread der im Hintergrund Ausdrucke aufbereitet.
Z.B. ich will 5 Dokumente drucken dann werden 5 Threads gestartet,
soweit funktioniert das alles ohne Probleme.

Es sei ich rufe ShowModal auf, dann bleiben meine Threads stehen.

Weiss jemand wie man das umgehen kann das die Threads trotzdem weiterlaufen?

Danke.


Yogu - Do 19.03.09 18:29

Rufe nicht ShowModal auf, sondern Show ;)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TMyModalForm.MyShowModal;
begin
  // Hauptformular deaktivieren (ggf. auch andere hier einfügen)
  Application.MainForm.Enabled := False;

  // Sich selbst anzeigen
  Show;

  // Warten, bis geschlossen (in Application.ProcessMessages) sollten auch 
  // Threads zum Zuge kommen)
  while Visible do Application.ProcessMessages;

  // Fenster wieder aktivieren
  Application.MainForm.Enabled := True;
end;


Fienix - Do 19.03.09 18:34

:o
Das wäre auch eine Möglichkeit.
Wenn keine besseren Vorschläge kommen, werd ich es wohl so machen müssen.


delfiphan - Do 19.03.09 20:02

Wo rufst du ShowModal auf? In den Threads bist du eingeschränkt, was du mit der VCL machen darfst.


Sinspin - Do 19.03.09 20:40

user profile iconFienix hat folgendes geschrieben Zum zitierten Posting springen:
Es sei ich rufe ShowModal auf, dann bleiben meine Threads stehen.

Hä? Das verstehe ich nicht. Ein echter Thread lässt sich nicht wirklich durch etwas stoppen, mal abgesehen davon in via Suspend zu unterbrechen.
Es sei denn du versuchst aus dem Thread heraus ein Formular via ShowModal zu öffnen. Da hält er natürlich an.


Fienix - Fr 20.03.09 10:24

In den Threads ruf ich das ShowModal nicht auf sondern im Hauptprozess.

Kann es evtl an dem Synchronize liegen?


Delete - Fr 20.03.09 10:31

user profile iconFienix hat folgendes geschrieben Zum zitierten Posting springen:
Kann es evtl an dem Synchronize liegen?

Ohne Code schlecht zu sagen. Jedenfalls wird jede in Synchronize aufgerufene Prozedur im Kontex des Hauptthreads ausgeführt und so lange wartet natürlcih der aufrufende Thread.


Fienix - Fr 20.03.09 10:37

Genau sowas hab ich mir schon gedacht.

Hab lieder noch nicht genau rausgefunden was Synchronize macht.
Aber ohne läuft es nicht.


Delete - Fr 20.03.09 12:35

user profile iconFienix hat folgendes geschrieben Zum zitierten Posting springen:
Hab lieder noch nicht genau rausgefunden was Synchronize macht.

Dazu ist die Hilfe da. ;)


delfiphan - Fr 20.03.09 14:14

Synchronize blockiert eben gerade den Thread, bis der Aufruf beendet ist. Du kannst entweder mit Queues arbeiten, oder die MessageBox Funktion der WinAPI im Thread aufrufen (ohne Synchronize). Den Code von Yogu würde ich nicht empfehlen (es sei denn, du hast vor, ein Spiegelei auf dem Prozessor zu braten (nicht böse gemeint)).