<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Mehrere Fenster mit eigener WndProc]]></title><description><![CDATA[<p>Hi,</p>
<p>folgendes:<br />
In einem fertigen Programm wird ein Fenster verwendet, dass aus einer DLL heraus erstellt wird. Dazu werden einer exportierten Funktion der DLL die Angaben über Fenstergröße, -position, Parentwindow (natürlich das, in dem das Fenster dargestellt werden soll) und andere, anwendungsspezifische Infos wie Hintergrundfarbe o.ä. mitgeteilt. Diese Funktion registriert dann eine neue WindowClass und erstellt mit dieser ein neues Fenster. Das Fenster hat seine eigene WndProc, in der Dinge wie Klicks aufs Fenster und ähnliches verarbeitet werden. Zusätzlich kann man über weitere exportierte Funktionen auf diverse Eigenschaften Einfluss nehmen, so z.B. die Hintergrundfarbe ändern.</p>
<p>Funktioniert alles wunderbar. Wie erwartet läuft das ganze auch im Hauptthread des aufrufenden Programms.</p>
<p>Nun möchte ich zwei Sachen ändern: Zum einen soll die WndProc des Fensters in einen eigenen Thread ausgelagert werden, damit die doch recht aufwendigen Zeichenoperationen nicht die Benutzung des Hauptprogramms stören.</p>
<p>Zum anderen sollen verschiedene Instanzen dieses Fensters erzeugt werden können, die völlig unabhängig voneinander in eigenen Threads laufen.</p>
<p>Zunächst hatte ich mir nun gedacht, eine Klasse WindowManager zu schreiben, die innerhalb der DLL instanziiert wird. Diese Klasse verwaltet nun Objekte der Klasse Window, d.h. legt sie an, verwaltet Zeiger darauf in einem vector, gibt Zugriffsmöglichkeiten und gibt die Windows bei Bedarf wieder frei. Den generellen Zugriff wollte ich weiterhin über statische Funktionen der DLL ermöglichen. Dazu sollte bei Erzeugung eines neuen Windows eine eindeutige Nummer vergeben werden, die dem Hauptprogramm mitgeteilt wird und beim Aufruf der DLL-Funktionen verwendet wird, um das Fenster korrekt zu identifizieren.</p>
<p>Jedes Mal, wenn nun ein Fenster erzeugt wird, soll der dazugehörige Thread starten. Prinzipiell soll die Anzahl der maximal erzeugbaren Fenster nur von der Leistung des Rechners oder des Betriebssystems begrenzt werden (Gibts eigentlich eine maximale Anzahl Threads pro Prozess in WinXP/2000?).</p>
<p>Nun ist meine Frage, ob diese Ansatz erfolgversprechend oder von vornherein zum Scheitern verurteilt ist? Meine Erfahrungen mit Windows-Threads sind bisher äußerst oberflächlich, daher bin ich mir möglicher Fallstricke nicht wirklich bewusst.</p>
<p>Wichtig ist vielleicht noch, dass in den Fenstern mit OpenGL gezeichnet wird. In meiner bisherigen Variante funktioniert dies gut, bei den Threads bin ich mir da nicht sicher. Immerhin weiß ich schon, dass ich den Rendering Context für jeden Thread neu anfordern und wieder freigeben muss.</p>
<p>Wenn jemand einen hilfreichen Kommentar dazu hätte, würde ich mich über eine Antwort freuen!</p>
<p>Gruß<br />
Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/193636/mehrere-fenster-mit-eigener-wndproc</link><generator>RSS for Node</generator><lastBuildDate>Tue, 30 Jun 2026 05:49:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/193636.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Sep 2007 08:32:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mehrere Fenster mit eigener WndProc on Fri, 28 Sep 2007 08:32:43 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>folgendes:<br />
In einem fertigen Programm wird ein Fenster verwendet, dass aus einer DLL heraus erstellt wird. Dazu werden einer exportierten Funktion der DLL die Angaben über Fenstergröße, -position, Parentwindow (natürlich das, in dem das Fenster dargestellt werden soll) und andere, anwendungsspezifische Infos wie Hintergrundfarbe o.ä. mitgeteilt. Diese Funktion registriert dann eine neue WindowClass und erstellt mit dieser ein neues Fenster. Das Fenster hat seine eigene WndProc, in der Dinge wie Klicks aufs Fenster und ähnliches verarbeitet werden. Zusätzlich kann man über weitere exportierte Funktionen auf diverse Eigenschaften Einfluss nehmen, so z.B. die Hintergrundfarbe ändern.</p>
<p>Funktioniert alles wunderbar. Wie erwartet läuft das ganze auch im Hauptthread des aufrufenden Programms.</p>
<p>Nun möchte ich zwei Sachen ändern: Zum einen soll die WndProc des Fensters in einen eigenen Thread ausgelagert werden, damit die doch recht aufwendigen Zeichenoperationen nicht die Benutzung des Hauptprogramms stören.</p>
<p>Zum anderen sollen verschiedene Instanzen dieses Fensters erzeugt werden können, die völlig unabhängig voneinander in eigenen Threads laufen.</p>
<p>Zunächst hatte ich mir nun gedacht, eine Klasse WindowManager zu schreiben, die innerhalb der DLL instanziiert wird. Diese Klasse verwaltet nun Objekte der Klasse Window, d.h. legt sie an, verwaltet Zeiger darauf in einem vector, gibt Zugriffsmöglichkeiten und gibt die Windows bei Bedarf wieder frei. Den generellen Zugriff wollte ich weiterhin über statische Funktionen der DLL ermöglichen. Dazu sollte bei Erzeugung eines neuen Windows eine eindeutige Nummer vergeben werden, die dem Hauptprogramm mitgeteilt wird und beim Aufruf der DLL-Funktionen verwendet wird, um das Fenster korrekt zu identifizieren.</p>
<p>Jedes Mal, wenn nun ein Fenster erzeugt wird, soll der dazugehörige Thread starten. Prinzipiell soll die Anzahl der maximal erzeugbaren Fenster nur von der Leistung des Rechners oder des Betriebssystems begrenzt werden (Gibts eigentlich eine maximale Anzahl Threads pro Prozess in WinXP/2000?).</p>
<p>Nun ist meine Frage, ob diese Ansatz erfolgversprechend oder von vornherein zum Scheitern verurteilt ist? Meine Erfahrungen mit Windows-Threads sind bisher äußerst oberflächlich, daher bin ich mir möglicher Fallstricke nicht wirklich bewusst.</p>
<p>Wichtig ist vielleicht noch, dass in den Fenstern mit OpenGL gezeichnet wird. In meiner bisherigen Variante funktioniert dies gut, bei den Threads bin ich mir da nicht sicher. Immerhin weiß ich schon, dass ich den Rendering Context für jeden Thread neu anfordern und wieder freigeben muss.</p>
<p>Wenn jemand einen hilfreichen Kommentar dazu hätte, würde ich mich über eine Antwort freuen!</p>
<p>Gruß<br />
Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374229</guid><dc:creator><![CDATA[mad_martin]]></dc:creator><pubDate>Fri, 28 Sep 2007 08:32:43 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Fenster mit eigener WndProc on Fri, 28 Sep 2007 09:47:53 GMT]]></title><description><![CDATA[<p>mad_martin schrieb:</p>
<blockquote>
<p>Nun möchte ich zwei Sachen ändern: Zum einen soll die WndProc des Fensters in einen eigenen Thread ausgelagert werden, damit die doch recht aufwendigen Zeichenoperationen nicht die Benutzung des Hauptprogramms stören.</p>
</blockquote>
<p>Das ist unmöglich. Ein Fenster und alle läuft immer in dem Thread, in dem es erzeugt wurde. Auch dort kommt die Fensternachricht an.</p>
<p>mad_martin schrieb:</p>
<blockquote>
<p>Zum anderen sollen verschiedene Instanzen dieses Fensters erzeugt werden können, die völlig unabhängig voneinander in eigenen Threads laufen.</p>
</blockquote>
<p>Antwort siehe oben.<br />
Ich kann nur dringend abraten solche threadübergreifenden Fenster zu erzeugen, die dann auch noch Ihre Parents in anderen Threads haben. Das kostet mehr Performance als es überhaupt bringt.<br />
Jede Nachricht, die an einen anderen Thread laufen muss löst eine Threadsynchronisation aus.</p>
<p>mad_martin schrieb:</p>
<blockquote>
<p>Nun ist meine Frage, ob diese Ansatz erfolgversprechend oder von vornherein zum Scheitern verurteilt ist? Meine Erfahrungen mit Windows-Threads sind bisher äußerst oberflächlich, daher bin ich mir möglicher Fallstricke nicht wirklich bewusst.</p>
</blockquote>
<p>Es geht nicht! Fenster sind threadafin. Wohersoll hier ein Performance Vorteil kommen, wenn sowieso der User die Darstellung verzögert sieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374274</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 28 Sep 2007 09:47:53 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Fenster mit eigener WndProc on Fri, 28 Sep 2007 10:11:55 GMT]]></title><description><![CDATA[<p>Also wäre es tatsächlich sinnvoller, die Fenster im Thread des Hauptprogramms erzeugen zu lassen? Ist der Overhead bei Nachrichten zwischen Threads tatsächlich so groß? Ist es generell nachteilig, Fenster auf Threads zu verteilen oder nur in meinem Fall?</p>
<p>Was wäre im Falle z.B. eines Fehlers in meiner WndProc, der verhindert, dass die Nachricht korrekt abgearbeitet wird (z.B. Endlosschleife,...)? Würde das das komplette Programm runterziehen, da die WndProc ja nicht mehr verlassen wird?</p>
<p>gruß<br />
Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374280</guid><dc:creator><![CDATA[mad_martin]]></dc:creator><pubDate>Fri, 28 Sep 2007 10:11:55 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Fenster mit eigener WndProc on Fri, 28 Sep 2007 10:38:38 GMT]]></title><description><![CDATA[<p>mad_martin schrieb:</p>
<blockquote>
<p>Würde das das komplette Programm runterziehen, da die WndProc ja nicht mehr verlassen wird?</p>
</blockquote>
<p>es würde zumindest dazu führen, dass das fenster auf nix mehr reagiert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374301</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 28 Sep 2007 10:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Fenster mit eigener WndProc on Fri, 28 Sep 2007 10:52:41 GMT]]></title><description><![CDATA[<p>Das war mir schon klar. Ist nur die Frage, ob das sich auch auf das Hauptfenster auswirkt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374310</guid><dc:creator><![CDATA[mad_martin]]></dc:creator><pubDate>Fri, 28 Sep 2007 10:52:41 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Fenster mit eigener WndProc on Fri, 28 Sep 2007 11:29:26 GMT]]></title><description><![CDATA[<p>mad_martin schrieb:</p>
<blockquote>
<p>Also wäre es tatsächlich sinnvoller, die Fenster im Thread des Hauptprogramms erzeugen zu lassen? Ist der Overhead bei Nachrichten zwischen Threads tatsächlich so groß? Ist es generell nachteilig, Fenster auf Threads zu verteilen oder nur in meinem Fall?</p>
</blockquote>
<p>Alle Fenster einer UI Einheit sollten in einem Thread liegen.</p>
<p>Der Overhead ist:<br />
Wird eine simple Nachricht an den anderen Thread gesendet via SendMessage, dann kehrt SendMessage nicht zurück bis dieNachricht bearbeitet wurde.<br />
D.h. aber in diesem Fall. Die Nachricht wird nicht direkt an die WNDProc gegeben, sondern in die Nachrichtenschleife eingereiht und erst wenn GetMessage, das nächste mal ausgeführet wird und diese Nachricht an die Reihekommt wird sie berabeitet und dann kann der aufrufende Thread weiterarbeiten.</p>
<p>Das ist eine Threadsynchronisation und genau in diesem Fall reihen sich ale Aktivitäten der Fensterlinear hinereineinader und man nichts von den Thraeds.</p>
<p>Dazu kommt, dass man ultraleicht Deadlocks bauen kann... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>mad_martin schrieb:</p>
<blockquote>
<p>Was wäre im Falle z.B. eines Fehlers in meiner WndProc, der verhindert, dass die Nachricht korrekt abgearbeitet wird (z.B. Endlosschleife,...)? Würde das das komplette Programm runterziehen, da die WndProc ja nicht mehr verlassen wird?</p>
</blockquote>
<p>Logo! Was denkst denn Du? Das ganze ist doch nur ein Thread und wenn Dein Code läuft, dann läuftnichts für ein anderes Fenster in dem Thread!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374338</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 28 Sep 2007 11:29:26 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Fenster mit eigener WndProc on Thu, 04 Oct 2007 05:46:58 GMT]]></title><description><![CDATA[<p>Danke für die Infos. War mir da nicht sicher, jetzt hab ich Gewissheit.</p>
<p>gruß<br />
Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1377538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1377538</guid><dc:creator><![CDATA[mad_martin]]></dc:creator><pubDate>Thu, 04 Oct 2007 05:46:58 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Fenster mit eigener WndProc on Thu, 04 Oct 2007 06:07:57 GMT]]></title><description><![CDATA[<p>Wenn Dein Programm nichts mehr macht, als nur Daten in dem fremden Programm auszulesenund selbst sonst nichts tut (jedenfalls nichts zeitintensives), dann ist kaum zu erwarten, dass ein C++ Programm schneller ist.<br />
Das Problem ist hier die Interprozesskommunikation und wie schnell die andere Aplikation Deine Nachricht bearbeitet., sprich wie oft diese die Nachrichtenschleife abarbeitet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1377556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1377556</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Thu, 04 Oct 2007 06:07:57 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Fenster mit eigener WndProc on Thu, 04 Oct 2007 06:44:11 GMT]]></title><description><![CDATA[<p>Mein Programm bekommt Daten aus dem übergeordneten Programm und stellt diese als 3D-Diagramm dar. Als einzig wirklich nennenswerte Interaktion gibts halt die Möglichkeit, das Diagramm per Maus um alle drei Raumachsen zu rotieren.</p>
<p>Wahrscheinlich ist es am sinnvollsten, nur die Zeichenroutine in den Thread auszulagern, den man dann einfach mal schlafenlegen kann, wenn gerade keine Aktualisierung benötigt wird. Die Bearbeitung der Benutzereingaben ist im Gegensatz zur Darstellung zu vernachlässigen und kann dementsprechend ohne Probleme im normalen Hauptthread vonstatten gehen.</p>
<p>Das Problem war halt nur, dass ich mir über die von dir erwähnte Threadsynchronisation so nicht klar war und gerne die Fenster schön voneinander getrennt laufen lassen wollte. Aber jetzt weiß ich wieder mehr und werde einen etwas anderen Ansatz verfolgen.</p>
<p>gruß<br />
Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1377572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1377572</guid><dc:creator><![CDATA[mad_martin]]></dc:creator><pubDate>Thu, 04 Oct 2007 06:44:11 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Fenster mit eigener WndProc on Thu, 04 Oct 2007 08:48:09 GMT]]></title><description><![CDATA[<p>Sorry! Die Antwort war für einen anderen Thread...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1377634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1377634</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Thu, 04 Oct 2007 08:48:09 GMT</pubDate></item></channel></rss>