Wartescreen

  • VB.NET

Es gibt 48 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Wartescreen

    Hey, (Dann hier nochmal :))

    Habe eine kleine Frage an euch, hoffe ihr könnt mir mal wieder helfen Folgendes ich habe (Vereinfacht) in einer Form einen button und wenn ich diesen drücke wird ziemlich viel Code ausgeführt. Drücke ich diesen button dann die ganze zeit stürzt das Programm irgendwann ab. (Also keine Rückmeldung)

    --> Aus diesem grund suche ich eine Möglichkeit einen wartescreen zu machen der 1.Gut Aussieht xD und 2. dafür sorgt dass der nutzer in dieser Zeit nichts machen oder drücken kann.Ich meine damit nicht dass der button einfach kurz versteckt wird (visible = false).

    --> Mein Problem: Ich habe dann Probiert eine Neue Form zu machen in der ich eine Progressbar hatte. Diese Form habe ich dann am Anfang des Coder (Also wenn man den Button drückt) mit dem Befehl .Show geöffnet! Allerdings öffnet und füllt sich diese Form erst wenn der Code vorbei ist also bringt mir das auch nichts da es ja während der Code Laufzeit offen soll.

    Zusammengefasst suche ich euere Ideen oder anweisungen wie ich es schaffe während der ausführung eines codes einen Ladescreen zu schaffen, sodass der User nichts mehr machen kann. Vergleichbar mit dem Ladebalken in z.B spielenMFG
    Hallo @SidezockingLP,

    Ich verstehe zwar was Du möchtest, aber ich finde generell dafür einen "wartescreen" etwas übertrieben.
    An deiner stelle würde ich einfach den Button Deaktivierst und nach der ausfrühung des Codes wieder Aktivieren.



    VB.NET-Quellcode

    1. Button1.Enabled = False
    2. Button1.Enabled = True


    Solltest Du jedoch wirklich ein "wartescreen" wollen würde ich Dir eher empfehlen einen zu nehmen ohne Progess anzeige da Du sonst entweder irgend eine "Fake" % zahl anzeigen musst oder Dir Gedanken machen müsstest wie Du den Code der ausgeführt wird ordentlich in einer % anzeige umwandelst. Sprich einfach ein Endlos Ladesymbol angezeigt, bis der Code ausgeführt wurde.

    Die neue Form müsstest Du dann zb. mit Form.ShowDialog aufrufen, um sicherzustellen das in der Hauptform keine Usereingaben mehr möglich sind!

    Liebe Grüße,
    Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Ruerte“ ()

    Hi, erstmal danke Ruerte :)

    finde jedoch ein "wartescreen" dafür etwas übertrieben.


    Das was ich oben geschrieben habe war nur eine vereinfachung! Mein richtiges programm (Also um das es hier geht) hat viel mehr Buttons/Listboxen usw und vielmehr funktionen.

    Es muss auch keine andere Form unbedingt sein ich hätte nur gerne eine grafische möglichkeit, (Also dass der User auch sieht dass es lädt und einen code der in dieser zeit dem User alle tätigkeiten verbietet.

    Hoffe ich habe alles verständlich erklärt. (Noch ne Info am Rande: Mein Programm probiert auf einige FTP server zuzugreifen, also ohne internetverbindung kann es mal fast ne minute dauern bis der code fertig ausgeführt ist, da ist ein wartescreen schon sinvoll.

    PS: Kennt jemand von euch wot? dort giebt es so einen Ladescreen der grafisch so ist und auch wärend der Ladezeit ander aktivitäten verbietet

    MFG
    Reicht dafür nicht einfach der Wait-Cursor?
    Ich stelle bei längeren aktionen einfach nur den Cursur um das ist normal ausreichend.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    SidezockingLP schrieb:

    FTP server zuzugreifen, also ohne internetverbindung kann es mal fast ne minute dauern

    Dann hast Du da schon mal was falsch, Du solltest erst im vorhinein testen ob eine Verbindung zum Internet möglich ist was gerade mal wenige Sekunden in Anspruch nimmt!

    SidezockingLP schrieb:

    der Ladezeit ander aktivitäten verbietet

    Ruerte schrieb:

    Form.ShowDialog aufrufen, um sicherzustellen das in der Hauptform keine Usereingaben mehr möglich sind!

    Wenn Du eine neue Form als Dialog aufrufst kann in der Ursprünglichen Form der User keine eingaben tätigen, erst nachdem der Dialog wieder geschlossen wurde!
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Ok also ich Habe jetzt am Anfang des codes den Befehl showdialog zum öffnen des wartescreens eingefügt. Es funktioniert super dass man nichts anderes mehr klicken kann :)

    Allerdings bricht er den code nach dem öffnen ab. Wie kann ich das fixen? :/

    VB.NET-Quellcode

    1. Private Sub forumHS_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Waitscreen.ShowDialog()
    3. Dim test As String = "irgendeintest"



    @Schamash
    ​Reicht dafür nicht einfach der Wait-Cursor?

    Das habe ich mir auch schon überlegt aber das ist halt eine nicht so schöne lösung, Sieht halt nicht so schön aus finde ich

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

    Ich gaube das übersehen die meisten hier:

    SidezockingLP schrieb:

    in einer Form einen button und wenn ich diesen drücke wird ziemlich viel Code ausgeführt. Drücke ich diesen button dann die ganze zeit stürzt das Programm irgendwann ab. (Also keine Rückmeldung)
    1. Das Programm stürzt nicht ab, es arbeitet so schnell wie es der Thread erlaubt, doch es kann Windows nicht mehr Antworten, da den MessagePumps hinter der Form, keine CPU-Zeit mehr zukommt. Daher sagt windows was los ist, die Anwendung reagiert nicht mehr auf Events von Windows (keine Rückmeldung).
    2. Waitscreen.ShowDialog()Zeigt eine Form an, und verhindert jegliches Anklicken der "dahinterliegenden" Form. Gleichzeitig wartet es aber auch auf eine Userinteraktion bzw. auf ein Setzen der Result Property, die dann den Rückgabewert der .ShowDialog() darstellt. Bis dahin wird jegliche Codeausführung "blockiert" (Die MessagePumps der aufgerufenen Form laufen).
    3. Was du brauchst ist die Auslagerung deines Codes in einen Task. Welche .NET Version und VS Version benutzt du?

    SidezockingLP schrieb:

    wenn ich diesen drücke wird ziemlich viel Code ausgeführt
    Viel Code (also viele Zeilen von Code) oder einfach "nur Code", welcher für seine Ausführung lange Zeit braucht?

    Sollte ersteres der Fall sein, dann solltest du vielleicht einmal versuchen "unnötigen" Code - also Codeteile, die immer wieder verwendet werden - auszulageren und in eigene Methoden zu packen. Wenn jedoch der zweite Fall zutrifft - wovon ich eher ausgehe - kannst du versuchen diese "lang laufenden Arbeitsschritte" in einen eigenen Task/Thread auszulagener. Dieser wird dann asynchron zu deinem aktuellen UI ausgeführt (blockiert dir halt dein UI nicht).
    Kurze Erklärung: Du hast die Möglichkeit einen Task zu starten, welchen du als ganz normale Funktion behandeln kannst (Parameter übergeben und ein Ergebnis am Ende erhalten). Der einzige Unterschied ist, dass diese spezielle Funktion den Vorteil hat, dass sie dir erlaubt TROTZ längerer Laufzeit, dir deine Anzeige nicht zu behindern. Spricht: du kannst den Task starten, welcher dir deine FTP Server abgrast und trotzdem die Form weiter verwenden, ohne, dass sie sich aufhängt und "Keine Rückmeldung" anzeigt.

    SidezockingLP schrieb:

    stürzt das Programm irgendwann ab
    und

    SidezockingLP schrieb:

    Also keine Rückmeldung
    sind zwei unterschiedliche Sachen. Das Erste (Abstürzen) meint schlicht das Beenden der Anwendung mit einer Fehlermeldung. Sollte das eintreten musst du das Programm von neuem Starten. Es kann unter KEINEN Umständen wieder in einen funktionierenden Zustand zurück gebraucht werden. Bei "Keine Rückmeldung" reagiert schlicht und ergreifend die Oberfläche nicht mehr. Das kann etwa durch eine Endlosschleife oder einen lang laufenden Auftrag (WebRequest/Request auf FTP Server) zustande kommen. Hier ist es der Anwendung MÖGLICH wieder in einen interaktiven Zustand zu gelangen OHNE, dass die Anwendung geschlossen und neu gestartet werden muss.

    SidezockingLP schrieb:

    mit dem Befehl .Show geöffnet

    SidezockingLP schrieb:

    Waitscreen.ShowDialog()
    Oben schreibst du zwar von .Show() und hier von .ShowDialog(). Bitte stelle sicher, dass dir der Unterschied zwischen den beiden bekannt ist.

    Was du machen kannst - je nach dem WAS genau du dir von deiner FTP Server Abfrage erwartest - ist folgendes: Erstelle dir einen (generischen) Task, welcher dir deine Server Anfragen verarbeitet. Solange dieser Task läuft, kannst du dem Benutzer entweder einen WaitingCourser anzeigen oder falls du WPF verwendest/verwenden willst, ein über deine Anwendung gelegtes, verstecktes Panel wieder sichtbar machen und darin eine Animation laufen lassen

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    SidezockingLP schrieb:

    Waitscreen.ShowDialog()
    https://www.vb-paradise.de/index.php/Thread/88463-Dialoge-Instanziierung-von-Forms-und-Aufruf-von-Dialogen/ :!:

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @EaranMaleasi
    Ich verwend Microsoft Visual Studio 2010
    Microsoft .NET Framework
    Version 4.5.51650 RTMRel

    Nochmal was ich brauche :)
    Ich möchte bei starten eines Codes eine Form laden die sich am ende des codes wieder schließt und die man nicht wegmachen kann!

    Aktuelle Probleme:
    Mit dem Befehl .Show wird die Form erst am ende des codes geöffnet
    Mit dem Befehl .Showdialog kann man die form zwar nicht wegmachen, sie stoppt aber den Code bis man sie schließt

    Habt ihr ideen :) Immer her damit :)
    Ja, schon klar. Du musst wenn schon den Code in dieser Form ausführen. Das hat EaranMaleasi doch auch so erklärt...

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Okee :) Also zum anfang ich lerne erst vb :)

    Also @Radinator
    1. Fall 2 ist der fall. Das programm reagiert nicht mehr durch das ständige neu ausführen des Codes
    2.
    Spricht: du kannst den Task starten, welcher dir deine FTP Server abgrast und trotzdem die Form weiter verwenden, ohne, dass sie sich aufhängt und "Keine Rückmeldung" anzeigt.

    Das ist imgrunde eine ganz gute idee Nur: Der Grund warum ein User des Programmes den Button so oft drückt ist ja weil er nicht weiß dass im Hintergrund schon das laden des Forms im gange ist! Er denkt ja es passiert nicht... Deshalb will ich ja einen Ladescreen damit er weiß dass die aktion die er machen will gerade im gange ist und dadurch dass dem Benutzer verboten werden soll andere Aktionen auszuführen kann es auch nichtmehr zu "Keine Rückmeldung " kommen

    Da ich ja anfänger bin wie aufwändig ist dass den so einen Code in einem neuen Task zu starten, und wie mache ich das. Würde dieses Warteform ja gerne bei vielen codes anwenden dann wäre es blöd wenn ich erst 4 Stunden jeden dieser codes irgendwie auslagern muss oder so :)

    Okee da ich nicht weiß ob ich mich nicht einfach schlecht ausdrücke was ich haben will probiere ich es jetzt nochmal zu schildern :)

    Bsp:
    1. Benutzer drückt einen Button der ein anderes Form startet
    2. In diesem Form_Load event ist ein Code
    3.Am Anfang vom code möchte ich egal wie ein noch anderes Form anzeigen (=Wartescreen" oder Ladescreen) -< Hier ist das Problem
    4. Dann den Code weiter ausführen (=Wartescreen ist geöffnet)
    5. Am Ende des Codes das WartescreenForm wieder schließen
    6. Dann öffnet sich ja automatisch die andere Form da wir ja im Load event sind :)

    Ziel ist dass der User weiß/sieht durch das Ladeform dass seine Aktion momentan im gang ist + dass er in der zeit nichts machen kann


    .Show() und hier von .ShowDialog(). Bitte stelle sicher, dass dir der Unterschied zwischen den beiden bekannt ist.

    Ich weiß auch dass Form.show und showdialog nicht geignet sind

    Mein Code hat auch nicht nur mit FTP-Server zu tuen ich ändere auch text deklariere Variablen schreibe textdateien usw. / also hat nichts rein mit ftp zu tuen. Es lädt halt alles was das form an daten braucht :)
    mal eine andere Idee:
    was ist, wenn du deinen Code in Threads ausführst, und über den Thread-Vorgang deine Button/Controls Visible/Invisible schaltest?
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:

    SidezockingLP schrieb:

    so einen Code in einem neuen Task zu starten, und wie mache ich das
    Asynchrone Programmierung und Multithreading ist ein etwas umfangreicheres Thema, in das man sich etwas einarbeiten muss, da es viel zu beachten gibt. Unter anderem Prozesssynchronisation durch das Problem der Nebenläufigkeit mit kritischen Abschnitten, Deadlocks etc. Wobei das hier noch nicht so großartig ein Problem sein sollte. Zzgl. zu den Tasks solltest Du Dir dann Async und Await anschauen.

    Lies Dich mal hier etwas ein und durchforste das Internet etwas danach. Generell solltest Du dann auch wissen, was Delegaten und Lambdaausdrücke sind, da man die da auch öfters gebrauchen kann.

    Und das was Acr0most meint, fände ich auch besser. Statt hier eine neue Form aufzumachen, kann man das auch so in die bisherige integrieren. Zusätzlich kann man ja noch eine Warteanzeige (Wartecursor) o. ä. einbauen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    ergänzend zu Trade: vb-paradise.de/index.php/Thread/108880-Async-Await-und-Task/


    kleines Tut von EdR, wo man auch ohne das ganze Fach-Chinesisch mal merkt worum es geht und das ganze in einem Beispiel noch testen und ausprobieren kann.


    EDIT#1: Danke für den Hinweis, erledigt.
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    @Acr0most Danke für die Ergänzung. Aber bitte nutze HTTPS bzw. stelle den Link über das Protokoll zur Verfügung, sonst wird man direkt ausgeloggt.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hey Leute Habe mir jetzt die ganze zeit euere Artikel durchgelesen und wollte das ganze Jetzt anwenden...Ich merke jetzt dass alle artikel von euch für vbs 2012 ist :( Hab ich net :(

    @EaranMaleasiIch verwend Microsoft Visual Studio 2010Microsoft .NET FrameworkVersion 4.5.51650 RTMRel​


    Geht das ganze auch in 2010? Und wenn ja wie schreibt man es um?

    das z.b geht nicht

    VB.NET-Quellcode

    1. ​Private Async Sub btGetHtml_Click(sender As Object, e As EventArgs) Handles btGetHtml.Click

    Fehler Endof anweisung erwartet! :(
    Ich glaub mit VS 2010 geht das auch nicht richtig. Aber mal ehrlich, warum nutzt Du eine so alte Version? Hol Dir halt mal VS 2015 Community, die ist kostenlos und hat alle VS Professional-Features.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Developement Das is absolut nicht der Sinn eines Forums. Wenn Du eine Lösung parat hast, dann poste sie hier.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: