<?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[Multithreading]]></title><description><![CDATA[<p>Hallo,<br />
letztens habe ich zum ersten Mal in ein Prog neben dem Hauptthread einen eigenen zweiten Thread eingebaut.<br />
Es funktioniert alles ganz toll.<br />
Aber ich hätte ein paar Fragen, zu denen ich gerne die Meinung hören würde.</p>
<p>1. Sobald jemand eine Aktion per GUI auslöst, wird der Thread in WndProc erstellt (Handle und Pointer auf die übergebene Datenstruktur sind static).<br />
Sobald der Thread fertig ist, sendet er vor dem &quot;returnen&quot; an das Hauptfenster eine (eigene definierte) Message, in der mit folgendem Code sichergestellt wird, ob der Thread auch schon zu Ende ist (Warten zwischen SendMessage und &quot;returnen&quot;):</p>
<pre><code class="language-cpp">DWORD dwExitCode;

while (GetExitCodeThread(hSplitThread, &amp;dwExitCode) == STILL_ACTIVE)
	Sleep(1);

delete pData; //Freigeben des Pointers auf die Datenstruktur, die beim Erstellen übergeben wird

//Rest
</code></pre>
<p>Ich denke, das ist keine Ideale Lösung, auch wenn es funktioniert..</p>
<p>2. Zum Erstellen benutze ich CreateThread().<br />
Nach einigem Nachforschen bin ich auf die Unterschiede von CreateThread() und _beginthreadex() gekommen:</p>
<blockquote>
<p>The thread params that _beginthread(ex) initializes aren't the user's data. It is the TLS data that CRT itself uses for it's multithreaded versions of the functions. Quite a few of CRT functions touch upon this TLS data. That is why it is important to use the CRT thread creation function if your thread proc happens to call CRT functions that could be thread sensitive.</p>
</blockquote>
<p>Das heisst doch für mich: Wenn ich keine Funktion der CRT benutze, kann ich den Thread ohne Probleme mit CreateThread erstellen; benutze ich welche, dann sollte _beginthreadex() verwendet werden, oder?</p>
<p>Und noch eine Frage: Was passiert GENAU, wenn ich Funktionen der CRT verwende und der Thread mit CreateThread() erstellt wurde??</p>
<p>Dazu bitte Meinungen/Verbesserungsvorschläge/Hinweise..<br />
MfG,<br />
Max</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/199004/multithreading</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Apr 2026 01:32:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/199004.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 27 Nov 2007 21:21:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Multithreading on Tue, 27 Nov 2007 21:21:23 GMT]]></title><description><![CDATA[<p>Hallo,<br />
letztens habe ich zum ersten Mal in ein Prog neben dem Hauptthread einen eigenen zweiten Thread eingebaut.<br />
Es funktioniert alles ganz toll.<br />
Aber ich hätte ein paar Fragen, zu denen ich gerne die Meinung hören würde.</p>
<p>1. Sobald jemand eine Aktion per GUI auslöst, wird der Thread in WndProc erstellt (Handle und Pointer auf die übergebene Datenstruktur sind static).<br />
Sobald der Thread fertig ist, sendet er vor dem &quot;returnen&quot; an das Hauptfenster eine (eigene definierte) Message, in der mit folgendem Code sichergestellt wird, ob der Thread auch schon zu Ende ist (Warten zwischen SendMessage und &quot;returnen&quot;):</p>
<pre><code class="language-cpp">DWORD dwExitCode;

while (GetExitCodeThread(hSplitThread, &amp;dwExitCode) == STILL_ACTIVE)
	Sleep(1);

delete pData; //Freigeben des Pointers auf die Datenstruktur, die beim Erstellen übergeben wird

//Rest
</code></pre>
<p>Ich denke, das ist keine Ideale Lösung, auch wenn es funktioniert..</p>
<p>2. Zum Erstellen benutze ich CreateThread().<br />
Nach einigem Nachforschen bin ich auf die Unterschiede von CreateThread() und _beginthreadex() gekommen:</p>
<blockquote>
<p>The thread params that _beginthread(ex) initializes aren't the user's data. It is the TLS data that CRT itself uses for it's multithreaded versions of the functions. Quite a few of CRT functions touch upon this TLS data. That is why it is important to use the CRT thread creation function if your thread proc happens to call CRT functions that could be thread sensitive.</p>
</blockquote>
<p>Das heisst doch für mich: Wenn ich keine Funktion der CRT benutze, kann ich den Thread ohne Probleme mit CreateThread erstellen; benutze ich welche, dann sollte _beginthreadex() verwendet werden, oder?</p>
<p>Und noch eine Frage: Was passiert GENAU, wenn ich Funktionen der CRT verwende und der Thread mit CreateThread() erstellt wurde??</p>
<p>Dazu bitte Meinungen/Verbesserungsvorschläge/Hinweise..<br />
MfG,<br />
Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1411280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1411280</guid><dc:creator><![CDATA[ripmav]]></dc:creator><pubDate>Tue, 27 Nov 2007 21:21:23 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading on Tue, 27 Nov 2007 21:32:01 GMT]]></title><description><![CDATA[<blockquote>
<p>Und noch eine Frage: Was passiert GENAU, wenn ich Funktionen der CRT verwende und der Thread mit CreateThread() erstellt wurde??</p>
</blockquote>
<p>Es werden u.U. nicht alles Resourcen freigegeben, wenn der Thread beendet wird.<br />
(z.B. im Bereich TLS = Thread Local Storage)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1411292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1411292</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Tue, 27 Nov 2007 21:32:01 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading on Tue, 27 Nov 2007 23:37:57 GMT]]></title><description><![CDATA[<p>Warten kannst du so:</p>
<pre><code class="language-cpp">// warten dass der Thread terminiert:
DWORD rc = WaitForSingleObject(threadHandle, INFINITE);
assert(rc == WAIT_OBJECT_0);

// jetzt kannst du mit GetExitCodeThread den exit code holen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1411334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1411334</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 27 Nov 2007 23:37:57 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading on Wed, 28 Nov 2007 10:28:22 GMT]]></title><description><![CDATA[<p>Danke für die Antworten.<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>:<br />
Was genau heisst es, wenn WaitForSingleObject WAIT_OBJECT_0 zurückgibt?<br />
In der MSDN steht nur &quot;The state of the specified object is signaled.&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1411449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1411449</guid><dc:creator><![CDATA[ripmav]]></dc:creator><pubDate>Wed, 28 Nov 2007 10:28:22 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading on Wed, 28 Nov 2007 12:38:27 GMT]]></title><description><![CDATA[<p>Für einen Thread heißt dies, dass der Thread beendet wurde...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1411530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1411530</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 28 Nov 2007 12:38:27 GMT</pubDate></item></channel></rss>