2011-01-13 10 views
0

Ich möchte ein Fenster erstellen und zeigen einige Bildanzeige (wie Animation basierend auf SetTimer()) auf Fenster erstellt mit CreateWindow() Funktion. Aber es sollte in einem separaten Thread erstellt werden und sollte am Leben bleiben, bis Benutzer dies schließt. Ich habe es versucht, war aber nicht erfolgreich.Erstellen von Fenster in Kind Thread in VC++

EDITED

Ich habe gegoogelt ich diesen Link gefunden How To Create Windows in a Multithreaded Application aber eine Sache, die ich wissen will, wenn Window Procedure aufgerufen erhalten. Wenn es vom System aufgerufen wird, dann wie kann ich es von meinem child thread anrufen.

+0

Was haben Sie versucht? –

+0

Nun, ich habe 3 Funktion 1> 'showWindow()' erstellt, die nur Fenster und Anzeigen erstellen (aus Child-Thread aufgerufen). 2> 'SetTimer()' zum Einstellen des Zeitintervalls (500 ms) für das Laden des Bildes (von Child Thread aufgerufen). 3> 'LoadImage()' um das Image zu laden (aufgerufen von 'WindowsProc's' WM_PAINT' Event). Aber mein Fenster scheint zu frieren und Cursor zeigen beschäftigt Symbol. –

Antwort

1

Windows (dargestellt durch HWNDs) in Windows haben eine Thread-Affinität. Ihr WindowProc wird immer im Kontext des Threads aufgerufen, mit dem sie erstellt werden.

Als solche sind sie eine bequeme Möglichkeit, Anrufe zwischen Threads zu serialisieren, da die PostMessage- und SendMessage-APIs von jedem Thread in der Anwendung aufgerufen werden können, aber WindowProc im Kontext des ursprünglichen Erstellungsthreads ausgeführt wird.

Da WM_TIMER in Message Queues gepostete Nachrichten der Mechanismus sind, mit dem SetTimer funktioniert, müssen Sie beim Aufrufen von SetTimer in einer Multithread-Anwendung vorsichtig sein - Die Timernachrichten werden vom aufrufenden Thread verarbeitet (wenn der Parameter hwnd NULL ist)) oder der Thread des Fensters.

Sie müssen auch darauf achten, eine Nachrichtenschleife auf jeden Thread zu legen, der möglicherweise Fenster erstellt oder Timer verarbeiten möchte.

+0

können Sie mir sagen, wie "WindowProc" von untergeordneten Thread aufrufen? –

+0

Wie ich bereits sagte - wenn Sie SendMessage oder PostMessage von einem anderen Thread als dem Windows-Thread aufrufen, wird der WindowProc in einem eigenen Thread aufgerufen. –

1

Halten Sie Ihre Benutzeroberfläche auf dem Haupt-Windows-Thread. Das Festlegen eines Timers mit der Windows-API erfordert keinen zusätzlichen Thread (da Ihre WndProc die Timer-Nachricht WM_TIMER erhält).

Auch wenn Sie eine lange laufende Aufgabe ausführen müssen, die möglicherweise die Verwendung eines zusätzlichen Threads erfordert, behalten Sie das Fenster im Hauptthread, machen Sie Ihre Arbeit im worker-thread und posten Sie zurück zum Hauptthread mit Updates.

+0

Lass mich dir sagen, warum ich das tue. Eigentlich muss ich Bilder zeigen, die ich von der Webcam bei Windows Login (eine Art Gesichtserkennung) gemacht habe, wo ich ein paar zusätzliche Einstellungen wie Benutzername, Passwort und Domain-Box hinzugefügt habe. Wenn ich 'CreateWindow' anrufe, werden keine Steuerelemente angezeigt. Es zeigt nur Steuerelemente in der Login-Benutzeroberfläche, nachdem ich mein benutzerdefiniertes Fenster geschlossen habe. –