<?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[Threads und UpdateData]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Problem:</p>
<p>Ich erzeuge ein von CPropertyPage abgeleitetes Fenster und übergebe den HWND an einen Thread. Dieser soll bei einem Event UpdateData aufrufen. Ich hole mir also im Thread den Zeiger auf das CWnd mit CWnd::FromHandle und rufe UpdateData auf. Nur leider wird dann nur die Basisversion von DoDataExchange aufgerufen und nicht die virtuelle der CPropertyPage-Klasse.<br />
Ich hab jetzt schon wie wild hin und her gecastet aber brachte leider alles nichts. Irgendwie scheint die Objektstruktur über die Threadgrenze hinaus zerstört zu werden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Dankbar für jede Hilfe,</p>
<p>connan. <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/191459/threads-und-updatedata</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 04:38:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/191459.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Sep 2007 13:10:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Threads und UpdateData on Mon, 03 Sep 2007 13:10:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Problem:</p>
<p>Ich erzeuge ein von CPropertyPage abgeleitetes Fenster und übergebe den HWND an einen Thread. Dieser soll bei einem Event UpdateData aufrufen. Ich hole mir also im Thread den Zeiger auf das CWnd mit CWnd::FromHandle und rufe UpdateData auf. Nur leider wird dann nur die Basisversion von DoDataExchange aufgerufen und nicht die virtuelle der CPropertyPage-Klasse.<br />
Ich hab jetzt schon wie wild hin und her gecastet aber brachte leider alles nichts. Irgendwie scheint die Objektstruktur über die Threadgrenze hinaus zerstört zu werden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Dankbar für jede Hilfe,</p>
<p>connan. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1357900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357900</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Mon, 03 Sep 2007 13:10:48 GMT</pubDate></item><item><title><![CDATA[Reply to Threads und UpdateData on Mon, 03 Sep 2007 14:32:08 GMT]]></title><description><![CDATA[<p>Las es einfach bleiben. Sende eine Nachricht an das Fenster, dass in dem entsprechenden ursprünglichen Thread, in dem der Dialog erzeugt wurde UpdateData aufgerufen wird. Alles andere ist einfach übel.</p>
<p>Man sollte MFC Objekte Zeiger und auch Fenster Handle nach Möglichkeit nicht über Threadgrenzen hinweg weitergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357998</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 03 Sep 2007 14:32:08 GMT</pubDate></item><item><title><![CDATA[Reply to Threads und UpdateData on Tue, 04 Sep 2007 08:01:48 GMT]]></title><description><![CDATA[<p>Danke, mit Nachrichten funktionierts. Ich dachte immer Handles wären Threadsicher!? Wie kann ich denn sonst noch eine Nachricht senden?<br />
Wo ich mir auch nicht ganz sicher bin ist, ob ich nach CWnd::FromHandle auch CWnd::DeleteTempMap aufrufen muss, ist das Handle über die Threadgrenze noch 'attached' oder nicht?<br />
Achso, und gibts evtl. eine Nachricht die direkt UpdateData auslöst?.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1358491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1358491</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Tue, 04 Sep 2007 08:01:48 GMT</pubDate></item><item><title><![CDATA[Reply to Threads und UpdateData on Tue, 04 Sep 2007 10:03:46 GMT]]></title><description><![CDATA[<p>connan schrieb:</p>
<blockquote>
<p>Ich dachte immer Handles wären Threadsicher!? Wie kann ich denn sonst noch eine Nachricht senden?</p>
</blockquote>
<p>Handles sind Threadsicher. Nur wird in dem Moment in dem Du eine Nachricht per SendMessage an einen anderen Thread sendest Dein Thread angehalten, bis die Nachricht vom anderen Thread bearbeitet wurde. Das ist dann eine Threadsynchronisation die es zu vermeiden gilt, und die auch leicht Deadlocks verursachen kann.</p>
<p>connan schrieb:</p>
<blockquote>
<p>Wo ich mir auch nicht ganz sicher bin ist, ob ich nach CWnd::FromHandle auch CWnd::DeleteTempMap aufrufen muss, ist das Handle über die Threadgrenze noch 'attached' oder nicht?<br />
Achso, und gibts evtl. eine Nachricht die direkt UpdateData auslöst?.</p>
</blockquote>
<p>Die Maps sind Threadlokal und Du musst nichts tun mit einem Handle das durch FromHandle ermittel wurde. Das Problem siehst Du hier schon: DeleteTempMap wird nur dann aufgerufen wenn Du einen GUI Thread hast. Andernfalls nicht.<br />
Also warum überhaupt CWnd Objekte verwenden?<br />
Mach es nicht und Du hast keine Schwirigkeiten.</p>
<p>Es gibt keine Nachricht für UpdateData. Wenn musst Du selber eine definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1358591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1358591</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 04 Sep 2007 10:03:46 GMT</pubDate></item><item><title><![CDATA[Reply to Threads und UpdateData on Wed, 05 Sep 2007 07:41:40 GMT]]></title><description><![CDATA[<p>Ich nehme für die Nachrichten PostMessage die sollte doch sofort wieder returnieren.<br />
Mit den CWnd-Objekten hast Du natürlich recht, ich dachte halt nur wegen UpdateData...;)<br />
Kann mann evtl. für Threads eine Art Shared-Memory vereinbaren, so daß es doch funktioniert? Nach meinem Verständniss (;)) sollte doch das Codesegment threadsafe sein!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1359174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1359174</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Wed, 05 Sep 2007 07:41:40 GMT</pubDate></item><item><title><![CDATA[Reply to Threads und UpdateData on Wed, 05 Sep 2007 10:18:06 GMT]]></title><description><![CDATA[<p>connan schrieb:</p>
<blockquote>
<p>Ich nehme für die Nachrichten PostMessage die sollte doch sofort wieder returnieren.<br />
Mit den CWnd-Objekten hast Du natürlich recht, ich dachte halt nur wegen UpdateData...;)<br />
Kann mann evtl. für Threads eine Art Shared-Memory vereinbaren, so daß es doch funktioniert? Nach meinem Verständniss (;)) sollte doch das Codesegment threadsafe sein!?</p>
</blockquote>
<p>Sicher returniert PostMessage sofort. Aber damit erreicht man oft nicht was man will. Das sofortige aktualisieren des Dialoges. Zudem kann man mit PostMessage keine Zeiger übergeben oder ähnliches. Eben nur eine Nachricht absetzen. Aber das langt ja auch oft.</p>
<p>UpdateData aus einem anderen Thread ausführen ist von übel... darüber braucht man gar nicht weiter zu diskutieren, und performant ist es sowieso nicht.</p>
<p>Man muss keinen Shared Memory nehmen. Jeder Speicher tut es. Man muss nur den Zugriff synchronisieren (CriticalSection). Und das bremst den Thread in vielen Fällen schon wieder aus. Und schon gar nicht sollte man eine CriticalSection locken und dann mal eben SendMessage machen etc.</p>
<p>Am besten funktionieren mehrere Threads wenn es zwischen den Threads so wenig Berührungspunkte wir möglich gibt. Und ein GUI/Windows Handle gehört in die Kategorie &quot;viel Berührung&quot; / &quot;viel Abhängigkeit&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1359290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1359290</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 05 Sep 2007 10:18:06 GMT</pubDate></item></channel></rss>