2011-01-17 8 views
1

In einer Windows-Desktop-Anwendung (Windows Forms), ich habe eine while-Schleife in (C#) erstellt:Warum führt eine Endlosschleife dazu, dass ein Programm nicht reagiert?

bool stop = false; 
while (!stop){  
... 
// code to update a label that displays the number of times the loop executed. 
... 
} 

Wenn eine Schaltfläche geklickt wird, "stop" wahr gemacht wird und die Schleife zu stoppen. Ich habe jedoch keine Möglichkeit, auf die Schaltfläche zu klicken, nachdem die Anwendung ausgeführt wurde, da sie nicht mehr reagiert.

das ist eine Sache. Die andere Sache, die mich mehr verwirrt, ist, warum das Etikett nicht die Anzahl der Schleifen zeigt. Es ist, als würde das Programm nur Schleifen und nichts tun.

Wenn Sie sich fragen, ich versuche, Code für eine Spielschleife zu schreiben.

Antwort

2

Windows-Anwendungen funktionieren, indem sie auf Windows-Nachrichten reagieren.
Alle WinForms-Ereignisse stammen tatsächlich von Windows-Nachrichten wie WM_PAINT oder WM_MOSUEMOVE.

Die Klasse Application des .Net-Frameworks führt eine Nachrichtenschleife aus, die Windows nach der nächsten Nachricht fragt und dann die Nachricht entsprechend verarbeitet.

Wenn der Benutzer beispielsweise auf eine Schaltfläche klickt, sendet Windows dem Programm eine WM_CLICK-Nachricht. Die Nachrichtenschleife von .Net konvertiert dies in ein Click Event und führt alle Event Handler aus, die Sie registriert haben.
Während der Code ausgeführt wird, reagiert die Anwendung auf alle empfangenen Nachrichten und kann nicht auf Nachrichten antworten.
Daher scheint es eingefroren.

Sie sollten Ihre Schleife durch eine Timer Komponente ersetzen.
Bewegen Sie den Schleifenkörper in den Tick-Handler und stellen Sie Interval auf etwa 20 oder 50 ein.

+0

Damit es funktioniert: Platzieren Sie die Endlosschleife in einem separaten Thread. –

+0

@Time: Nein, nicht. Das wird Threading-Probleme verursachen. – SLaks

+0

Als wie geht es emissionslos? –

Verwandte Themen