<?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 synchronisation]]></title><description><![CDATA[<p>Hi Leute,</p>
<p>ich hab ein Problem, und zwar arbeite ich mit mehreren Threads.<br />
Sprich ein Thread schreibt in eine queue ein strukt ein anderer liest aus dem heap zwei einträge aus. Dieser teilt die einträge unter vier anderen Threads auf.<br />
Die vergleichen die einträge.<br />
Es sollte eine Art MotionDetect werden. Die Einträge sind Zeiger auf die<br />
drei DIB Sektoren (Info, Header und die Pixel an sich).</p>
<p>Der heap ist mit CRITICAL_SECTION threadsicher, aber wegen der Koordination hab ich ein Problem.<br />
Gibt es eine Funktion die einen thread &quot;schlafen&quot; legt bis er wieder aufgerufen wird? Nach dem Motto wait &amp; notify? Sonst muss ich immer ein Schleife laufen lassen um den Status abzufragen und das kostet rechenleistung...</p>
<p>Danke euch schon mal1!!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/98372/thread-synchronisation</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 23:19:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/98372.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 Jan 2005 08:43:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Thread synchronisation on Wed, 19 Jan 2005 08:43:01 GMT]]></title><description><![CDATA[<p>Hi Leute,</p>
<p>ich hab ein Problem, und zwar arbeite ich mit mehreren Threads.<br />
Sprich ein Thread schreibt in eine queue ein strukt ein anderer liest aus dem heap zwei einträge aus. Dieser teilt die einträge unter vier anderen Threads auf.<br />
Die vergleichen die einträge.<br />
Es sollte eine Art MotionDetect werden. Die Einträge sind Zeiger auf die<br />
drei DIB Sektoren (Info, Header und die Pixel an sich).</p>
<p>Der heap ist mit CRITICAL_SECTION threadsicher, aber wegen der Koordination hab ich ein Problem.<br />
Gibt es eine Funktion die einen thread &quot;schlafen&quot; legt bis er wieder aufgerufen wird? Nach dem Motto wait &amp; notify? Sonst muss ich immer ein Schleife laufen lassen um den Status abzufragen und das kostet rechenleistung...</p>
<p>Danke euch schon mal1!!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/699995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/699995</guid><dc:creator><![CDATA[niemayd]]></dc:creator><pubDate>Wed, 19 Jan 2005 08:43:01 GMT</pubDate></item><item><title><![CDATA[Reply to Thread synchronisation on Wed, 19 Jan 2005 08:49:13 GMT]]></title><description><![CDATA[<p>so was vielleicht<br />
<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/waitforsingleobject.asp" rel="nofollow">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/waitforsingleobject.asp</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/700000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/700000</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Wed, 19 Jan 2005 08:49:13 GMT</pubDate></item><item><title><![CDATA[Reply to Thread synchronisation on Wed, 19 Jan 2005 08:50:52 GMT]]></title><description><![CDATA[<p>ich habe die frage nicht 100% verstanden.<br />
aber ich hatte schon einähnliches problem, welches ich mit</p>
<pre><code class="language-cpp">Synchronize()
</code></pre>
<p>glöst habe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/700003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/700003</guid><dc:creator><![CDATA[BigNeal]]></dc:creator><pubDate>Wed, 19 Jan 2005 08:50:52 GMT</pubDate></item><item><title><![CDATA[Reply to Thread synchronisation on Wed, 19 Jan 2005 08:54:54 GMT]]></title><description><![CDATA[<p>Wow! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Ging aber schnell!<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/417">@miller_m</a>:<br />
Ich schau mir gleich mal den link an. Denke das es genau sowas ist!<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7573">@BigNEal</a>:<br />
selbiges</p>
<p>Danke!!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/700005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/700005</guid><dc:creator><![CDATA[niemayd]]></dc:creator><pubDate>Wed, 19 Jan 2005 08:54:54 GMT</pubDate></item><item><title><![CDATA[Reply to Thread synchronisation on Wed, 19 Jan 2005 12:44:13 GMT]]></title><description><![CDATA[<p>Jawohl genau!!</p>
<p>WaitForSingleObject ist genau richtig! Danke!!!!!!!!!<br />
EDIT:<br />
Doch nicht... Kann mir jemand sagen, warum das nicht geht?!?!?</p>
<pre><code class="language-cpp">//*****************************************************************************
//	Initialisation der statischen Variablen
//*****************************************************************************

CRITICAL_SECTION cs;
HANDLE hStartReading;
HANDLE hThreadCommunication;
HANDLE hInitializeAll;

static int THREAD_STATUS[MAX_THREAD];
static thread_data thread_exercise[MAX_THREAD];

static HWND hWindow;
static CHeap * pCHeap;
static int count = 0;

//*****************************************************************************
//	Funktion die in den Heap schreibt
//*****************************************************************************
bool addDIB(FILE * bmp)
{
	EnterCriticalSection(&amp;cs);

	DIB_file * temp = new DIB_file;

	//größe der Datei ermittlen
	fseek(bmp,0,SEEK_END);
	long size = ftell(bmp);
	fseek(bmp,0,SEEK_SET);

	temp-&gt;file = new BITMAPFILEHEADER;
	temp-&gt;info = new BITMAPINFOHEADER;

	fread(temp-&gt;file,sizeof(BITMAPFILEHEADER),1,bmp);
	fread(temp-&gt;info,sizeof(BITMAPINFOHEADER),1,bmp);

	pCHeap-&gt;pushElement(temp);

	LeaveCriticalSection(&amp;cs);

	return true;
}

//*****************************************************************************
//	Funktion die aus dem heap liest
//*****************************************************************************
bool getDIB(DIB_file * temp)
{
	bool succes;
	EnterCriticalSection(&amp;cs);
	succes = pCHeap-&gt;getElement(temp);
	LeaveCriticalSection(&amp;cs);
	if (succes)
		return true;
	else
		return false;
}

//*****************************************************************************
//	Thread der einen Bildteil der ihm zugewiesen wird vergleicht
//*****************************************************************************
void Thread(PVOID pVoid)
{
	int number = (int) pVoid;
	count += 1;
	THREAD_STATUS[number]= THREAD_WAITING;

	SendMessage(hWindow,WM_PAINTMESSAGE,0,(LPARAM)&quot;Start&quot;);

	if (count == MAX_THREAD)
		SetEvent(hInitializeAll);

	//Warte bis Parent daten gelesen und in array geschrieben hat
	WaitForSingleObject(hThreadCommunication, INFINITE);

	long heigth = thread_exercise[number].info-&gt;biHeight;

	if (number == MAX_THREAD-1)
		ResetEvent(hThreadCommunication);
		SetEvent(hThreadCommunication);

	SendMessage(hWindow,WM_PAINTMESSAGE,0,(LPARAM)&quot;Ending&quot;);
	_endthread();
}

//*****************************************************************************
//	Prototyp. Erzeugt filehandels und gibt sie an addDIB weiter
//*****************************************************************************
void write(PVOID pVoid)
{
	int sendEvent = 2;

	//Warte bis alle Threads erstellt sind
	WaitForSingleObject(hInitializeAll, INFINITE);

	SendMessage(hWindow,WM_PAINTMESSAGE,0,(LPARAM)&quot;BeginRead&quot;);

	SetEvent(hStartReading);
	_endthread();
}

//*****************************************************************************
//	liefert den Status der Threads zum Bildervergleich zurück
//*****************************************************************************
int getStatus()
{
	//wenn ein Thread einen Error erzeugt ist die ganze Operation Error
	for (int i = 0; i &lt; MAX_THREAD ; i++)
		if (THREAD_STATUS[i] == THREAD_ERROR)
			return THREAD_ERROR;

	//solange nicht alle Thread beendet sind, wird noch auf arbeit gesetzt
	for (int i = 0; i &lt; MAX_THREAD ; i++)
		if (THREAD_STATUS[i] == THREAD_WORKING)
			return THREAD_WORKING;

	return THREAD_WAITING;
}

//*****************************************************************************
//	setzt eine Status aller Threads
//*****************************************************************************
bool setStatus(int status)
{
	for(int i = 0; i &lt; MAX_THREAD; i++)
	{
		THREAD_STATUS[i] = status;
	}
	return true;
}

//*****************************************************************************
//	liest informationen aus dem Heap und gibt sie an die Threads zur 
//	verarbeitung weiter
//*****************************************************************************
void read(PVOID pVoid)
{
	//Starts threads with threadnumber
	setStatus(THREAD_ERROR);
	for(int i=0; i&lt;MAX_THREAD;i++)
	{
		_beginthread(Thread,0,(void *)i);
	}

	WaitForSingleObject(hInitializeAll, INFINITE);
	SendMessage(hWindow,WM_PAINTMESSAGE,0,(LPARAM)&quot;WriteWait&quot;);

	WaitForSingleObject(hStartReading, INFINITE);
	SendMessage(hWindow,WM_PAINTMESSAGE,0,(LPARAM)&quot;WriteGet&quot;);

	//Starte verarbeitung
	int status = 0;
	DIB_file * temp1 = new DIB_file;
	DIB_file * temp2 = new DIB_file;

	while(getStatus() != THREAD_ERROR)
	{
		if (getDIB(temp1) &amp;&amp; getDIB(temp2))
		{
			for (int i = 0; i &lt; MAX_THREAD; i++)
			{
				thread_exercise[i].file = temp1-&gt;file;
				thread_exercise[i].info = temp1-&gt;info;
			}
		}
		SetEvent(hThreadCommunication);
		WaitForSingleObject(hThreadCommunication, INFINITE);
		break;
	}

	SendMessage(hWindow,WM_PAINTMESSAGE , 0, (LPARAM)&quot;WriteEnd.&quot;);
	_endthread();
}

//*****************************************************************************
//	Initialisiert die Hauptthreads und beendet sich dann
//*****************************************************************************
bool startIOThread(HWND hWnd)
{
	hWindow = hWnd;
	pCHeap = new CHeap(20);

	hStartReading = CreateEvent(NULL,FALSE,FALSE,&quot;FirstListener&quot;);
	hThreadCommunication = CreateEvent(NULL, FALSE, FALSE, &quot;SecondListener&quot;);
	hInitializeAll = CreateEvent(NULL, FALSE, FALSE, &quot;ThirdListener&quot;);

	for(int i = 0; i &lt; MAX_THREAD; i++)
	{
		thread_exercise[i].file = new BITMAPFILEHEADER;
		thread_exercise[i].info = new BITMAPINFOHEADER;
	}

	InitializeCriticalSection(&amp;cs);

	_beginthread(write,0,NULL);
	_beginthread(read,0, NULL);

	return true;
}
</code></pre>
<p>Zuerst wird startIOThread aufgerufen. Wenn write-thread gestartet hat, initialisiert er die Thraed-threads und dann wird gewartet bis alle initialisiert sind.<br />
write-Thread beginnt und hStartRead wird gesetzt... Da passiert dann nix!!!!<br />
Und ich weiß nicht warum!!!!!</p>
<p>Danke wenn jemand was weiß!!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/700011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/700011</guid><dc:creator><![CDATA[niemayd]]></dc:creator><pubDate>Wed, 19 Jan 2005 12:44:13 GMT</pubDate></item><item><title><![CDATA[Reply to Thread synchronisation on Wed, 19 Jan 2005 14:28:44 GMT]]></title><description><![CDATA[<p>Hab grad keine Lust mir den kompletten Code anzusehen, aber zu WaitforSingleObject schau mal hier:</p>
<p><a href="http://www.c-plusplus.net/forum/viewtopic.php?t=89356&amp;highlight=createevent" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic.php?t=89356&amp;highlight=createevent</a></p>
<p>Ach ja, gab es da nicht<br />
Look Thread1<br />
Thread 2 .. wird ausgeführt<br />
Unlook Thread 1<br />
oder so etwas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/700357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/700357</guid><dc:creator><![CDATA[bigborre]]></dc:creator><pubDate>Wed, 19 Jan 2005 14:28:44 GMT</pubDate></item><item><title><![CDATA[Reply to Thread synchronisation on Wed, 19 Jan 2005 14:37:17 GMT]]></title><description><![CDATA[<p>niemayd schrieb:</p>
<blockquote>
<p>write-Thread beginnt und hStartRead wird gesetzt... Da passiert dann nix!!!!<br />
Und ich weiß nicht warum!!!!!</p>
</blockquote>
<p>Zunächst solltest du für die gegenseitige Aktivierung von Thread und read nicht dasselbe Event benutzen.</p>
<p>Außerdem sind deine Abfragen der Art</p>
<pre><code class="language-cpp">if (number == MAX_THREAD-1)
</code></pre>
<p>reichlich gewagt. Du kannst dich nicht darauf verlassen, dass die Threads in der Reihenfolge abgearbeitet werden, in der sie erzeugt wurden.</p>
<p>Warum sind Thread und read überhaupt getrennte Threads? Wenn sie sowieso immer nur aufeinander warten, kannst du da auch normale Funktionsaufrufe draus machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/700366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/700366</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Wed, 19 Jan 2005 14:37:17 GMT</pubDate></item><item><title><![CDATA[Reply to Thread synchronisation on Wed, 19 Jan 2005 15:07:21 GMT]]></title><description><![CDATA[<p>Weiß nicht ob es dir hilft, aber schau dir mal die Funktionen</p>
<pre><code>SuspendThread()
</code></pre>
<p>und</p>
<pre><code>ResumeThread()
</code></pre>
<p>an</p>
]]></description><link>https://www.c-plusplus.net/forum/post/700389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/700389</guid><dc:creator><![CDATA[Horst2]]></dc:creator><pubDate>Wed, 19 Jan 2005 15:07:21 GMT</pubDate></item></channel></rss>