Wie Wartezeit zwischen externes Programm starten und Fensterposition setzen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Wie Wartezeit zwischen externes Programm starten und Fensterposition setzen

    Ich starte z.b. mit Button1 ein externes Programm,
    wenn ich dann mit Button2 die Fensterpostion setze geht es.
    Wenn ich das Setzen der Fensterposition in Button1 mit einbaue, geht es nicht.
    Vermutlich, weil das Programm noch nicht gestartet ist.
    Wie bekomme ich das hin, da gibt es doch bestimmt was sinnigeres wie einen Timer.
    Du könntest es als ersten Schritt mit Threading.Thread.Sleep(WartezeitInMillisekunden) versuchen.
    Wenn Du die App mittels Diagnostics.Process.Start startest, kannst Du auch die die Process-Instanz der App bekommen und mit DeinZielprozess.WaitForInputIdle warten, bis das Fenster bereit ist angesprochen zu werden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja, entweder das, oder einen Thread einsetzen, für eine "Sub" geht das, bei einer Function wäre Async/await die bessere Option.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim t As Thread = New Thread(New ThreadStart(Sub()
    3. If MessageBox.Show("Start") = DialogResult.OK Then
    4. Thread.Sleep(2000)
    5. MessageBox.Show("Ende")
    6. End If
    7. End Sub))
    8. t.Start()
    9. End Sub
    Versteh ich das richtig?
    • Sub -> Thread
    • Function -> Async/Await
    Warum? Für Subs verwende ich auch immer Async/Await, Threads benutz ich schon ewig nicht mehr.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    MyFault. Mehr als 8 Stunden sollte man einfach nicht am PC sitzen. Und da hab ich es mit 17 bereits kräftig übertrieben.
    Da ich Threading.Tasks.Task.Run(Sub() HierEineSubEinsetzen) gern verwende, das Teil aber nen Task wiedergibt, widersprech ich Dir somit doch nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das ist jetzt zwar ein wenig kleinlich, aber wäre dies nicht schöner? Hab in deinem Profil gesehen das du auf CCD Wert legst, daher dachte ich das wäre eine Erwähnung wert.

    VB.NET-Quellcode

    1. Tasks.Task.Run(AddressOf HierEineSubEinsetzen)

    Weil eindeutig ist das eine bestimmte Sub verwendet wird, eine anonyme Sub um eine Sub zu callen finde ich doppelt gemoppelt.
    Da ich es aber gern einheitlich habe und gerne auch Parameter übergebe
    Threading.Tasks.Task.Run(Sub() HierEineSubEinsetzen(HierDieParameter))
    verzichte ich hier auf AddressOf
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    mit Threading.Thread.Sleep(WartezeitInMillisekunden)


    Das habe ich da auch stehen, hatte nur bedenken das jemand der mehr von VB versteht wie ich die Hände überm Kopf zusammenschlägt.
    Aber wenn Du, das als ersten Vorschlag schreibst, kann ich das beruhigt da stehen lassen.

    Starte jetzt zweimal das Notepad mit einer Textdatei und positioniere jedes Fenster an dem gewünschten Standort.
    Was mir noch fehlt, ist das Minimieren von mindestens dem ersten Fenster, hast Du da ein Tipp für mich.

    Elephant schrieb:

    Ich starte z.b. mit Button1 ein externes Programm,
    Meinst Du Process.Start()?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VaporiZed schrieb:

    MyFault. Mehr als 8 Stunden sollte man einfach nicht am PC sitzen. Und da hab ich es mit 17 bereits kräftig übertrieben.
    Da ich Threading.Tasks.Task.Run(Sub() HierEineSubEinsetzen) gern verwende, das Teil aber nen Task wiedergibt, widersprech ich Dir somit doch nicht.
    Ich sehe nicht, was da DyFault sein sollte.
    Ich vermute auch, der Artikel will es garnet nicht verhindern, dass Subs (void methods) mit Async in einen Nebenthread gehoben werden.
    Sondern er rät ab, void zu verwenden, wenn man selbst eine Async Methode schreibt (was bei mir bislang nur ein einziges mal sinnvoll war).
    Also mein Vorschlag wäre, zb dieses zu ersetzen:

    VB.NET-Quellcode

    1. Process.Start(blabla)
    2. Thread.Sleep(1500)
    3. 'weitermachen

    Durch:

    VB.NET-Quellcode

    1. Process.Start(blabla)
    2. Await Task.Delay(1500)
    3. 'weitermachen
    Weil bei Thread.Sleep friert die Anwendung ein.
    Aber auch zu bedenken, dass Anwendung einfrieren auch nützlich sein kann, weil zwar nicht schön, aber der User kannn solange kein Mist verzapfen.



    Wirklich schön machen ist noch komplexer. Da sollte man das Process-Event verarbeiten (wurde schon gesagt), und dann musss man ühaupt erst konzipieren, was der User machen können soll, solange das andere Programm noch nicht einsatzfähig:
    Soll er canceln dürfen?
    Gibt es andere Eingaben, die er darf?
    Wie umgehen, wenn er die Anwendung schliesst? (das muss man imo immer zulassen)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @Elephant Diese Aussage ist doch wohl wichtiger als die, wie Deine Button heißen.
    Process.WaitForInputIdle() hat Dir @VaporiZed doch bereits im zweiten Post genannt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!