<?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[Problem mit der Übergabe eines Vektors von einem Thread zum Nächsten]]></title><description><![CDATA[<p>Hallo,<br />
ich hab ein kleines Problem mit der Übergabe eines Vektors von einem Thread zum Nächsten.<br />
Das Programm, dass ich gerade entwickle verwendet jeweils einen Thread(im angefügten Code ist das ModelCreatorThreadProc), um in unregelmäßigen Abständen einen Vektor mit Daten zu erstellen, und diesen Vektor dem 2. Thread zum Arbeiten zu übergeben. Der 2. Thread benutzt dann diese Daten. Wenn der 1. Thread einen Job zur Erzeugung neuer Daten bekommt, soll der 2. Thread zuerst aufhören, mit den alten Daten zu arbeiten, deshalb ruft er stopModel() auf. Für die Erstellung der Daten benötigt der 1. Thread im Normalfall nicht mehr als 1-2 Sekunden, danach soll er die Daten mit sendModel() dem 2. Thread übergeben, sodass dieser wieder mit diesen arbeiten kann, bis neue Daten vom 1. Thread erzeugt werden. Der 2. Thread benutzt diese Daten in einer Endlosschleife, wobei ein Durchlauf fast nie länger als 10 ms dauert.<br />
Das Problem das ich nun habe ist, dass ohne dem Aufruf von stopModel() und ohne der Mutual Exclusion in sendModel() der 2. Thread die Daten vom 1. Thread viel früher bekommen würde als mit(meist mehrere Sekunden). Allerdings treten ohne stopModel() und ohne der Mutal Exlusion in sendModel() früher oder später Fehler der Art: „Debug Assertion Failed! Expession: vector iterator not deferencable auf.“<br />
Ich wollte hier nur kurz nachfragen, ob wer einen Weg kennt, wie man die Übergabe des Vektors von Thread 1 zu Thread 2 beschleunigen kann, ohne dass es irgendwann zu einem Fehler kommt. Hier nun kurz der etwas abgespeckte Code der 2 Threads, ich hoffe es ist verständlich:</p>
<pre><code class="language-cpp">static vector&lt;MyStruct&gt; temp;
static vector&lt;MyStruct&gt; res;
static vector&lt;MyStruct&gt; a;
static vector&lt;MyStruct&gt; b;

void stopModel(){

	enabled = false;	
}

void sendModel(vector&lt;MyStruct&gt; temp){

	vector&lt;MyStruct&gt; pre;
	pre = temp;
	pre = gm[currentModel]-&gt;removeElements(pre);
	WaitForSingleObject(mMutex, INFINITE);
	b = pre;
	ReleaseMutex(mMutex);
	enabled = true;

}

//Thread 1
DWORD WINAP ModelCreatorThreadProc(LPVOID lpParameter){

…

while(true){

		if(hasjob == 1){

		stopModel();

		//Create Model
		temp = createModel(temp);

		//Send Model
		sendModel(temp);
		temp.clear();

		}

}
}

//Thread 2
void modelProcessor(void *pMyID){
	while(true){
	if(enabled){
	a = b;
	for (UINT i = 0; i&lt;a.size(); i++){

	 //Do something with each element of the vector.

	}

	}

	}
}
</code></pre>
<p>Ich bin für jede Hilfe dankbar.<br />
Mit freundlichen Grüßen<br />
Pezibär</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/288135/problem-mit-der-übergabe-eines-vektors-von-einem-thread-zum-nächsten</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 02:28:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/288135.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Jun 2011 19:18:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit der Übergabe eines Vektors von einem Thread zum Nächsten on Fri, 10 Jun 2011 19:18:02 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich hab ein kleines Problem mit der Übergabe eines Vektors von einem Thread zum Nächsten.<br />
Das Programm, dass ich gerade entwickle verwendet jeweils einen Thread(im angefügten Code ist das ModelCreatorThreadProc), um in unregelmäßigen Abständen einen Vektor mit Daten zu erstellen, und diesen Vektor dem 2. Thread zum Arbeiten zu übergeben. Der 2. Thread benutzt dann diese Daten. Wenn der 1. Thread einen Job zur Erzeugung neuer Daten bekommt, soll der 2. Thread zuerst aufhören, mit den alten Daten zu arbeiten, deshalb ruft er stopModel() auf. Für die Erstellung der Daten benötigt der 1. Thread im Normalfall nicht mehr als 1-2 Sekunden, danach soll er die Daten mit sendModel() dem 2. Thread übergeben, sodass dieser wieder mit diesen arbeiten kann, bis neue Daten vom 1. Thread erzeugt werden. Der 2. Thread benutzt diese Daten in einer Endlosschleife, wobei ein Durchlauf fast nie länger als 10 ms dauert.<br />
Das Problem das ich nun habe ist, dass ohne dem Aufruf von stopModel() und ohne der Mutual Exclusion in sendModel() der 2. Thread die Daten vom 1. Thread viel früher bekommen würde als mit(meist mehrere Sekunden). Allerdings treten ohne stopModel() und ohne der Mutal Exlusion in sendModel() früher oder später Fehler der Art: „Debug Assertion Failed! Expession: vector iterator not deferencable auf.“<br />
Ich wollte hier nur kurz nachfragen, ob wer einen Weg kennt, wie man die Übergabe des Vektors von Thread 1 zu Thread 2 beschleunigen kann, ohne dass es irgendwann zu einem Fehler kommt. Hier nun kurz der etwas abgespeckte Code der 2 Threads, ich hoffe es ist verständlich:</p>
<pre><code class="language-cpp">static vector&lt;MyStruct&gt; temp;
static vector&lt;MyStruct&gt; res;
static vector&lt;MyStruct&gt; a;
static vector&lt;MyStruct&gt; b;

void stopModel(){

	enabled = false;	
}

void sendModel(vector&lt;MyStruct&gt; temp){

	vector&lt;MyStruct&gt; pre;
	pre = temp;
	pre = gm[currentModel]-&gt;removeElements(pre);
	WaitForSingleObject(mMutex, INFINITE);
	b = pre;
	ReleaseMutex(mMutex);
	enabled = true;

}

//Thread 1
DWORD WINAP ModelCreatorThreadProc(LPVOID lpParameter){

…

while(true){

		if(hasjob == 1){

		stopModel();

		//Create Model
		temp = createModel(temp);

		//Send Model
		sendModel(temp);
		temp.clear();

		}

}
}

//Thread 2
void modelProcessor(void *pMyID){
	while(true){
	if(enabled){
	a = b;
	for (UINT i = 0; i&lt;a.size(); i++){

	 //Do something with each element of the vector.

	}

	}

	}
}
</code></pre>
<p>Ich bin für jede Hilfe dankbar.<br />
Mit freundlichen Grüßen<br />
Pezibär</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076550</guid><dc:creator><![CDATA[Pezibär]]></dc:creator><pubDate>Fri, 10 Jun 2011 19:18:02 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Übergabe eines Vektors von einem Thread zum Nächsten on Sat, 11 Jun 2011 23:51:03 GMT]]></title><description><![CDATA[<p>Wieso überhaupt 2 Threads? Wenn immer einer auf den anderen warten muss, reicht doch einer auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076914</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 11 Jun 2011 23:51:03 GMT</pubDate></item></channel></rss>