edit control in eigenem Thread

Thomasio

Erfahrenes Mitglied
Es mag eine blöde Idee sein, aber vielleicht auch die Lösung.

Ich habe eine Win32GUI Anwendung mit mehreren Child-Fenstern inkl. 2 Textfeldern.

Code:
Display            = CreateWindowEx(
                                        WS_EX_CLIENTEDGE,
                                        "edit","",
                                        WS_CHILD|ES_MULTILINE|ES_READONLY,
                                        0,0,200,200,
                                        hWnd,0,hinstance,0
                                       );
Input              = CreateWindowEx(
                                        WS_EX_CLIENTEDGE,
                                        "edit","",
                                        WS_CHILD|ES_MULTILINE,
                                        0,200,200,200,
                                        hWnd,0,hinstance,0
                                       );

Die Anwendung enthält ein paar Funktionen, die etwas Zeit brauchen, z.B. liest sie via WinInet regelmässig Daten von meiner Webseite und zeigt diese im ersten Textfeld an.
Logisch, wenn der User irgendwas in das andere Textfeld schreiben will, während die Anwendung gerade mit WinInet beschäftigt ist, stottert die Anzeige.

Meine Idee wäre, die beiden Textfelder in verschiedene Threads zu packen.
Ich weiss, dass ich dazu 2 Threads mit jeweils eigener Nachrichtenschleife brauche, aber ich bin mir nicht sicher, wie das Grundgerüst dazu aussieht.
Kann ich überhaupt in einem zweiten Thread ein Fenster erstellen, was sich wie ein Child des MainWindow im ersten Thread benimmt?
Wie koordiniere ich z.B. WM_SIZE, so dass das Child im zweiten Thread an seinem Platz bleibt.

Oder ganz grundsätzlich gefragt, ist meine Idee machbar und wenn ja, dann wie, oder wie sonst kann ich das lösen?
 
Native Win32 Programmierung in C ist verdammt komplex und kaum in ein paar Zeilen abzuhandeln. Zumindest würde ich mir schwer damit tun. Ich kann dir aber ein Buch empfehlen, mit dem man sehr gut arbeiten kann: Windows-Programmierung von Charles Petzold. Ist das Standardwerk, um das man nicht herumkommt.

Viel Erfolg, Traveller
 
Ich bin mir nicht ganz sicher, aber ich meine irgendwo gelesen zu haben, dass du die GUI nur vom GUI-Thread verändern kannst.
Ergo müsstest du zuerst eine Nachricht von deinem Thread an den GUI-Thread schicken, welche du dann mit der normalen Nachrichtenschleife abarbeiten kannst.

Aber wieso blockierst du nicht einfach das Textfeld?
 
Danke für die Antworten.
Ich bin nicht mehr ganz der blutige Anfänger mit Win32GUI Anwendungen, auch Multithreaded Anwendungen mit Mutex, CriticalSection, usw., bekomme ich schon ganz gut auf die Reihe.
Nur Multithreaded mit mehreren Nachrichtenschleifen, das ist Neuland für mich, weil ich bisher (wie überall im Web empfohlen) alle Fenster in einem Thread hatte und in anderen Threads nur den rechenintensiven Kram.

Dass ich jetzt trotzdem daran überlege, ob ich nicht eins der Textfelder in einen anderen Thread legen kann liegt daran, dass mein WorkerThread unter bestimmten Umständen in ganz kurzen Abständen das DisplayFenster aktualisieren muss und weil das aus meinem WinInetThread kommt, brauche ich dazu Mutex oder CriticalSection.
Egal wie ich das anstelle, treten dabei im InputFenster merkbare Verzögerungen auf.

Das InputFenster wiederum tauscht überhaupt keine Daten mit dem Rest des GUI aus, sondern übergibt seinen Input an einen anderen WorkerThread, sprich das Einzige, was koordiniert werden muss ist die Position und Grösse des InputChild innerhalb vom MainWindow, alles Andere kann problemlos in einen anderen Thread verschoben werden.

Blockieren will ich das Textfeld nicht, der User SOLL ja ins Feld schreiben können, er soll nur nicht 5 oder 10 Zeichen blind tippen müssen, bevor die Anwendung die Zeit findet das Fenster zu aktualisieren.

Als Gag am Rande, weil ich nicht wusste, bzw. immer noch nicht weiss, wie ich eine GUI auf 2 Threads aufteilen kann, habe ich heute probehalber statt 2 Threads einfach 2 vollkommen getrennte .exe geschrieben, die gegenseitig ihre Positionen mit benutzerdefinierten Nachrichten koordinieren.
Damit bekomme ich exakt das, was ich haben will, nur halt sehr umständlich.

Witzig finde ich, was Google zum Thema ausspuckt.
Auf der einen Seite haufenweise Beiträge, wo jemand behauptet, es sei kein Problem 2 Threads mit jeweils eigener Nachrichtenschleife zu bauen und auf der anderen Seite, sobald jemand nachhakt, WIE das denn zu machen sei, bekommt er zur Antwort, dass man das nicht machen sollte.
 
Verschiedene Fenster in verschiedenen Threads ist kein Problem, solange die Fenster nicht irgendwie zusammenhängen (Parent<>Child oder Owner<>Child).

Wenn du aber Child und Parent in unterschiedlichen Threads erstellt hast, wird das grandios daneben gehen. Es gibt genügend Nachrichten die von oben nach unten bzw. andersrum delegiert werden, damit müssen die WndProcs der beiden HWNDs synchron laufen.

Du solltest den Netzwerkteil von der Edit-Control lösen, auf keinen Fall direkt zugreifen.
 
Danke für die Antwort, das ist ziemlich genau das, was Google auch ausspuckt.

Ich werde mal versuchen, wie ich das anders organisieren kann.
 

Neue Beiträge

Zurück