Frage

Gibt es eine Möglichkeit alle Windows-Nachrichten zu verarbeiten, während der UI-Thread auf einem Waithandle oder anderer Threading wartet primitiv?

Ich weiß, dass es sehr chaotisch reentrancy Probleme schaffen könnte; Ich will es trotzdem tun.

Bearbeiten : Die Wartezeit tritt in der Mitte einer komplizierten Funktion, die auf dem UI-Thread ausgeführt werden muß. Daher ist das Warten auf einen Hintergrund-Thread zu bewegen keine Option. (Aufteilung der Funktion in zwei würde eine komplizierte und wartbaren Einander)

War es hilfreich?

Lösung

würde ich die ganze „Complicated-Funktion-that-can-nicht-sein-split“ laufen in einem separaten Hintergrund-Thread, und haben es nur auf die GUI zu berichten, wenn es muss (Invoke / BeginInvoke Methoden auf Eine Kontrolle).

In einer verbesserten Version, sollen Sie Ihre komplizierte Funktion in einem nicht-UI-Controller ausführen, die nicht auf der Benutzeroberfläche abhängt, und ist leichter zu Unit-Test. Der Aufruf zurück auf die Benutzeroberfläche und zeigt das Ergebnis auf der Benutzeroberfläche kann die Benutzeroberfläche leicht erreicht werden, indem man auf Ereignisse subrscribe von der Steuerung zur Verfügung gestellt.

Andere Tipps

Warum würden Sie nicht nur einen anderen Thread erzeugen die Warte zu tun und haben ihm den UI-Thread über Nachricht (oder was auch immer) zu gegebener Zeit mitteilen?

Das ist der üblicher Ansatz für UI-Thread-Nachricht während einer blockierenden Ereignisbehandlung zu ermöglichen.

EDIT: Ich sehe jetzt - Sie diese App Logik Logik in den UI-Code eingebaut haben. Nun, das ist wirklich ein Design-Problem dann. Du bist besser auf lange Sicht aus, dass die Funktionalität aus dem UI in ein in sich geschlossenes Objekt zu brechen und einen Mechanismus mit Status mit der Benutzeroberfläche von Ihrem Arbeitnehmer zu kommunizieren.

Neben dem Nutzen Ihrer UI-Code konzentrierte sich auf UI zu halten, dies ermöglicht es Ihnen, Unit-Test der Logikcode getrennt.

Nicht sicher C #, aber in einfacher Win32-Programmierung, können Sie eine der MsgWaitFor verwenden ... () Funktionen für die tatsächliche Warte. Es wird Sie informieren, wenn Nachrichten in der Nachrichten-Warteschlange sind, sowie, wenn das Objekt (e) wird signalisiert bediente werden. Wenn es meldet eine Nachricht vorhanden ist, können Sie rufen GetMessage (), Translate () und Dispatch (), um eine Nachricht zu verarbeiten, und dann zu warten, gehen Sie zurück.

Ich würde normalerweise empfehlen Ihren Wartezustand auf einem anderen Thread setzen.

jedoch, dass gesagt wird, können Sie immer ein href nennen <= "http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents.aspx" rel = "nofollow noreferrer "> Application.DoEvents die Nachricht Pumpe an jedem beliebigen Punkt zu verarbeiten, auch während‚warten‘auf einer Warte Griff (nur Timeout tun Ereignisse, wartet mit Timeout, usw., bis Sie‚‘die Waithandle durch) .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top