Sleep Problem

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Zim.

    Sleep Problem

    Hi,
    wie bekomm ich das hin:


    VB.NET-Quellcode

    1. Declare Sub sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. PictureBox1.Visible = True
    4. System.Threading.Thread.Sleep(2000)
    5. Label1.Visible = True
    6. System.Threading.Thread.Sleep(2000)
    7. PictureBox1.Visible = False
    8. End Sub



    also nach klick des buttons soll das bild auftauchen ( ist am anfang auf False gestellt )
    dann 2sek warten >man sieht das Label > 2sek warten > > bild soll wieder wieder invisible = False werden!

    Wenn ich es Starte und klicke den button dann wartet der 4 sekunden ( 2 + 2 = 4 ;wenn ich mich nicht verrechnet habe ) sekunden und zeigt dann gar nix an!

    MfG

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

    eventuell so:

    VB.NET-Quellcode

    1. Dim t As Threading.Thread = New Threading.Thread(AddressOf Bild)
    2. Sub Bild()
    3. PictureBox1.Visible = True
    4. t.Sleep(2000)
    5. Label1.Visible = True
    6. t.Sleep(2000)
    7. PictureBox1.Visible = False
    8. End Sub
    9. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    10. t.Start()
    11. End Sub

    //Edit:
    Oder du arbeitest mit Me.Refresh()
    --- Zurzeit inaktiv ---

    raist10 schrieb:

    Wieso ist Application.DoEvents "böse"?

    Ich glaub das ist schlechter Programmierstil. Und es läuft (bei mir jedenfalls) seeehr laangsam.
    --- Zurzeit inaktiv ---

    talos1990 schrieb:

    also nach klick des buttons soll das bild auftauchen ( ist am anfang auf False gestellt )
    dann 2sek warten >man sieht das Label > 2sek warten > > bild soll wieder wieder invisible = False werden!

    Das hat eiglich nix mit Threading und Application.DoEvents zu tun (ist wirklich böse ;)).
    Da tut man zunäxhst einen Timer aufs Form. Beim Clicksen auffn Button macht man halt Bilder an, Button Disable, Label etc, und startet den timer.
    Wenn der Timer dann einmal tickt, stopt man ihn gleich wieder, macht Bilder aus, Button Enable, Label etc. wieder wie vorher, würdich sagn.

    ErfinderDesRades schrieb:


    Das hat eiglich nix mit Threading und Application.DoEvents zu tun (ist wirklich böse ;)).


    Bei der PictureBox wird die Eigenschaft visible gesetzt und bevor der Thread die Anweisung in optische Anzeige umsetzen kann wird er mit Sleep eingefroren und danach wird sofort wieder die Eigenschaft visible geändert und bevor das umgesetzt werden kann wird der Thread gleich mal wieder eingefroren.

    Somit ist es ein reines Problem des synchronen Ausführung und damit ein Threading-Problem.

    Und bitte ... begründe warum Application.DoEvents böse sein soll, alles andere ist nur eine persönliche Behauptung ohne Gültigkeit. ;)

    Hier zur Klärung der Problempunkt bei Application.DoEvents:


    Caution

    Calling this method causes the current thread to be suspended while all waiting window messages are processed. If a message causes an event to be triggered, then other areas of your application code may execute. This can cause your application to exhibit unexpected behaviors that are difficult to debug. If you perform operations or computations that take a long time, it is often preferable to perform those operations on a new thread. For more information about asynchronous programming, see Asynchronous Programming Overview.


    Ich würde daher mal sagen das in dem Fall hier mal rein gar nichts gegen Application.DoEvent spricht.

    @ Live


    Ich glaub das ist schlechter Programmierstil.


    Glauben oder wissen? ;)

    Gut, siehe oben ... an so einer Stelle die nur einem Zweck dient nämlich dem Thread Zeit zu geben die optische Umsetzung zu realisieren kannst Du das problemlos einsetzen.

    In Multi-Threading Prozeduren oder Prozeduren die auf Member zugreifen die durch asynchrone Vorgänge auch beeinflusst werden, könnte es tatsächlich zu einem Problem führen da die asynchronen Ausführungen möglicherweise den Value der Member verändert hat und Du daher nach Application.DoEvents ganz andere Zustände hast als zuvor.


    Und es läuft (bei mir jedenfalls) seeehr laangsam.


    Was meinst Du mit langsam?

    DoEvents macht gar nichts, ausser das es anderen anstehenden Jobs der Anwendung die Abarbeitung erlaubt. Kann im Debug-Modus zu einer etwas längeren Dauer führen, da das komplette Debug-Handling ja auch mitläuft. Aber wenn Du nicht x-hundert asynchrone Vorgänge im Hintergrund laufen hast dann dürfte da eigentlich nix lange dauern.

    Oder liegt es an Deiner Sleep-Anweisung? Die dauert natürlich. *g*

    Gruß

    Rainer
    das funktioniert so, wie Du es willst:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. PictureBox1.Visible = True
    3. Pause(2)
    4. Label1.Visible = True
    5. Pause(2)
    6. PictureBox1.Visible = False
    7. End Sub
    8. Sub Pause(ByVal pau As Single)
    9. Dim start, finish As Single
    10. start = Microsoft.VisualBasic.DateAndTime.Timer
    11. finish = start + pau
    12. Do While Microsoft.VisualBasic.DateAndTime.Timer < finish
    13. Application.DoEvents()
    14. Loop
    15. End Sub


    mfg
    Application.DoEvents ist böse, weil ...

    Man setzt ADE im GUI-Thread ein, um eine lang laufende Methode in genau diesem Thread zu unterbrechen und stattdessen dafür zu sorgen, dass der GUi-Thread wieder auf externe Ereignisse reagieren kann. Damit ist auch schon gesagt, warum ADE böse ist: Es verschleiert grundsätzliche Designfehler. Lang laufende Methoden gehören nicht in den GUI-Thread. Der ist für GUI ... und nicht zum rechnen etc. ADE erlaubt das zu "umgehen" und wer sich nicht auskennt - und das sind die viele - wird früher oder später die merkwürdigsten Fehler bekommen. Weil er (oder sie) sich keine Gedanken gemacht hat.

    raist10 schrieb:

    Bei der PictureBox wird die Eigenschaft visible gesetzt und bevor der Thread die Anweisung in optische Anzeige umsetzen kann wird er mit Sleep eingefroren und danach wird sofort wieder die Eigenschaft visible geändert und bevor das umgesetzt werden kann wird der Thread gleich mal wieder eingefroren.

    Somit ist es ein reines Problem des synchronen Ausführung und damit ein Threading-Problem.


    Naja, is halt unsinnig, das so zu versuchen. Das Sleep muß weg, denn das friert das Gui ein. Man musses genauso implementieren, wie die Anforderung ist: Die PB wird angezeigt, und nach 2 Sekunden wieder versteckt.
    Jo, und die einfachste und Resourcen-sparendste Art, nach 2 Sekunden den PB-versteck-Code auszuführen ist halt ein Timer, der auf 2 s eingestellt ist.
    Kommt mir ganz unmittelbar einleuchtend vor - ist es das nicht?
    zu ADE noch: Ich hatte mal etwas ganz unprogrammierbares damit, als ich in einem langlaufenden Job aufs Gui zugriff, dadurch Events auslöste, und ausserdem ADE verwendete.
    Weil da war die Reihenfolge, in der die Events auftraten durcheinandergebracht.

    Ah - guck: ich glaube, ich hatte ein Reentrance-Problem gehabt.

    Aber zugegeben: Für einfache Fälle mags gelegentlich hinreichen. Mitte Performance müssteman halt mal testen, weil in viel durchlaufenen Schleifen wirds ja u.U. sehr oft aufgerufen.
    @ picoflop

    So formuliert kann ich natürlich nur zu stimmen. ;)

    @ ErfinderDesRades

    Keine Frage das ein Timer die Geschichte hier auch gut erledigen kann.

    Es ging ja hier auch nur um eine einfache Geschichte: Anweisungs-Abarbeitung bevor der Thread künstlich eingegfroren wird. Aber ich werde es nächstes Mal konkreter begründen und auch einen Hinweis abgeben worauf man aufpassen muss.

    Gruß

    Rainer
    Wie wäre es denn mit PictureBox.Refresh ???

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. PictureBox1.Visible = True
    3. PictureBox1.Refresh()
    4. Threading.Thread.Sleep(2000)
    5. Label1.Visible = True
    6. Label1.Refresh()
    7. Threading.Thread.Sleep(2000)
    8. PictureBox1.Visible = False
    9. End Sub