Laden...

Process.WaitForExit

Erstellt von wds vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.606 Views
wds Themenstarter:in
61 Beiträge seit 2006
vor 17 Jahren
Process.WaitForExit

[EDIT]Abgetrennt von Process[/EDIT]

sorry, dass ich michin den Thread einklinke. Ich muss PDFs drucken und rufe dazu einen drucker über die Console auf:

Flashprinter.exe source.pdf  -o dest.swf

Die WaitforExit-Methode wird komplett übergangen und der Code sofort weiter abgearbeitet. Das führt bei mir zum Programmabsturz. Ich habe mir die Prozesse mal direkt nach Aufruf ausgeben lassen und den FlashPrinter-prozess in der Liste der aktuellen Prozesse gefunden.

Kennt jemand eine Möglichkeit das abzufangen?

"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf."
K.Zuse

3.170 Beiträge seit 2006
vor 17 Jahren

@wds
kannst du mal etwas code zeigen? Ich kene Flashprinter.exe zwar nicht, weiß aber auch nicht was bei dem Flashprinter anders sein sollte als bei anderen Prozessen?!?
Dieser Code hier führt bei mir zum gewünschten Ergebnis, mit Notepad.exe als Testprozess:

using System;
using System.Diagnostics;

namespace Test
{
  class Program
  {
    public static void Main(string[] args)
    {
      Process p = System.Diagnostics.Process.Start("notepad.exe");
      p.WaitForExit();
      System.Diagnostics.Process.Start("notepad.exe");
    }
  }
}

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

wds Themenstarter:in
61 Beiträge seit 2006
vor 17 Jahren

Ja mit Notepad klappt das auch bei mir. Genauso stelle ich mir das auch vor. Da das Drucken serverseitig und im Hintergrund ablaufen soll habe ich das wie folgt angestossen.


System.Diagnostics.Process myPro = new System.Diagnostics.Process();
myPro.StartInfo.CreateNoWindow = false;
myPro.StartInfo.UseShellExecute = true;
myPro.StartInfo.RedirectStandardOutput = true;
myPro.StartInfo.FileName = @"C:\Programme\Macromedia\FlashPaper 2\FlashPrinter.exe ";	
myPro.StartInfo.Arguments = @"C:\1\test.pdf -o C:\1\test.swf";
myPro.Start();
myPro.WaitForExit();					

// Aussenrum ist ne Schleife, die mehrere Dokumente drucken soll. 

Flashprinter.exe ist der Drucker von Macromedia FlashPaper 2. Die Trial kann man bei denen laden.

"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf."
K.Zuse

3.170 Beiträge seit 2006
vor 17 Jahren

@wds,
ich habe den Printer nicht heruntergeladen, sondern Deinen Code zunächst mal mit notepad.exe getestet. Wenn ich diese beiden Zeilen so zusammen benutze:

myPro.StartInfo.UseShellExecute = true;
myPro.StartInfo.RedirectStandardOutput = true;

fliegt bei mir eine Exception:
Exception System.InvalidOperationException was thrown in debugee:
Für das Prozessobjekt muss die UseShellExecute-Eigenschaft auf "false" festgelegt sein, um IO-Streams umzuleiten.

Das hat sich wohl im Framework 2.0 geändert, habe eben gesehen daß Du mit .NET 2003 arbeitest. Aber wenn es da ein Problem gab und deshalb jetzt in .NET 2.0 eine Exception fliegt, hängt das vielleicht irgendwie mit deinem Problem zusammen. Ansonsten kann ich Dir nicht helfen, habe kein .NET 1.1 mehr installiert 🙁

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

wds Themenstarter:in
61 Beiträge seit 2006
vor 17 Jahren

Bei mir wirft das keine Exception. Auf die Zeile

myPro.StartInfo.RedirectStandardOutput = true;

kann man auch verzichten. Ich weiss da mittlerweile auch nicht mehr weiter. Meine letzte Überlegung, da sich sowieso mehrere Flashpaper fenster öffnen:

Ist es möglich die Fenster über ihren Titel anzusprechen, dann das Drücken von Strg+S und Enter programmiertechnisch weiterzugeben?

"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf."
K.Zuse

3.170 Beiträge seit 2006
vor 17 Jahren

@wds
Wenns Deine eigenen Fenster wären, wäre das ziemlich einfach. So bin ich aber leider spontan überfragt... An das Fenster kommst Du wohl irgenwie über Process.Handle, aber wies dann weitergeht -> keine Ahnung. Ich würde auch eher versuchen, das ursprüngliche Problem zu lösen, statt jetzt schon einen Workaround zu suchen.
Vielleicht bittest Du aber mal einen Moderator, das hier zu einem eigenen Thread abzutrennen und mit einem einschlägigen Titel wie "Process.WaitForExit() klappt nicht" oder so zu versehen.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

wds Themenstarter:in
61 Beiträge seit 2006
vor 17 Jahren

Ok, danke Dir schon einmal für Deine Unterstützung

"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf."
K.Zuse

wds Themenstarter:in
61 Beiträge seit 2006
vor 17 Jahren

ich habe hier mal ein eigenes WaitForExit gebastelt.
Schlagt mich bitte, wenn es grausam programmiert ist. Mir fällt nichts anderes mehr ein.


...
myPro.Start();
myPro.WaitForExit();    

bool run;
 
do
{	
	Process[] processes = Process.GetProcessesByName("FlashPrinter");						
	for(int i = 0; i<processes.Length; i++)
	{
	      Console.WriteLine(processes[i].ProcessName);
	}
	Console.WriteLine("Druck läuft noch");
        Thread.Sleep(1000);
	run = processes.Length > 0;
}while(run);
Console.WriteLine("Druck beendet");

So wird zumindest kein neuer Druck gestartet bevor der alte beendet wurde.
Gibt es nicht einen schöneren/effizienteren Weg das umszusetzen?

"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf."
K.Zuse