Kann mir hier ein eigener Thread helfen ?



  • Hi Leuts

    Ich brauche leider nochmal die Hilfe von Profis ...

    Also, ich habe ne GUI die einen Process auf der Kommandozeile ausführen soll.
    Der Process (also das Konsolenprogramm) läuft aber sehr lange. Folglich habe ich mit "Wait to Exit()" aber das Problem, das meine GUI einfriert. Dazu steht hier in der FAQ ja das man dann auch nicht mit DoEvents arbeiten soll, sondern besser nen eigenen Thread anlegen soll.

    Meine Frage:
    Ich leite die Konsolenausgabe des Processes um und greife ihn ab, geht das auch noch, wenn ich das Ganze nun in einen Thread packe? Ich möchte nämlich einige Angaben der Konsolenausgabe "gleichzeitig" in meiner GUI darstellen.

    Hilft mir ein eigener Thread hier also weiter?

    MFG
    Marco



  • Das Prozess Objekt kann AFAIK auch ein Event werden wenn es fertig ist. Schau Dir da noch mal die Doku in der MSDN an. Wenn es da nix zu gibt, schauen wir mal wegen dem Thread (was an sich auch nicht komplex ist solange man nicht Syncronisieren will.)

    Warum rufst Du denn WaitFoxExit auf ? Reicht es Dir irgendwann zu wissen das es fertig ist oder musst Du darauf warten ?



  • Hi

    Danke für die Antwort.

    Also im Grunde genommen habe ich das so vor, das ich während das Konsolenprogramm abläuft meine Haupt-GUI schliesse möchte und statt dessen eine "Bitte warten" -Box einblenden möchte, auf welcher dann ein Fortschrittsbalken abläuft. Also quasi ein zweites Fenster, welches das Erste schliesst solange das Konsolenprogramm abläuft.

    Den Fortschrittsbalken möchte ich über die Konsolenausgabe steuern, da ich von dort aus eine %-Angabe erhalte.

    Bei MSN wird man bestimmt was finden, bzw. habe ich schon, das Problem ist das "verstehen" wenn man nicht einmal ne Ausbildung wenigstens irgendeiner Programmiersprache hat.

    Während das Konsolenprogramm läuft soll die zweite Form natürlich bedienbar bleiben und die ProgressBar anzeigen (und verändern), während der Computer aber auch noch Bedienbar sein soll.

    MFG
    Marco



  • packs einfach in nem backgroundworker

    - worker starten
    - please wait anzeigen
    - bei worker finish das please wait wieder schliessen

    du kannst dann sogar mit reportprogress eine progressbar in dem please wait setzen

    der backgroundworker ist in der msdn gut erklaert und verdammt einfach zu bedienen
    du musst nur darauf achten das du aus dem thread heraus nicht auf die gui zugreiffst, sondern nur kurz vorm start, beim progress und beim finish - aber nicht im dowork



  • Vielen Dank für den Hinweis

    Eine Verständnisfrage habe ich allerdings dabei:
    Woher weis die GUI bzw. der Backgrondworker denn den Fortschritt der Konsolenanwendung ?

    Die Konsolenanwendung gibt den Fortschitt auf der Konsole selber als Text aus ... diesen wolle ich mitunter abgreifen und für meine Progressbar anwenden.
    Dabei muß natürlich dauerhaft die Konsole abgefragt und ausgewertet werden ...

    MFG
    Marco



  • Ich würde dir zu folgendem raten: starte die Konsolenanwendung als eigenen Prozess, leite die Ausgabe auf deine Standardeingabe um und dann kannst du einfach von dieser den Fortschritt ablesen und auf deiner Progressbar anzeigen.

    Wie du in C# die Standardausgabe/-eingabe umlenkst kann ich dir jedoch nicht sagen, aber da du ja Zugriff auf die Winapi hast geht es auf jeden Fall mit diesen Methoden, aber geht sicher auch einfacher.



  • der worker weiss ueberhaupt nichts
    du hast lediglich die moeglichkeit an einer bestimmten stellen im "DoWork" ein progress selber zu senden
    stichwort "ReportProgress"

    beispiel pseudo code:

    class Bla
    {
        private BackgroundWorker _serverWorker = new BackgroundWorker();
        private PleaseWait _pleaseWait = new PleaseWait();
    
        public Bla()
        {
            _serverWorker.WorkerReportsProgress = true;
            _serverWorker.DoWork += new DoWorkEventHandler(serverWorker_DoWork);
            _serverWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(serverWorker_RunWorkerCompleted);
            _serverWorker.ProgressChanged += new ProgressChangedEventHandler(serverWorker_ProgressChanged);
        }
    
        private void serverWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            // Do any in the worker
            _serverWorker.ReportProgress(1);
            // next
            _serverWorker.ReportProgress(2);
            // next
            _serverWorker.ReportProgress(3);
        }
    
        private void serverWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            _pleaseWait.ProgressPos = e.ProgressPercentage;
            // show info about current action the the thread on the please wait dialog
        }
    
        private void serverWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            _pleaseWait.Close();
        }
    
        public void Run()
        {
            _pleaseWait.Owner = this;
            _pleaseWait.ProgressRange = 3;
            _serverWorker.RunWorkerAsync();
            _pleaseWait.ShowDialog();
        }
    }
    

    man kann den RunWorkerAsync auch n parameter mitgeben


Anmelden zum Antworten