Einzelnen Beitrag anzeigen

Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

CreateProcess in thread mit eigener messageloop?

  Alt 18. Dez 2013, 10:08
Moin allerseits,
Ich habe folgendes Problem:

per CreateProcess starte ich ein Programm, wie z.B. powershell(v1) mit einem gegebenen script. Im Startupinfo record gebe ich sw_hide an, damit die Konsole der Powershell nicht angezeigt wird.

Wenn dass das einzige ist, was ich mache klappt alles wunderbar. Wird z.B. im Powershell-Script ein Dialog angezeigt, funktioniert dieser tadellos.

Wenn ich aber blockierend auf das beenden des Prozesses warte, dann geht das nicht mehr. Warum? Durch SW_Hide bin ich aus irgendeinem Grund jetzt plötzlich für die abarbeitung der messages zuständig. Warte ich blockierend werden natürlich keine messages abgearbeitet und die Dialoge aus Powershell gehen nicht.Im gegensatz dazu: Per SW_Show erstellt die Powershell ihr hauptfenster und mein Prozess darf blockend warten, wärend alles weitere ohne Probleme funktioniert.

Ich möchte aber auch nicht, das grundsätzlich Nachrichten(wie die für VCL) abgearbeitet werden(i.e. Application.processmessages).

Meine Idee wäre dann gewesen, CreateProcess in einem anderen Thread auszuführen, der praktisch dann die Arbeit zugesprochen bekommt und der Hauptthread kann blockend warten.

Bisher war dies aber nicht von Erfolg gekrönt. Ich habe es per unsichtbarem Fenter im Thread als auch generel per pek/translate/dispatchmessage vor und danach(in einer loop) versucht, um die Messagequeue im Thread zu erstellen und am leben zu erhalten. Allerdings wählt sich Windows/Createprocess immer die Hauptqueue aus. Solange da kein Application.ProcessMessages im Hauptthread steht, läuft da nichts mit Dialogen.

Ich möchte vorzugsweise CreateProcess nutzen, um STDIN/Out/Err auswerten/nutzen zu können.

Hat jemand eine Ahnung, was hierbei die Ursache sein könnte?

EDIT: interressanter Nebeneffekt: Beende ich meien Applikation und die Powershelll bleibt am leben, so funktioniert danach der Dialog. anscheinend übernimmt die Powershell dann wieder die Arbeit?

Grüße
Memnarch
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden

Geändert von Memnarch (18. Dez 2013 um 10:25 Uhr)
  Mit Zitat antworten Zitat