<?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[Thread über Event beenden klappt unter Vista nicht]]></title><description><![CDATA[<p>Ich habe folgenden Thread, welcher mit _beginthreadex gestartet wird.</p>
<pre><code class="language-cpp">unsigned CAudioIn::readSocketThread(LPVOID pParam)
{
    CAudioIn* pThis = (CAudioIn*)pParam;
    ResetEvent(pThis-&gt;m_eventThreadHasTerminated);
    SOCKADDR_IN saRemote;
    int addr_len = sizeof(SOCKADDR_IN);
    bool bStop = false;
    while(!bStop)
    {
        char buf[1500];
		//AfxMessageBox(L&quot;readSocketThread&quot;);
        int nLen = recvfrom(pThis-&gt;m_sSocket, buf, 1500, 0, (SOCKADDR*)&amp;saRemote, &amp;addr_len);
        if (WaitForSingleObject(pThis-&gt;m_eventTerminateThread, 0)==WAIT_OBJECT_0) 
        {
			AfxMessageBox(L&quot;Abbruch readSocketThread&quot;);
            bStop=true;
            break;
        }
        if(nLen &gt; 0)
        {
            //Do Something with the RTP Packet
        }
        else
            continue;
    }
    SetEvent(pThis-&gt;m_eventThreadHasTerminated);
    AfxMessageBox(L&quot;Terminated Event gesetzt&quot;);
    _endthreadex(0);
    return 0;
}
</code></pre>
<p>Hieru gibt es eine do_stop() Methode</p>
<pre><code class="language-cpp">USES_CONVERSION;
	DWORD dwWfsoRes = 0;
	while (WaitForSingleObject(m_eventThreadHasTerminated, 0) != WAIT_OBJECT_0) 
	{
	  SOCKADDR_IN saRemote;
	  saRemote.sin_family = AF_INET;
	  //AfxMessageBox(A2T(pStream-&gt;getDestIp().c_str()));
	  saRemote.sin_addr.s_addr = inet_addr(pStream-&gt;getDestIp().c_str());
	  saRemote.sin_port = htons(pStream-&gt;getDestPort());
	  int nLen = sendto(m_sSocket, &quot;0&quot;, 1, 0, (SOCKADDR*)&amp;saRemote, sizeof(saRemote));
	  if(!SetEvent(m_eventTerminateThread))
		  AfxMessageBox(L&quot;Event wurde nicht gesetzt&quot;);
	  AfxMessageBox(L&quot;Waitingfor&quot;);
	  Sleep(50);
	  //dwWfsoRes = WaitForSingleObject(m_eventThreadHasTerminated, INFINITE);
	}
	m_bIsStarted = false;
	return true;
</code></pre>
<p>Diese setzt also den Event eventTerminateThread welcher im Thread für das Abbrechen der Schleife sorgen soll.<br />
Unter XP läuft dieses Vorgehen auch einwandfrei.</p>
<p>Seltsam ist auch, dass die Applikation den Event erkennt wenn ich im Thread die einkommentierte MessageBox(AfxMessageBox(L&quot;readSocketThread&quot;)) auskommentiere und dann mit OK bestätige. Ist diese aber nicht auskommentiert schweint es so als würde der Thread das Event nie erhalten.</p>
<p>Jemand eine Idee woran das liegen könnte?</p>
<p>Gruß</p>
<p>Crazy</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/231705/thread-über-event-beenden-klappt-unter-vista-nicht</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Apr 2026 16:06:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/231705.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Jan 2009 10:56:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Thread über Event beenden klappt unter Vista nicht on Wed, 14 Jan 2009 11:06:30 GMT]]></title><description><![CDATA[<p>Ich habe folgenden Thread, welcher mit _beginthreadex gestartet wird.</p>
<pre><code class="language-cpp">unsigned CAudioIn::readSocketThread(LPVOID pParam)
{
    CAudioIn* pThis = (CAudioIn*)pParam;
    ResetEvent(pThis-&gt;m_eventThreadHasTerminated);
    SOCKADDR_IN saRemote;
    int addr_len = sizeof(SOCKADDR_IN);
    bool bStop = false;
    while(!bStop)
    {
        char buf[1500];
		//AfxMessageBox(L&quot;readSocketThread&quot;);
        int nLen = recvfrom(pThis-&gt;m_sSocket, buf, 1500, 0, (SOCKADDR*)&amp;saRemote, &amp;addr_len);
        if (WaitForSingleObject(pThis-&gt;m_eventTerminateThread, 0)==WAIT_OBJECT_0) 
        {
			AfxMessageBox(L&quot;Abbruch readSocketThread&quot;);
            bStop=true;
            break;
        }
        if(nLen &gt; 0)
        {
            //Do Something with the RTP Packet
        }
        else
            continue;
    }
    SetEvent(pThis-&gt;m_eventThreadHasTerminated);
    AfxMessageBox(L&quot;Terminated Event gesetzt&quot;);
    _endthreadex(0);
    return 0;
}
</code></pre>
<p>Hieru gibt es eine do_stop() Methode</p>
<pre><code class="language-cpp">USES_CONVERSION;
	DWORD dwWfsoRes = 0;
	while (WaitForSingleObject(m_eventThreadHasTerminated, 0) != WAIT_OBJECT_0) 
	{
	  SOCKADDR_IN saRemote;
	  saRemote.sin_family = AF_INET;
	  //AfxMessageBox(A2T(pStream-&gt;getDestIp().c_str()));
	  saRemote.sin_addr.s_addr = inet_addr(pStream-&gt;getDestIp().c_str());
	  saRemote.sin_port = htons(pStream-&gt;getDestPort());
	  int nLen = sendto(m_sSocket, &quot;0&quot;, 1, 0, (SOCKADDR*)&amp;saRemote, sizeof(saRemote));
	  if(!SetEvent(m_eventTerminateThread))
		  AfxMessageBox(L&quot;Event wurde nicht gesetzt&quot;);
	  AfxMessageBox(L&quot;Waitingfor&quot;);
	  Sleep(50);
	  //dwWfsoRes = WaitForSingleObject(m_eventThreadHasTerminated, INFINITE);
	}
	m_bIsStarted = false;
	return true;
</code></pre>
<p>Diese setzt also den Event eventTerminateThread welcher im Thread für das Abbrechen der Schleife sorgen soll.<br />
Unter XP läuft dieses Vorgehen auch einwandfrei.</p>
<p>Seltsam ist auch, dass die Applikation den Event erkennt wenn ich im Thread die einkommentierte MessageBox(AfxMessageBox(L&quot;readSocketThread&quot;)) auskommentiere und dann mit OK bestätige. Ist diese aber nicht auskommentiert schweint es so als würde der Thread das Event nie erhalten.</p>
<p>Jemand eine Idee woran das liegen könnte?</p>
<p>Gruß</p>
<p>Crazy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645182</guid><dc:creator><![CDATA[CrazyPlaya]]></dc:creator><pubDate>Wed, 14 Jan 2009 11:06:30 GMT</pubDate></item><item><title><![CDATA[Reply to Thread über Event beenden klappt unter Vista nicht on Wed, 14 Jan 2009 11:41:31 GMT]]></title><description><![CDATA[<p>1. Warum benutzt Du überhaupt ein Event um dem Thread einen terminate mitzuteilen, wenn Du sowieso nicht wartest. Ein Flag tut es hier auch.<br />
2. Benötigst Du kein Event m_eventThreadHasTerminated. Du kannst das Handle des Threads direkt nutzen um das zu prüfen.<br />
3. Der Aufruf von _endthreadex ist unnötig. Ein return genügt und ist portabler.<br />
4. Du benutzt die MFC aber nicht AfxBeginThread, so wie ich das sehe! Den entsprechenden Warnhinweis aufmein Blog hast Du schon.<br />
<a href="http://blog.m-ri.de/index.php/2008/02/28/afxbeginthread-versus-_beginthreadex/" rel="nofollow">http://blog.m-ri.de/index.php/2008/02/28/afxbeginthread-versus-_beginthreadex/</a><br />
5. Bist Du sicher, dass recvfrom überhaupt zurückkehrt. Wenn nicht kann der Thread nicht terminieren.<br />
6. Trace-Ausgaben im Debugger sind flexibler als Message Boxen.<br />
7. USES_CONVERSION und ein Schleife ist tödlich. Verwende lieber CA2T, als A2T!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645223</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 14 Jan 2009 11:41:31 GMT</pubDate></item><item><title><![CDATA[Reply to Thread über Event beenden klappt unter Vista nicht on Wed, 14 Jan 2009 13:10:28 GMT]]></title><description><![CDATA[<p>1.) Mit nem Flag funktioniert es jetzt.<br />
3.) ist rausgenommen hatte es nur in einem Beispiel so gesehen.<br />
4.) Mein Gott Threads:D. Ich muss mich da wohl noch viel intensiver mit auseinandersetzen:D. Deinen Blog habe ich aber gelesen. Danke.<br />
5.) Dafür hatte ich ja denn Dummy rausgeschickt, das vom Server noch eine Antwort kommt.<br />
6.) Das war das Problem. Im Debug Mode hatte es ja auch geklappt deshalb die Message Boxen um im Release zu sehen was passiert.<br />
7.) Warum ist das tödlich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645314</guid><dc:creator><![CDATA[CrazyPlaya]]></dc:creator><pubDate>Wed, 14 Jan 2009 13:10:28 GMT</pubDate></item><item><title><![CDATA[Reply to Thread über Event beenden klappt unter Vista nicht on Wed, 14 Jan 2009 13:17:40 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26195">@7</a>. A2T verwendet alloca, dass führt dazu dass Speicher auf dem Stack allokiert wird. Jeder Dchleifendurchlauf allokiert dann neuen Speicher vom Stack... Den Rest kannst Du Dir denken.<br />
CA2T verwendet den Heap.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645320</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 14 Jan 2009 13:17:40 GMT</pubDate></item><item><title><![CDATA[Reply to Thread über Event beenden klappt unter Vista nicht on Wed, 14 Jan 2009 13:25:25 GMT]]></title><description><![CDATA[<p>Alles klar gut zu wissen.<br />
Danke für den Hinweis. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645326</guid><dc:creator><![CDATA[CrazyPlaya]]></dc:creator><pubDate>Wed, 14 Jan 2009 13:25:25 GMT</pubDate></item></channel></rss>