Laden...

Schleifenabbruch per Click auf Button !/?

Erstellt von alpha_c vor 15 Jahren Letzter Beitrag vor 15 Jahren 6.166 Views
A
alpha_c Themenstarter:in
14 Beiträge seit 2008
vor 15 Jahren
Schleifenabbruch per Click auf Button !/?

Hi leute,

ich will grad anfangen von mit c# zu coden und ein kleinen progi schreiben. und wie das nun ma so ist, wenn man eine neue sprache lernt kommen schon die ersten unklarheitern.

ich will durch einen klick eine prezedur abbrechen, siehe code:


        private void btn_mdto5pw_Click(object sender, EventArgs e)
        {
        // while abbrechen mit btn_stop_Click ? aber wie
            while()
            {
                // tu irgend was
            }

        }

        private void btn_stop_Click(object sender, EventArgs e)
        {

        }

bitte berücksichtigt das ich keinerlei fachsprache oder gar abkürzung verstehe. ich hab 18 jahre lang programmiert allerdings nur basic/pascale/PHP/MySQL und vor langer zeit VB 6.0

J
39 Beiträge seit 2008
vor 15 Jahren

die einfachste möglichkeit wäre wohl diese....



       bool bla;    

        private void btn_mdto5pw_Click(object sender, EventArgs e)
        {

          bla = true;

        // while abbrechen mit btn_stop_Click ? aber wie
            while(bla)
            {
                // tu irgend was
            }

        }

        private void btn_stop_Click(object sender, EventArgs e)
        {
            bla = false;
        }


edit: korrektur...

C
252 Beiträge seit 2007
vor 15 Jahren

eine kleinigkeit passt nicht ganz. die variable bla muss außerhalb von btn_mdto5pw_Click deklariert werden, denn sonst kann man in btn_stop_Click nicht darauf zugreifen.

edit. tjo da war ich ein wenig zu schnell. 😉 haste ja bereits richtig editiert.

J
39 Beiträge seit 2008
vor 15 Jahren

jup, da hab ich mal wieder schneller abgeschickt, als nachgedacht 😉

A
alpha_c Themenstarter:in
14 Beiträge seit 2008
vor 15 Jahren

der tipp sah nicht schlecht auss, nur ist es jetzt so das mein programm sich aufhängt. ich vermute mal wegen der whileschleife. ich komm nach dem startbutton nicht mehr dazu stop zu drücken. bei mir steht dann [keine rückmeldung] . hmm.

J
39 Beiträge seit 2008
vor 15 Jahren

dann versuch mal deine while schleife in einen eigenen thread zu zwängen. Dann sollte sich nicht alles aufhängen?

3.430 Beiträge seit 2007
vor 15 Jahren

Hi,

bei mir steht dann [keine rückmeldung] . hmm.

Das ist so, weil deine While-Schleife eine weile braucht um irgendetwas zu machen. Und während du in deiner While-Schleife bist, reagiert dein Programm auf keine anderen Dinge mehr. Deshalb ist es bei Aufgaben welche eine bestimmte Zeit in anspruch nehmen notwendig diese in Threads auszulagern.

Also folgendes:
Du startest einen Thread, welcher deine Schleife oder was auch immer ausführt. Das wird solange gemacht bis du auf den Button klickst.
D.H. Du kannst gleich vorgehen wie schon von Janch88 beschrieben.
Du musst nur eine zusätzlcihe Methode erstellen, welche in einem neuen Thread ausgeführt wird

mfg
michLG

//Edit: da war wider mal einer schneller....

A
alpha_c Themenstarter:in
14 Beiträge seit 2008
vor 15 Jahren

könntest du mir einen simplen beispielcode zeigen? ich weiss nemlich nicht die ich von dem formularbutton aus bzw über die variable für die abbruchbedingung zu der methode komme. die die schleife beinhaltet. wenn ich das richtig verstanden habe brauche ich eine methode wo nur die schleife drin ist und die muss unabhängig vom rest laufen. ich will von dieser auch ereignisse auswerten, wie eben einen click zum abbruch.

5.299 Beiträge seit 2008
vor 15 Jahren

Hi alpha!

So rutschte mirnixdirnix in ziemlich anspruchsvolle Bereiche der Proggerei hinein.
zu "Warum blockiert mein GUI" (GUI: graphic user interaction-Dingsbums, also Oberfläche) sollte dir die Foren-Suche seitenweise Ergebnisse liefern.

Schönundgut, aber vermutlich ist dein Ansatz schon bisserl daneben:
Was willste eigentlich machen?
Es ist nämlich absolut unüblich, ein Programm in eine while (true){} - Schleife zu schicken - meist gibtes bessere Möglichkeiten, und dann kommste fürs erste auch elegant ums Threading herum.

Der frühe Apfel fängt den Wurm.

A
alpha_c Themenstarter:in
14 Beiträge seit 2008
vor 15 Jahren

ich möchte ein programm schreiben, mit dem ich einen md5 durch bruteforce-methode zu einen passwort mache. der prozess kann also von wenigen sekunden bis mehreren tagen dauern. deshalb sollte es möglich sein den prozess durch cklick abzubrechen. ich hab auch schon an sowas gedacht wie eine if-bedingung nur wie mach ich den rechner klar das der arbeiten soll und gleichzeitig prüft ob jemand den abbruchbutton klickt.

D
3 Beiträge seit 2008
vor 15 Jahren

Hi alpha_c,

an deiner Stelle würde ich es tatsächlich mit einen BackgroundWorker machen.

Nicht wirklich elegant aber für deine Zwecke sicher ausreichend:

Baue ein Application.DoEvents() in deine while Schleife mit ein. Über eine If-modulo-Konstruktion könntest du auch noch dafür sorgen, dass der Aufruf bspw. nur alle 100 Durchläufe stattfindet, denn durch den Einbau von DoEvents() wird dein Programm etwas ineffizienter.

Als zweites erstellst du eine boolsche klassenweite Variable 'Abbruch' (mit Wert false). In deinem Button event setzt du diese dann auf true.

In deiner While-Schleife fügst du dann noch sowas wie

 if (Abbruch) 
{break;} 

ein.

MfG Jochen

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo zusammen,

ich habe nicht alles gelesen, weil ich denke, da die Lösung ohnehin in [FAQ] Warum blockiert mein GUI? steht.

herbivore