Schleife stürzt ab! Windows Forms

CKS07

Mitglied
Also ich habe ein problem mit einer Schleife, da diese einen großen Bereich durchläuft, stürzt die windows anwendung immer ab bzw. wenn man lange wartet und die schleife fertig ist, geht es wieder...gibt es da irgend eine lösung es besser hinzubekommen?

ich dachte so was wie "Application->ProcessMessages();" ...doch ich das geht bei mir nicht. Ich verwende MS Visual Studios!

Danke schon mal für die Hilfe!:)
 
Moin,

Also ich habe ein problem mit einer Schleife, da diese einen großen Bereich durchläuft, stürzt die windows anwendung immer ab bzw. wenn man lange wartet und die schleife fertig ist, geht es wieder...gibt es da irgend eine lösung es besser hinzubekommen?

Aha - und was soll dazu jetzt jemand sagen ? ? ? ? ? :confused:

Nach dem einen Satz von Dir doch wohl nur bestenfalls "dann mach' halt die Schleife kleiner" ....... :suspekt:

Poste erstmal Deinen Code und ggf. die Fehlermeldung beim Absturz und dann Deine genau Frage dazu, sonst wird das wohl nix :rolleyes:

Gruß
Klaus
 
Okay also kleiner machen geht leider net:D...und es kommt keine richtige fehlermeldung...und zwar steht dann nur "Programm reagiert nicht mehr"....man kann während die schleife läuft nicht mal mehr auf ein button klicken! :(
 
Erstmal Begriffsdefinitionen:

Absturz = Programm stürzt ab, wird also ungeplant mit einem Fehler beendet. NAchdem ein Programm abgestürzt ist kann es de fakto nicht mehr "weiterlaufen"

Programmhänger = Das Programm hängt sich auf ohne abzustürzen und muss dann meisten von Aussen manuell "abgeschossen" werden.



So, das Problem ist simpel. Windows.Forms ist Singlethreaded (siehe MSDN). Wenn Du also in einer Funktion der Form eine langlaufende Schleife hast blokiert die natürlich solange den Thread der Form. Solange der Thread blockiert ist kann die form natürlich nichts anderes mehr machen.

Solche Sachen darf man halt nicht im ausführenden Thread der Form machen sondenr dafür gibts das Konzept von BackgroundWorker.
 
Okay danke erstmal, sie schon ganz schön kompliziert aus, aber werde mich da mal versuchen durch zu arbeiten
 
Alles halb so wild :)

Du erzeugst ein BackgroundWorker-Objekt und abonnierst die Events "DoWork" und "RunWorkerCompleted".
In die DoWork-Methode kommt die lange Schleife und die RunWorkerCompleted-Methode wird aufgerufen, wenn "DoWork" fertig ist.
Gestartet wird der Backgroundworker mit der Methode "RunWorkerAsync" des BackgroundWorker-Objekts.

Gruß
MCoder
 
:eek::eek: okay das hat mich nen bissel verwirrt jetzt....habe gestern schon ein wenig im internet gesucht nach tutorials...aber bis jetzt habe ich noch net ganz hinbekommen...vielleicht kann mal jemand ganz kurz einen kompletten bsp. code reinstellen...das wäre nett...

Gruß
 
Damit sollte das Prinzip klar sein:
C++:
MyForm()
{
    //...

    // Der BackgroundWorker wird im Kontruktor der Form initialisiert
    System::ComponentModel::BackgroundWorker^ Worker = new System.ComponentModel.BackgroundWorker();
    Worker->DoWork             += gcnew DoWorkEventHandler(this, &BackgroundWorker_DoWork );
    Worker->RunWorkerCompleted += gcnew RunWorkerCompletedEventHandler(this, &BackgroundWorker_RunWorkerCompleted);
    Worker->->RunWorkerAsync();

    // ...
}

void BackgroundWorker_DoWork( Object^ sender, DoWorkEventArgs^ e )
{
    // lange Schleife
}

void BackgroundWorker_RunWorkerCompleted( Object^ sender, RunWorkerCompletedEventArgs^ e )
{
    // Backgroundworker ist fertig -> Ergebnisse der Schleife können verarbeitet werden
}
Gruß
MCoder
 

Neue Beiträge

Zurück