Programmfenster ist nicht anklickbar

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von mw0208.

    Programmfenster ist nicht anklickbar

    Hallo Zusammen,

    bin jetzt auch schon ein paar Monate hier im Forum und möchte erst einmal ein Danke an alle sagen. Tolles Forum und ich habe viele Dinge durch das Forum lösen können.
    Jetzt habe ich aber eine echte Anfängerfrage, die ich aber schlecht recherchieren kann und deswegen einen kurzen Hinweis benötige.
    Einfaches Beispiel:
    Eine einfache Windows Form Anwendung mit einem Formular, einer Textbox (Multiline) und einem Button.
    Beim Klick auf den Button passiert folgendes:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. For x As Integer = 0 To 5000
    3. Me.TextBox1.AppendText("text" & vbLf)
    4. Next
    5. End Sub

    Wie gesagt, total easy. Wenn ich nun das Programm starte und auf den Button klicke schreibt er 5000 mal das Wort text mit einem Linebreak in die Textbox.
    Und nun meine Frage (Ich schäme mich ja fast dafür). Wie kann ich während der Ausführung verhindern, dass das Programmfenster nicht verschiebbar, nicht anklickbar, etc. ist. Das Fenster zeigt dann an, dass die Anwendung nicht reagiert. Erst wenn die Schleife fertig ist, wird das Programm wieder für den Zugriff frei. Was mich hieran nervt ist, dass teilweise der Text, der in die Textbox geschrieben wird, nicht mehr angezeigt wird, bis die Schleife fertig ist. Also die Ansicht wird nicht aktualisiert.
    Wie kann ich dies lösen?

    Vielen Dank,
    Marianna

    Edit by der_Kurt:
    Bitte sinnvolle Threadtitel verwenden, damit man auch in der Übersicht weiß, worum es geht
    * Titel geändert *

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

    Application.DoEvents zwischen den einzelnen Line-Appends erlaubt, dass die Message-Queue der Form weiterhin abgearbeitet wird, damit also auch verschieben / vergrössern etc.

    Man sollte allerdings noch dazu sagen, dass es bei anderen Fällen als in Deinem Beispiel oft besser ist langwierige Tätigkeiten in einem parallelen Thread abarbeiten zu lassen, wie gesagt hier wohl eher nicht .

    Wenn Du aber wirklich einen langen Text für die Textbox zusammensetzen willst, mach das erst mit einem StringBuilder und weise den zum Schluss der Textbox zu: ist viel schneller und weniger speicheraufwändig.

    @Tsuyo macht in diesem (unsinnigen) Beispiel ja wohl rein garkeinen Sinn, da er dann 5.000 mal invoken müsste - gell ?

    Kangaroo schrieb:

    Application.DoEvents zwischen den einzelnen Line-Appends erlaubt, dass die Message-Queue der Form weiterhin abgearbeitet wird, damit also auch verschieben / vergrössern etc.

    Man sollte allerdings noch dazu sagen, dass es bei anderen Fällen als in Deinem Beispiel oft besser ist langwierige Tätigkeiten in einem parallelen Thread abarbeiten zu lassen, wie gesagt hier wohl eher nicht .

    Wenn Du aber wirklich einen langen Text für die Textbox zusammensetzen willst, mach das erst mit einem StringBuilder und weise den zum Schluss der Textbox zu: ist viel schneller und weniger speicheraufwändig.

    @Tsuyo macht in diesem (unsinnigen) Beispiel ja wohl rein garkeinen Sinn, da er dann 5.000 mal invoken müsste - gell ?

    Dann schreibt man sich halt ne kleine Funktion die das Übernimmt :huh:

    mw0208 schrieb:

    Was benutzt ihr denn für ein Element, wenn ihr ein Log verfolgen wollt?

    Für ein einfaches Log durchaus auch eine TextBox, oder RichtextBox, u.U. sogar in einer extra Form die man ausblenden kann.

    Allerdings wird ein Log in den seltensten Fällen 5.000 Lines / Sekunde schreiben, das wäre schon etwas viel. Wenn Du aber viel loggst macht es tatsächlich Sinn Deine Log-Statements erstmal nur in eine Queue zu schreiben, und dann alle paar Sekunden von einen parallelen Thread abräumen zu lassen: so entlastest Du Deine eigentliche Anwendung.

    ebrithil schrieb:

    ich als anfänger würde als test mal ein sleep von 1ms in die schlaufe tun

    Sry ebrithil, mit Thread.Sleep hängt er dennoch ( nur leider in diesem Fall noch länger) weil damit der GUI-Thread einfach schlafen egschickt wird
    k wie wäre es mit:

    Intervalle je auf 1ms

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Timer1.Start
    3. x = 0
    4. End Sub
    5. Private Sub Timer1_Tick
    6. Me.TextBox1.AppendText("text" & vbLf)
    7. x = x + 1
    8. Timer1.Stop
    9. Timer2.Start
    10. If x = 5000 Then Timer2.Stop
    11. End Sub
    12. Private Sub Timer2_Tick
    13. Timer1.Start
    14. Timer2.Stop
    15. End Sub


    ging mir gerade durch den Kopf :D



    mfg Ebrithil
    Mein Erstes Tutorial: Erweitertes Arduino Tutorial

    Simpler D&D FTP Uploader: Edge-Load

    ebrithil schrieb:

    warum langsam wenn ich das ausrechne komme ich auf genau 10 sek bis er den text 5000 mal gescjrieben hat und soviel zeit hat doch jeder oder?

    Über den Einsatz Deines Timer2 muss ich noch meditieren, aber ein sehr einfaches Log kann man schreiben indem man alle Log-Statements in eine Queue schreibt und dann per Timer leert , ja.

    Tsuyo schrieb:

    Ist ja schön das du helfen willst, aber bitte nur wenn man ahnung hat

    *grins* warum hast Du dann 621 Beiträge :rolleyes:
    ja stimmt hast recht timer2 nützt nicht wirklich viel ausser das er den process ausbremmst und damit noch länger geht also wäre es so richtig oder?

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Timer1.Start
    3. x = 0
    4. End Sub
    5. Private Sub Timer1_Tick
    6. Me.TextBox1.AppendText("text" & vbLf)
    7. x = x + 1
    8. If x = 5000 Then Timer1.Stop
    9. End Sub
    Mein Erstes Tutorial: Erweitertes Arduino Tutorial

    Simpler D&D FTP Uploader: Edge-Load
    Das ist ja wirklich fantastisch, wie viele Tips man hier bekommt. Wow.
    Application.doevents hat geholfen.
    Generell werde ich mich wohl doch mit dem Thema Threading in .Net auseinandersetzen.
    Auf jeden Fall vielen, vielen Dank für eure Hilfe. Mein kleiner .Net Webseiten und Foren Scraper ist dann fast fertig.