<?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[Invalidate() aus Thread heraus aufrufen]]></title><description><![CDATA[<p>Tag zusammen,</p>
<p>ich führe in einem Thread Berechnungen aus und möchte diese live auch gleich graphisch darstellen. Die Darstellung wollte ich in der Methode CView::OnDraw(CDC* pDC) ausführen. Meine Vermutung war, dass ich diese Methode z.B. mit Invalidate() ausführen kann. Daher folgender Code für die Thread-Funktion:</p>
<pre><code class="language-cpp">DWORD WINAPI CVIView::ThreadFunc(LPVOID data)
{
	while(continueThread)
	{
		//Berechnung ausführen
		Invalidate();
		Sleep(100);
	}
	return(0);
}
</code></pre>
<p>Ich erhalte die Fehlermeldung</p>
<pre><code>error C2352: 'CWnd::Invalidate::CWnd::Invalidate': Unzulässiger Aufruf einer nicht statischen Memberfunktion
</code></pre>
<p>Ich verstehe das so, dass die Thread-Funktion, da sie selbst statisch ist, nur statische Memberfunktionen aufrufen kann? Gibt es keinen Weg, das zu umgehen? Habe das Problem auch schon mit einer weiteren Funktion gehabt, aber da konnte ich mir anders helfen. Nur hier weiß ich keine Alternative <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Wäre nett, wenn mir jemand weiterhelfen könnte :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200304/invalidate-aus-thread-heraus-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 09:15:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200304.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Dec 2007 09:30:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Invalidate() aus Thread heraus aufrufen on Thu, 13 Dec 2007 09:30:49 GMT]]></title><description><![CDATA[<p>Tag zusammen,</p>
<p>ich führe in einem Thread Berechnungen aus und möchte diese live auch gleich graphisch darstellen. Die Darstellung wollte ich in der Methode CView::OnDraw(CDC* pDC) ausführen. Meine Vermutung war, dass ich diese Methode z.B. mit Invalidate() ausführen kann. Daher folgender Code für die Thread-Funktion:</p>
<pre><code class="language-cpp">DWORD WINAPI CVIView::ThreadFunc(LPVOID data)
{
	while(continueThread)
	{
		//Berechnung ausführen
		Invalidate();
		Sleep(100);
	}
	return(0);
}
</code></pre>
<p>Ich erhalte die Fehlermeldung</p>
<pre><code>error C2352: 'CWnd::Invalidate::CWnd::Invalidate': Unzulässiger Aufruf einer nicht statischen Memberfunktion
</code></pre>
<p>Ich verstehe das so, dass die Thread-Funktion, da sie selbst statisch ist, nur statische Memberfunktionen aufrufen kann? Gibt es keinen Weg, das zu umgehen? Habe das Problem auch schon mit einer weiteren Funktion gehabt, aber da konnte ich mir anders helfen. Nur hier weiß ich keine Alternative <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Wäre nett, wenn mir jemand weiterhelfen könnte :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419813</guid><dc:creator><![CDATA[BeNNeR]]></dc:creator><pubDate>Thu, 13 Dec 2007 09:30:49 GMT</pubDate></item><item><title><![CDATA[Reply to Invalidate() aus Thread heraus aufrufen on Thu, 13 Dec 2007 09:33:07 GMT]]></title><description><![CDATA[<p>das geht nicht, und feddich<br />
loes es doch so das du aus dem thread heraus eine eigene message schickst zb<br />
bla-&gt;SendMessage(WM_UPDATEVIEW);<br />
und dann in der bla nur noch das Invalidate() aufrufen sobald diese message eingeht, das ist auch so die normale heran gehens weise, wobei deine ansicht alle 1 millisekunde geupdatet wird mit diesem code, koennte n bissl flackern #gg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419815</guid><dc:creator><![CDATA[EXDW]]></dc:creator><pubDate>Thu, 13 Dec 2007 09:33:07 GMT</pubDate></item><item><title><![CDATA[Reply to Invalidate() aus Thread heraus aufrufen on Thu, 13 Dec 2007 09:44:07 GMT]]></title><description><![CDATA[<p>Allgemein kann die Thread-Funktion durchaus nicht-statische Methoden aufrufen - sie hat (als statische Methode) nur keinen this-Zeiger, auf den sie zugreifen kann und muß sich deshalb das Objekt auf anderem Weg beschaffen (üblicherweise steckt es hinter dem LPVOID-Parameter:</p>
<pre><code class="language-cpp">DWORD WINAPI CVIView::ThreadFunc(LPVOID data)
{
    CVIView* pThis = (CVIView*) data;
    while(continueThread)
    {
        //Berechnung ausführen
        pThis-&gt;Invalidate();
        Sleep(100);
    }
    return(0);
}
</code></pre>
<p>ABER: MFC (oder war's die WinAPI?) bringt dir zur Laufzeit Probleme, wenn Worker-Threads direkt auf die Fenster zugreifen wollen - das darf nur der Thread, der das Fenster auch erstellt hat. Darum ist die übliche Vorgehensweise:</p>
<ul>
<li>schreib deine Ausgabedaten an eine Stelle, wo du sie später wiederfinden kannst (z.B. in Member von pThis)</li>
<li>schick eine WM_APP-Nachricht an dich selber - bei der Verarbeitung dieser Nachricht kannst du dann deine Daten anzeigen lassen</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1419824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419824</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 13 Dec 2007 09:44:07 GMT</pubDate></item><item><title><![CDATA[Reply to Invalidate() aus Thread heraus aufrufen on Thu, 13 Dec 2007 09:50:58 GMT]]></title><description><![CDATA[<p>OK, danke erstmal für die Hilfe. Allerdings tut sich mir da noch eine Frage auf, da ich in der ganzen MFC-Geschichte noch absoluter Neuling bin: wie schicke ich eine Nachricht an mich selbst? Ich habe es mit</p>
<pre><code class="language-cpp">SendMessage(WM_NACHRICHT);
</code></pre>
<p>versucht, aber das scheint auch wieder eine nicht-statische Funktion zu sein, meint der Compiler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419828</guid><dc:creator><![CDATA[BeNNeR]]></dc:creator><pubDate>Thu, 13 Dec 2007 09:50:58 GMT</pubDate></item><item><title><![CDATA[Reply to Invalidate() aus Thread heraus aufrufen on Thu, 13 Dec 2007 09:53:43 GMT]]></title><description><![CDATA[<p>Workerthreads können auf Fenster zugreifen, hier ist ein Invalidate kein Problem.<br />
Man sollte nur niemals ein CWnd* Objekt über Threadgrenzen weitergeben sondern nur HWND handles.</p>
<p>Auch sollte man sich klar sein, was InvalidateRect und UpdateWindow auslösen.</p>
<p>Ein InvalidateRect ist IMHO gänzlich ungefährlich aus einem Workerthread. Wenn der GUI Thread an der Reihe ist, wird er das Fenster neu zeichnen.<br />
Allerdings musst Du die Daten Threadsicher einpacken, nicht das es zu Problemen kommt.</p>
<p>UpdateWindow/RedrawWindow ist problamtisch aus dem Workerthread. In diesem Fall wird eine threadsynchronisation erzwungen und der Workerthread wartet bis das Fenster gezeicnet wurde und das geschieht auch nur wenn der GUI Thread irgendwann GetMessage/PeekMessage ausführt.</p>
<p>Man sollte solche Threadsynchronisationen vermeiden, weil sie die Arbeit immens ausbremsen.<br />
Was MrEvil mit SendMessage vorschlug ist deshalb auch problematisch. SendMessage kehrt erst zurück, wenn der UI Thread die Nachricht abgearbeitet hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419833</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Thu, 13 Dec 2007 09:53:43 GMT</pubDate></item><item><title><![CDATA[Reply to Invalidate() aus Thread heraus aufrufen on Thu, 13 Dec 2007 10:13:47 GMT]]></title><description><![CDATA[<p>Also ich habe jetzt die Variante von CStoll getestet, die funktioniert ohne Fehler und erfüllt ihren Zweck. Danke nochmal. Ich wollte aber auch die SendMessage-Variante probieren und hätte da gleich noch eine Frage:</p>
<p>Ich habe folgendes getan:</p>
<pre><code class="language-cpp">DWORD WINAPI CVIView::ThreadFunc(LPVOID data)
{
    CVIView* pThis = (CVIView*) data;
    while(continueThread)
    {
        //Berechnung ausführen
        pThis-&gt;SendMessage(WM_UPDATEVIEW);
        Sleep(100);
    }
    return(0);
}
</code></pre>
<p>Die Nachricht registrieren:</p>
<pre><code class="language-cpp">#define WM_UPDATEVIEW (WM_USER + 1)
</code></pre>
<p>Ich habe die Definition ins Headerfile der Klasse geschrieben (da gehört sie doch hin oder?). Nun dachte ich, sie würde im VS dort mit auftauchen, wo man die Handler der verschiedenen Nachrichten festlegen kann. Tut sie aber nicht. Hab ich was falsch gemacht, oder wie kann ich die Nachricht jetzt verarbeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419840</guid><dc:creator><![CDATA[BeNNeR]]></dc:creator><pubDate>Thu, 13 Dec 2007 10:13:47 GMT</pubDate></item><item><title><![CDATA[Reply to Invalidate() aus Thread heraus aufrufen on Thu, 13 Dec 2007 10:30:23 GMT]]></title><description><![CDATA[<p>Du hast nichts falsch gemacht - VC behandelt diese Nutzerdefinierten Nachrichten-Codes nur etwas stiefmütterlich (soll heißen, du mußt die Handler-Methode von Hand anlegen und in die Message-Map eintragen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419846</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 13 Dec 2007 10:30:23 GMT</pubDate></item><item><title><![CDATA[Reply to Invalidate() aus Thread heraus aufrufen on Thu, 13 Dec 2007 10:59:57 GMT]]></title><description><![CDATA[<p>Alles klar, besten Dank. Dann sollten erstmal alle Fragen geklärt sein :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419854</guid><dc:creator><![CDATA[BeNNeR]]></dc:creator><pubDate>Thu, 13 Dec 2007 10:59:57 GMT</pubDate></item></channel></rss>