<?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[[GELÖST] Klassen &#x2F; Instanzen &#x2F; Threads pt.2 | Einfach zu rekonstruieren]]></title><description><![CDATA[<p>Hallo,<br />
ich habe das Problem jetzt deutlich abgespeckt.<br />
Das Problem liegt definitiv am Multithreading.</p>
<p>So könnt Ihr das Problem wesentlich einfacher nachvollziehen.</p>
<p>Vielen Dank für eure Hilfe!</p>
<p>P.S.:<br />
Sorry für den neuen Thread aber der alte war schon vor mir mit Informationen voll, die nicht zielführend sind.</p>
<p>Hier der Code:</p>
<pre><code class="language-cpp">bool Ctest_1Dlg::test_anything() 
{
	LARGE_INTEGER lStart, lEnd, lFreq;
	QueryPerformanceFrequency(&amp;lFreq);
	QueryPerformanceCounter(&amp;lStart);

		// Weitere Variablen und Arrays
		int THREAD_COUNT		= 80;
		HANDLE		*hThreads	= new HANDLE[THREAD_COUNT];
		CWinThread **cThreads		= new CWinThread*[THREAD_COUNT];

		// Threads starten
		for(int i=0; i&lt;THREAD_COUNT; i++)
		{
			cThreads[i] = ::AfxBeginThread(test_worker,this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
			cThreads[i]-&gt;m_bAutoDelete = FALSE;
			hThreads[i] = cThreads[i]-&gt;m_hThread;

			cThreads[i]-&gt;ResumeThread();
		}

		// Alle Threads wurden gestartet. Jetzt wird gewartet
		TRACE(&quot;\r\nAlle Threads gestartet. WARTE JETZT!&quot;);
		::WaitForMultipleObjects(THREAD_COUNT,hThreads,TRUE,INFINITE);

		// Auräumen
		delete[] hThreads;

		// Threads manuell löschen, da m_bAutoDelete=FALSE
		for( i=0; i&lt;THREAD_COUNT; i++ )
		delete cThreads[i];
		delete[] cThreads;

	QueryPerformanceCounter(&amp;lEnd);
	int ms=((lEnd.QuadPart - lStart.QuadPart) * 1000) / lFreq.QuadPart;

	CString time_dif; 
	double delta_t = (double)(ms)/1000;
	time_dif.Format(&quot;\r\nBerechnet in: %.3f Sek.\r\n&quot;,delta_t);
	TRACE(time_dif);
	TRACE(&quot;FERTIG!!!\r\n&quot;);

	return true;
}

UINT Ctest_1Dlg::test_worker(LPVOID pParam)
{
		Ctest_1Dlg* pDlg = (Ctest_1Dlg*) pParam;		

		Sleep(3500);
		return 1;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/196203/gelöst-klassen-instanzen-threads-pt-2-einfach-zu-rekonstruieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Apr 2026 09:08:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/196203.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 26 Oct 2007 16:19:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [GELÖST] Klassen &#x2F; Instanzen &#x2F; Threads pt.2 | Einfach zu rekonstruieren on Fri, 26 Oct 2007 16:56:42 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe das Problem jetzt deutlich abgespeckt.<br />
Das Problem liegt definitiv am Multithreading.</p>
<p>So könnt Ihr das Problem wesentlich einfacher nachvollziehen.</p>
<p>Vielen Dank für eure Hilfe!</p>
<p>P.S.:<br />
Sorry für den neuen Thread aber der alte war schon vor mir mit Informationen voll, die nicht zielführend sind.</p>
<p>Hier der Code:</p>
<pre><code class="language-cpp">bool Ctest_1Dlg::test_anything() 
{
	LARGE_INTEGER lStart, lEnd, lFreq;
	QueryPerformanceFrequency(&amp;lFreq);
	QueryPerformanceCounter(&amp;lStart);

		// Weitere Variablen und Arrays
		int THREAD_COUNT		= 80;
		HANDLE		*hThreads	= new HANDLE[THREAD_COUNT];
		CWinThread **cThreads		= new CWinThread*[THREAD_COUNT];

		// Threads starten
		for(int i=0; i&lt;THREAD_COUNT; i++)
		{
			cThreads[i] = ::AfxBeginThread(test_worker,this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
			cThreads[i]-&gt;m_bAutoDelete = FALSE;
			hThreads[i] = cThreads[i]-&gt;m_hThread;

			cThreads[i]-&gt;ResumeThread();
		}

		// Alle Threads wurden gestartet. Jetzt wird gewartet
		TRACE(&quot;\r\nAlle Threads gestartet. WARTE JETZT!&quot;);
		::WaitForMultipleObjects(THREAD_COUNT,hThreads,TRUE,INFINITE);

		// Auräumen
		delete[] hThreads;

		// Threads manuell löschen, da m_bAutoDelete=FALSE
		for( i=0; i&lt;THREAD_COUNT; i++ )
		delete cThreads[i];
		delete[] cThreads;

	QueryPerformanceCounter(&amp;lEnd);
	int ms=((lEnd.QuadPart - lStart.QuadPart) * 1000) / lFreq.QuadPart;

	CString time_dif; 
	double delta_t = (double)(ms)/1000;
	time_dif.Format(&quot;\r\nBerechnet in: %.3f Sek.\r\n&quot;,delta_t);
	TRACE(time_dif);
	TRACE(&quot;FERTIG!!!\r\n&quot;);

	return true;
}

UINT Ctest_1Dlg::test_worker(LPVOID pParam)
{
		Ctest_1Dlg* pDlg = (Ctest_1Dlg*) pParam;		

		Sleep(3500);
		return 1;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1392661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392661</guid><dc:creator><![CDATA[Hecker.Michael]]></dc:creator><pubDate>Fri, 26 Oct 2007 16:56:42 GMT</pubDate></item><item><title><![CDATA[Reply to [GELÖST] Klassen &#x2F; Instanzen &#x2F; Threads pt.2 | Einfach zu rekonstruieren on Fri, 26 Oct 2007 16:59:59 GMT]]></title><description><![CDATA[<p>Hallo,<br />
die Lösung des Problems lag eigentlich auf der Hand.</p>
<p>Ich wusste, dass das Problem mit Timeout (Sleep(5000)) nicht bestand und ohne Timeout bestand. Offensichtlich musste das Problem also in WaitForMultipleObjects liegen.</p>
<p>Da ich bisher keine schlechten Erfahrungen mit WaitForSingleObjects gemacht habe, bin ich diesem Ansatz nicht weiter nachgegangen, bis ich ein Paper (<a href="http://www.weblearn.hs-bremen.de/risse/RST/WS02/multithreading.pdf" rel="nofollow">http://www.weblearn.hs-bremen.de/risse/RST/WS02/multithreading.pdf</a>) gefunden habe.</p>
<p>Darin verwenden die Autoren eine alternative Lösung, um auf die Threads zu warten.</p>
<p>Mit der neuen Funktion bleiben die Fehler aus und außerdem spare ich mir das HANDLE array.</p>
<p>Grüße,<br />
Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392676</guid><dc:creator><![CDATA[Hecker.Michael]]></dc:creator><pubDate>Fri, 26 Oct 2007 16:59:59 GMT</pubDate></item></channel></rss>