Announcement

Collapse
No announcement yet.

externes Programm im Hintergrund laufen lassen bzw. mit ProgressBar

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    So, die Arguments übergebe ich jetzt mit
    [highlight=vbnet]
    p.StartInfo.Arguments = "-d " & Chr(34) & txtInput.Text & Chr(34)
    [/highlight]

    was auch zu funktionieren scheint, zumindest startet er den Prozess und rödelt eine Weile damit rum - aber jetzt bleibt meine Textbox wieder leer und zeigt die Ausgabe des Programms nicht an. Eigentlich zeigt sie garnix an... wie gesagt, ohne Arguments wir die Ausgabe des Prozesses angezeigt...

    Ich bin echt ratlos so langsam....

    Edit: Kann es sein, das der Prozess seine Ausgabe nicht über StandardOutput sondern über StandardError ausgibt? Das hatte ich schonmal bei einem cmd-Prog. Lässt sich StandardError genauso wie StandardOutput mit o.g. Methode ausgeben?
    Zuletzt editiert von communi; 08.09.2010, 10:54.

    Comment


    • #17
      Also es wird definitiv StandardError für die Consolenausgabe verwendet, ich habe jetzt mal
      [highlight=vbnet]
      AddHandler p.OutputDataReceived ...
      und
      p.BeginOutputReadLine()
      [/highlight]

      mit
      [highlight=vbnet]
      AddHandler p.ErrorDataReceived ...
      und
      p.BeginErrorReadLine()
      [/highlight]
      ersetzt und siehe da, es wird was angezeigt - allerdings wieder nicht zur Laufzeit sondern erst gesammelt wenn der Prozess beendet ist.... toll. Versteh ich nicht, StandardOutput wird so wie soll zur Laufzeit in der Textbox angezeigt, StandardError jedoch erst nach Abschluss des Prozesses...kann mir das jemand erklären?

      Comment


      • #18
        Edit: Kann es sein ...
        Wieso Kann? In der Hilfe steht eindeutig worauf es sich bezieht einfach mal lesen du hast doch die Schlüsselbegriffe

        Kurz, ja es bezieht sich auf StandardOutput darum der Bezeichner Output in der Begin Methode und im Event. Für StandardError gibts dann eben passend BeginErrorReadLine und den ErrorDataReceived Event. Die Benutzung ist gleich(Hättest du auch schnell in der Hilfe finden können wo du doch die Schlüsselbegriffe schon hattest).

        PS: Der Invoke ist nötig. Beim asynchronen auslesen wird natürlich im Hintergrund irgendwo ein Thread verwendet der den OutputDataReceived Event wirft.

        Edit: Ok hast du selber gefunden. Denke dir den kritischen Unterton in meinem Beitrag weg

        Comment


        • #19
          Originally posted by Ralf Jansen View Post
          Edit: Ok hast du selber gefunden. Denke dir den kritischen Unterton in meinem Beitrag weg
          Klar, kein Problem, ich kämpfe schon seit gestern mit der Textausgabe, da hab ich schon ne Menge probiert und getestet

          Allerdings soll eben der StandardError zur Laufzeit in der Textbox angezeigt werden - so wie es auch in Echtzeit in der Console angezeigt wird und so wie der StandardOutput zur Laufzeit in der Textbox angezeigt wird - dann wäre es (vorerst) perfekt

          Comment


          • #20
            Hab das gerade mal mit einer simplen Batch Datei die eine Ausgabe nach StandardError macht geprüft und das läuft schön asynchron rein. Kann es sein das bei deinem Programm mit dem du das testet vielleicht nur am Ende Error Meldungen kommen(also das das was du beobachtest für diesen Prozess normal ist)?

            Comment


            • #21
              Das Programm zeigt normalerweise während es defragmentiert nur eine Zeile in der Dos-Box an:

              "Defragment: 2% done."

              Wobei sich die Prozentzahl ständig ändert. Bei 100% kommt dann:

              "Defragmentation completed successfully."

              Und mein Programm zeigt im derzeitigen Zustand nach Fertigstellung des Prozesses in der Textbox das hier auf einen Rutsch an:

              Defragment: 0% done.
              Defragment: 1% done.
              Defragment: 2% done.
              Defragment: 3% done.
              Defragment: 4% done.
              ..... rausgeschnitten...
              Defragment: 98% done.
              Defragment: 99% done.
              Defragment: 100% done.
              Defragmentation completed successfully.

              Also jedes Prozent in einer extra Zeile - damit könnte ich ja noch leben, das ist ja nur kosmetisch, aber daß es nicht in Echtzeit angezeigt wird ist schon ärgerlich... Theoretisch sollte doch alles, was in der Dosbox angezeigt wird/abläuft, sich auch in die Textbox biegen lassen, oder?

              Comment


              • #22
                Theoretisch sollte doch alles, was in der Dosbox angezeigt wird/abläuft, sich auch in die Textbox biegen lassen, oder?
                Ja.

                Mein Testcode bei dem es funktioniert. Vielleicht mache ich ja noch irgendwas anderes als du oder falls der Code bei dir auch so nicht geht wissen wir das VMWare noch irgendwas spezielles macht.


                [Highlight=VB.Net] Private Sub OutputDataReceivedHandler(ByVal sendingProcess As Object, ByVal outLine As DataReceivedEventArgs)
                txtOutput.Invoke(New UpdateHandler(AddressOf UpdateControl), outLine.Data)
                End Sub

                Private Delegate Sub UpdateHandler(ByVal text As String)

                Private Sub UpdateControl(ByVal text As String)
                txtOutput.Text += text + Environment.NewLine
                End Sub

                Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
                Dim p As New Process
                Dim ProcessInfo As New ProcessStartInfo

                p.StartInfo.FileName = "C:\Users\Ralf Jansen\Desktop\test.bat"
                p.StartInfo.UseShellExecute = False
                p.StartInfo.CreateNoWindow = True
                p.StartInfo.RedirectStandardOutput = True
                p.StartInfo.RedirectStandardError = True

                AddHandler p.ErrorDataReceived, AddressOf OutputDataReceivedHandler
                AddHandler p.OutputDataReceived, AddressOf OutputDataReceivedHandler

                p.Start()
                p.BeginErrorReadLine()
                End Sub[/Highlight]

                Die Testbatch

                Code:
                ECHO ErrorAusgabe1>&2
                ping 127.0.0.1
                ECHO ErrorAusgabe2>&2
                ping 127.0.0.1
                ECHO ErrorAusgabe3>&2
                ping 127.0.0.1
                ECHO ErrorAusgabe4>&2

                Comment


                • #23
                  Habs gerade mal mit deinem Code und dem vmware getestet, ist genau das gleiche Ergebnis: nach Abschluß des Prozesses wird die Textbox in einem Rutsch vollgeschrieben, als obs irgendwo zwischengepuffert gewesen wäre. Mit deinem batch funktioniert es einwandfrei. Ich habs auch noch einmal mit psexec getestet, was dann remote eine batch ausführt, da wird die Ausgabe von psexec in Echtzeit ausgegeben, die Consolenausgabe der Remote-Batch aber auch erst nach Prozessende, und was das Schlimmste ist, es kommt keine Meldung zurück, daß der Prozess beendet ist, somit findet auch kein p.close() mehr statt :-( Mit cmd-Ausgabe funktioniert hingegen alles und wird korrekt zur Laufzeit angezeigt.
                  Also kann man theoretisch nicht pauschal alles, was in der cmd ausgegeben wird, auch in der Textbox ausgeben, das ist bei jedem Programm/Prozess anders und muss erst mühsam getestet werden... schade!!! Da müsste man dann für solche Fälle eine kleine Dos-Box ins Formular einbauen können ;-)
                  Nunja, müssen sich die User mit einer aufploppenden cmd-Shell abfinden, es geht eben nicht alles. Aber wieder was gelernt ;-) Ich bedanke mich jedenfalls recht herzlich für die umfangreiche, geduldige Hilfe!!!

                  Vielleicht fällt ja irgendwann irgendwem doch eine passable Lösung für sowas ein....

                  Comment

                  Working...
                  X