<?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[Probleme beim Synchorniesieren von Threads]]></title><description><![CDATA[<p>(Hoffe bin im Richtigen Bereich..)</p>
<p>Hallo ich habe gerade folgende Situation.</p>
<p>Ich besitze eine beliebiege Anzahl von Threads, welche &quot;paralel&quot; ihre Berechnungen machen und die berechneten Werte in eine gemeinsame Datenbasis Schreiben.<br />
Diese Threads müssen miteinander synchroniesiert werden, da sie untereinander auf die Werte der anderen Threads aus dem letzten Rechendurchgang zurückgreifen.<br />
Daher müssen alle Treads einen Rechendurchgang beendet haben, ihre Daten an die Datenbasis übermittelt haben befor der nächste Rechendurchgang starten darf.</p>
<p>Im Moment versuche ich dies mittels EVENTS und einer Statusverwaltenen Klasse zu realiesieren. Betohnung liegt leider auf Versuche.... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Denn leider funktioniert das einfach nicht so wie es soll.<br />
Und ich sehe den Wald vor lauter Bäumen nicht mehr...... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
<p>Im Prinziep suche ich eine Möglichkeit die beliebig vielen Threads<br />
auf ein oder mehrere Events schlafen zu legen und alle gleichzeitig mit einem Signal(en) wieder zu wecken.<br />
Bisher verweisen dafür alle Threads mittels Zeiger auf die eine Statusverwaltene Klasse. Diese zählt die gesammt Anzahl der Threads, sowie jene die sich als Aktiv bei ihr melden und jene die warten auf synch.</p>
<p>Weiter hat die VerwalterKlasse zwei Instanz auf die Klasse EVENT und schickt Threads über diese Instanz schlafen wenn bei einer Prüfung der internen Zähler noch nicht alle Threads mit einem Rechnendurchgang fertig sind. Zu welchem Event die Threads geschickt werden ist abhängig vom Aktuellen Rechendurchlauf. Hintergrund es kamm vor das ein Thread länger zum reaktivieren brauchte und das anstehende Signal von einem anderen Thread der eigendlich warten sollte ,weil er den folgenden Rechendurchgang schon beendet hatte, genutzt wurde, daher 2 verschiedene Events<br />
Der letzte Thread der fertig wird sollte dann alle anderen wieder wecken ohne sich selber schlafen zu legen. *tolle Therorie <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> *<br />
Nur leider bekomme ich es nicht hin alle Threads zu wecken.<br />
D.H. es kommt vor das ein Thread sein Signal einfach Tja überhört... und weiter schläft. Was einen Deadlock zur Folge hat. Dies geschieht sporadisch mal im 10 mal im 100 mal im 1000 Rechendurchlauf...</p>
<p>Wenn Jemand einen Ansatz hat wie man das Problem lösen kann Bitte her damit,<br />
wenn ihr noch mehr infos braucht bitte fragen.<br />
Bin für jeden Tipp dankbar, denn solangsam bekomme ich HASS auf diesen Teil meines Programms <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p>Und schon mal danke an jeden der sich das bis hier her durchgelesen hat <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Hier die Event Klasse HEADER</p>
<pre><code class="language-cpp">#if !defined EVENTS_H
#define EVENTS_H

#include &lt;windows.h&gt;

class TEvent
{
public:
	TEvent(int = TRUE);
	~TEvent(void);
	void EventSignal(void);
	void EventWait(void);
	void EventReset(void);
	int EventTest(void);
private:
	HANDLE Event;	
};

#endif
</code></pre>
<p>Die Event Klasse CPP</p>
<pre><code class="language-cpp">#include &quot;Events.h&quot;

TEvent::TEvent(int automatic)
{
	Event = CreateEvent(NULL,!automatic,FALSE,NULL);	
}

TEvent::~TEvent(void)
{
	CloseHandle(Event);
}

void TEvent::EventSignal(void)
{
	SetEvent(Event);
}

void TEvent::EventReset(void)
{
	ResetEvent(Event);
}

void TEvent::EventWait(void)
{
	WaitForSingleObject(Event,INFINITE);
}

int TEvent::EventTest(void)
{
	return (WaitForSingleObject(Event,0) != WAIT_TIMEOUT);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/118478/probleme-beim-synchorniesieren-von-threads</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Jul 2026 11:18:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/118478.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 20 Aug 2005 17:48:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme beim Synchorniesieren von Threads on Sat, 20 Aug 2005 17:48:09 GMT]]></title><description><![CDATA[<p>(Hoffe bin im Richtigen Bereich..)</p>
<p>Hallo ich habe gerade folgende Situation.</p>
<p>Ich besitze eine beliebiege Anzahl von Threads, welche &quot;paralel&quot; ihre Berechnungen machen und die berechneten Werte in eine gemeinsame Datenbasis Schreiben.<br />
Diese Threads müssen miteinander synchroniesiert werden, da sie untereinander auf die Werte der anderen Threads aus dem letzten Rechendurchgang zurückgreifen.<br />
Daher müssen alle Treads einen Rechendurchgang beendet haben, ihre Daten an die Datenbasis übermittelt haben befor der nächste Rechendurchgang starten darf.</p>
<p>Im Moment versuche ich dies mittels EVENTS und einer Statusverwaltenen Klasse zu realiesieren. Betohnung liegt leider auf Versuche.... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Denn leider funktioniert das einfach nicht so wie es soll.<br />
Und ich sehe den Wald vor lauter Bäumen nicht mehr...... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
<p>Im Prinziep suche ich eine Möglichkeit die beliebig vielen Threads<br />
auf ein oder mehrere Events schlafen zu legen und alle gleichzeitig mit einem Signal(en) wieder zu wecken.<br />
Bisher verweisen dafür alle Threads mittels Zeiger auf die eine Statusverwaltene Klasse. Diese zählt die gesammt Anzahl der Threads, sowie jene die sich als Aktiv bei ihr melden und jene die warten auf synch.</p>
<p>Weiter hat die VerwalterKlasse zwei Instanz auf die Klasse EVENT und schickt Threads über diese Instanz schlafen wenn bei einer Prüfung der internen Zähler noch nicht alle Threads mit einem Rechnendurchgang fertig sind. Zu welchem Event die Threads geschickt werden ist abhängig vom Aktuellen Rechendurchlauf. Hintergrund es kamm vor das ein Thread länger zum reaktivieren brauchte und das anstehende Signal von einem anderen Thread der eigendlich warten sollte ,weil er den folgenden Rechendurchgang schon beendet hatte, genutzt wurde, daher 2 verschiedene Events<br />
Der letzte Thread der fertig wird sollte dann alle anderen wieder wecken ohne sich selber schlafen zu legen. *tolle Therorie <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> *<br />
Nur leider bekomme ich es nicht hin alle Threads zu wecken.<br />
D.H. es kommt vor das ein Thread sein Signal einfach Tja überhört... und weiter schläft. Was einen Deadlock zur Folge hat. Dies geschieht sporadisch mal im 10 mal im 100 mal im 1000 Rechendurchlauf...</p>
<p>Wenn Jemand einen Ansatz hat wie man das Problem lösen kann Bitte her damit,<br />
wenn ihr noch mehr infos braucht bitte fragen.<br />
Bin für jeden Tipp dankbar, denn solangsam bekomme ich HASS auf diesen Teil meines Programms <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p>Und schon mal danke an jeden der sich das bis hier her durchgelesen hat <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Hier die Event Klasse HEADER</p>
<pre><code class="language-cpp">#if !defined EVENTS_H
#define EVENTS_H

#include &lt;windows.h&gt;

class TEvent
{
public:
	TEvent(int = TRUE);
	~TEvent(void);
	void EventSignal(void);
	void EventWait(void);
	void EventReset(void);
	int EventTest(void);
private:
	HANDLE Event;	
};

#endif
</code></pre>
<p>Die Event Klasse CPP</p>
<pre><code class="language-cpp">#include &quot;Events.h&quot;

TEvent::TEvent(int automatic)
{
	Event = CreateEvent(NULL,!automatic,FALSE,NULL);	
}

TEvent::~TEvent(void)
{
	CloseHandle(Event);
}

void TEvent::EventSignal(void)
{
	SetEvent(Event);
}

void TEvent::EventReset(void)
{
	ResetEvent(Event);
}

void TEvent::EventWait(void)
{
	WaitForSingleObject(Event,INFINITE);
}

int TEvent::EventTest(void)
{
	return (WaitForSingleObject(Event,0) != WAIT_TIMEOUT);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/855073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/855073</guid><dc:creator><![CDATA[wastman]]></dc:creator><pubDate>Sat, 20 Aug 2005 17:48:09 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim Synchorniesieren von Threads on Mon, 22 Aug 2005 11:19:02 GMT]]></title><description><![CDATA[<p>Hat keiner einen Tipp oder auch nur eine Frage ?<br />
*aaargh* Gruß wastman</p>
]]></description><link>https://www.c-plusplus.net/forum/post/856008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856008</guid><dc:creator><![CDATA[wastman]]></dc:creator><pubDate>Mon, 22 Aug 2005 11:19:02 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim Synchorniesieren von Threads on Mon, 22 Aug 2005 20:40:56 GMT]]></title><description><![CDATA[<p>der code den du gepostet hast stimmt so, also schwer zu sagen was nicht läuft</p>
]]></description><link>https://www.c-plusplus.net/forum/post/856499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856499</guid><dc:creator><![CDATA[CMatt]]></dc:creator><pubDate>Mon, 22 Aug 2005 20:40:56 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim Synchorniesieren von Threads on Mon, 22 Aug 2005 23:40:59 GMT]]></title><description><![CDATA[<p>Hmmm<br />
habe jetzt mal alternativ versucht statt alle Threads in 2 Events am ende der Berechnung zu halten, jeden Thread in seinem eigenen Event anzuhalten. Und natürlich dann auch jedem sein eigenes Signal zu schicken.<br />
Hat auch nicht geklappt.<br />
Denke mal der Fehler liegt in meiner ThreadStatus Klasse...<br />
werd die gleich mal im Anschluß posten. Sieht leider Mittlerweile ein bissel<br />
öhm unordentlich aus, da ich da nun schon X Sachen ausprobiert habe .... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /><br />
Vielleicht findet ihr da einen gedanklichen, form, sonstigen Fehler meinerseits.<br />
Eine 2. Meinung ist da ja manchmal ziemlich hielfreich :p</p>
<p>ThreadStatus Header</p>
<pre><code class="language-cpp">#if !defined THREADSTATUS_H
#define THREADSTATUS_H

#include &quot;resource.h&quot;
#include &lt;iostream.h&gt;
#include &lt;windows.h&gt;
#include &lt;direct.h&gt;
#include &quot;Mutex.h&quot;
#include &quot;Events.h&quot;
#include &quot;GlobalData.h&quot;
#include &lt;vector&gt;
#include &lt;iterator&gt;

using namespace std;

class TThreadStatus
{
public:
	TThreadStatus(bool DEBUG =true);	

	void ThreadAlsAktivAnmelden(bool ThreadAnmeldeStatus, int FahrzeugNummer);
	void ThreadWartetAufSynch(bool ThreadAnmeldeStatus ,int FahrzeugNummer);
	void ThreadAusloggen(bool ThreadZustand , int FahrzuegNummer);
	void StatusReset();
	bool SynchThreadStart(int FahrzuegNummer);	

	TGlobalData *GlobalData;

	int FahrzeugeImSystem;
	int RechenDurchlauf;	
	int ThreadAktiv ;
	int ThreadWartend ;
	int ThreadInsgesammt ;
	bool ErsteThreadAnmeldung;
private:
	bool SynchDebug;

	void OnlineAuswertung(HWND hwnd);
	bool FileAuswertung(int FahrzeugNummer);
	void CreateNewEventGerade();
	void CreateNewEventUngerade();
	void SignalEvents();
	void SetWaitEvent();

	vector&lt;TEvent&gt; EventGerade;
	vector&lt;TEvent&gt; EventUngerade;
	vector&lt;TEvent&gt;::iterator EventPos;

	TMutex Mutex;
};

#endif
</code></pre>
<p>ThreadStatus CPP</p>
<pre><code class="language-cpp">#include &quot;ThreadStatus.h&quot;

TThreadStatus::TThreadStatus(bool Debug)
// Konstructor
{	
	SynchDebug = false;
	ErsteThreadAnmeldung = false;
	ThreadInsgesammt =0;
	ThreadAktiv =0;
	ThreadWartend =0;
	RechenDurchlauf =1;
	TS_Dialog_Offen = false;
}

void TThreadStatus::CreateNewEventGerade()
// Eine neue Instantz auf Event anlegen und im Vector speichern
// für die geraden Rechendurchläufe
{
	TEvent NewEvent;
	EventGerade.push_back(NewEvent);
}

void TThreadStatus::CreateNewEventUngerade()
// Eine neue Instantz auf Event anlegen und im Vector speichern
// Für die ungeraden Rechenduchläufe
{
	TEvent NewEvent;
	EventUngerade.push_back(NewEvent);
}

void TThreadStatus::SetWaitEvent()
// Fahrzeug auf sein Event warten lassen
{
	if((RechenDurchlauf % 2) == 0)
	{	
		CreateNewEventGerade();
		EventPos = EventGerade.end();
	}
	else
	{
		CreateNewEventUngerade();
		EventPos = EventUngerade.end();
	}
	EventPos--; // auf neu angelegtes Element bringen

	Mutex.LeaveMutex();
	EventPos-&gt;EventWait();
}

void TThreadStatus::SignalEvents()
// Schickt an alle Events das Wecksignal
// je nach RechenDurchlauf an Gerade oder Ungerade
{
	int AnzahlEvents = 0;

	if((RechenDurchlauf % 2) == 0)
	{	
		AnzahlEvents = EventGerade.size();
		EventPos = EventGerade.begin();
	}
	else
	{
		AnzahlEvents = EventUngerade.size();
		EventPos = EventUngerade.begin();
	}

	for (int i = 0; i &lt; AnzahlEvents; i++)
	{
		EventPos-&gt;EventSignal();
		EventPos++;
	}

	if((RechenDurchlauf % 2) == 0)
		EventGerade.clear();
	else
		EventUngerade.clear();
}

void TThreadStatus::ThreadAlsAktivAnmelden(bool ThreadAnmeldeStatus ,int FahrzeugNummer)
// Thread Im Status System auf Aktiv setzen
{
	Mutex.EnterMutex();

	if(this-&gt;ErsteThreadAnmeldung == false) 
		this-&gt;ErsteThreadAnmeldung = true;

	if(ThreadAnmeldeStatus == false)
	{
		this-&gt;ThreadInsgesammt++;
		Sleep(100);
	}

	//if((ThreadWartend &gt;0) &amp;&amp; (ThreadAnmeldeStatus == true))
		//	this-&gt;ThreadWartend--;	

	this-&gt;ThreadAktiv++;	

	this-&gt;FileAuswertung(FahrzeugNummer);	

	Mutex.LeaveMutex();	
}

void TThreadStatus::ThreadWartetAufSynch(bool ThreadAnmeldeStatus , int FahrzeugNummer )
// Thread in wartezustand bis zur herstellunfg der Synchonisation versetzen
{	
	Mutex.EnterMutex();

	if(this-&gt;ErsteThreadAnmeldung == false)	
		ErsteThreadAnmeldung = true;

	if(ThreadAnmeldeStatus == false)
	{
		this-&gt;ThreadInsgesammt++;
		Sleep(100);
	}

	if((this-&gt;ThreadAktiv &gt;0) &amp;&amp; (ThreadAnmeldeStatus == true))
		ThreadAktiv--;

	this-&gt;ThreadWartend++;

	this-&gt;FileAuswertung(FahrzeugNummer);

	if(this-&gt;SynchThreadStart(FahrzeugNummer) == FALSE)	
	{		
		// Mutex Freigeben in SetWaitEvent Funktion
		this-&gt;SetWaitEvent();		
	}
	else
		Mutex.LeaveMutex();	

}

bool TThreadStatus::SynchThreadStart(int FahrzeugNummer)
// Gibt alle angehaltenen Threads für einen weiteren Berechnungsdurchgang frei
{		
	if((this-&gt;ThreadInsgesammt == this-&gt;ThreadWartend) &amp;&amp; (this-&gt;ThreadAktiv == 0) 
		&amp;&amp; (this-&gt;ErsteThreadAnmeldung==true) &amp;&amp; (this-&gt;ThreadInsgesammt == this-&gt;FahrzeugeImSystem))
	{	
		// Tauschen der Akt. liste mit der Use Liste
		GlobalData-&gt;GDListenTauschen();

		this-&gt;SignalEvents();

		this-&gt;RechenDurchlauf++;
		this-&gt;ThreadWartend = 0;
		this-&gt;FileAuswertung(FahrzeugNummer);

		return TRUE;
	}	
	return FALSE;	
}

void TThreadStatus::StatusReset()
// Status in NULL Zustand zurückversetzen
{
	Mutex.EnterMutex();
	ThreadInsgesammt =0;
	ThreadAktiv =0;
	ThreadWartend =0;
	Mutex.LeaveMutex();

}

void TThreadStatus::ThreadAusloggen(bool ThreadZustand ,int FahrzeugNummer)
// Abmelden eines Threads aus dem Status
{	// was ist mit thread die terminiert werden ???? hmmm

	Mutex.EnterMutex();	

	ThreadInsgesammt--;

	if(this-&gt;ThreadInsgesammt == 0)
		this-&gt;ErsteThreadAnmeldung = false;

	if(ThreadZustand == true)
		if(this-&gt;ThreadAktiv &gt; 0)
			this-&gt;ThreadAktiv--;
	else
		if(this-&gt;ThreadWartend &gt; 0 )
			this-&gt;ThreadWartend--;

	this-&gt;FileAuswertung(FahrzeugNummer);	

	Mutex.LeaveMutex();	
}

bool TThreadStatus::FileAuswertung(int FahrzeugNummer)
{
	FILE *pf;
	string sDateipfad = &quot;\\TS.txt&quot;; 
	const char * cDateipfad;
	string Pfad;

	int curdrive;
	char path[600];
	curdrive = _getdrive();
	_getdcwd( curdrive, path, 600 );

	string Programmpfad = path;	

	Pfad += Programmpfad;
	Pfad += sDateipfad;

	cDateipfad = Pfad.c_str();	

	pf = fopen( cDateipfad, &quot;a&quot;);  
	if (! pf)
		return FALSE;	

	fprintf(pf,&quot;===================FzN:%d\n&quot;,FahrzeugNummer);
	fprintf(pf,&quot;Aktiv: %d\n&quot;, this-&gt;ThreadAktiv);
	fprintf(pf,&quot;Wartend: %d\n&quot;,this-&gt;ThreadWartend);
	fprintf(pf,&quot;Insgesammt: %d\n&quot;,this-&gt;ThreadInsgesammt);
	fprintf(pf,&quot;SWABs: %d\n&quot;, this-&gt;RechenDurchlauf-1);

	fclose(pf);
	return TRUE;	
}
</code></pre>
<p>Mutex Header</p>
<pre><code class="language-cpp">// stellt eine Klasse zur Behandlung von Mutexen zur Verfügung

#if !defined MUTEX_H
#define MUTEX_H

#include &lt;windows.h&gt;

class TMutex
{
	public:
		TMutex(void);
		virtual ~TMutex(void);
		virtual void EnterMutex(void);
		virtual int EnterMutexWithTimeout(void);
		virtual void LeaveMutex(void);
	private:
		HANDLE Mutex;
};

#endif
</code></pre>
<p>Mutex Cpp</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &quot;Mutex.h&quot;

TMutex::TMutex(void)
{
	Mutex = CreateMutex(NULL, FALSE, NULL);
}

TMutex::~TMutex(void)
{
	CloseHandle(Mutex);
}

void TMutex::EnterMutex(void)
{
	WaitForSingleObject(Mutex,INFINITE);
}

int TMutex::EnterMutexWithTimeout(void)
{
	return (WaitForSingleObject(Mutex,0) != WAIT_TIMEOUT);
}

void TMutex::LeaveMutex(void)
{
	ReleaseMutex(Mutex);
}
</code></pre>
<p>Hoffe mal irgend jemand sieht meinen/einen Fehler ..... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/856561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856561</guid><dc:creator><![CDATA[wastman]]></dc:creator><pubDate>Mon, 22 Aug 2005 23:40:59 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim Synchorniesieren von Threads on Tue, 23 Aug 2005 08:08:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">TEvent NewEvent;
EventGerade.push_back(NewEvent);
</code></pre>
<p>Sowas geht nicht. Nach dem Ende der Funktion wird der Destruktor von TEvent aufgerufen und du hast in deinem vector ein Event mit geschlossenem Handle.</p>
<p>Ob das was mit deinem Problem zu tun hat? Keine Ahnung. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/856639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856639</guid><dc:creator><![CDATA[copy1]]></dc:creator><pubDate>Tue, 23 Aug 2005 08:08:12 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim Synchorniesieren von Threads on Tue, 23 Aug 2005 11:37:29 GMT]]></title><description><![CDATA[<p>Hmmm könnte vielleicht was dran sein werde mir das gleich nochmal genauer ansehen.<br />
Auf der anderen Seite muß ich sagen das das trotz dessen der Status eine gewisse Zeit mit geschlossenen Handle recht gut läuft. Nur irgendwann läuft dann was schief.<br />
Ich Poste mal einen entsprechenden Auszug aus einer Logdatei.</p>
<p>Auszug wo es Klappt</p>
<pre><code>===================FzN:1
Aktiv: 1
Wartend: 0
Insgesammt: 1
SWABs: 0
===================FzN:2
Aktiv: 2
Wartend: 0
Insgesammt: 2
SWABs: 0
===================FzN:1
Aktiv: 1
Wartend: 1
Insgesammt: 2
SWABs: 0
===================FzN:2
Aktiv: 0
Wartend: 2
Insgesammt: 2
SWABs: 0
===================FzN:2
Aktiv: 0
Wartend: 0
Insgesammt: 2
SWABs: 1
===================FzN:2
Aktiv: 1
Wartend: 0
Insgesammt: 2
SWABs: 1
===================FzN:2
Aktiv: 0
Wartend: 1
Insgesammt: 2
SWABs: 1
===================FzN:1
Aktiv: 1
Wartend: 1
Insgesammt: 2
SWABs: 1
===================FzN:1
Aktiv: 0
Wartend: 2
Insgesammt: 2
SWABs: 1
===================FzN:1
Aktiv: 0
Wartend: 0
Insgesammt: 2
SWABs: 2

.....
</code></pre>
<p>SWABs heißen eigendlich SWAP(), weil da Listen getauscht werden, und stellen im übertragenen Sinne die RechenDurchlaufNummer da.</p>
<p>Fehler kann sporadisch bei jedem Durchgang passieren</p>
<pre><code>...

===================FzN:1
Aktiv: 0
Wartend: 2
Insgesammt: 2
SWABs: 284
===================FzN:1
Aktiv: 0
Wartend: 0
Insgesammt: 2
SWABs: 285
===================FzN:2
Aktiv: 1
Wartend: 0
Insgesammt: 2
SWABs: 285
===================FzN:2
Aktiv: 0
Wartend: 1
Insgesammt: 2
SWABs: 285
===================FzN:1
Aktiv: 1
Wartend: 1
Insgesammt: 2
SWABs: 285
[b]===================FzN:2 // Fehlerhaftes Verhalten ab hier
Aktiv: 2
Wartend: 1
Insgesammt: 2
SWABs: 285[/b]
===================FzN:1
Aktiv: 1
Wartend: 2
Insgesammt: 2
SWABs: 285
===================FzN:2
Aktiv: 0
Wartend: 3
Insgesammt: 2
SWABs: 285
===================FzN:1
Aktiv: 1
Wartend: 3
Insgesammt: 2
SWABs: 285
===================FzN:1
Aktiv: 0
Wartend: 4
Insgesammt: 2
SWABs: 285
===================FzN:2
Aktiv: 1
Wartend: 4
Insgesammt: 2
SWABs: 285
===================FzN:2
Aktiv: 0
Wartend: 5
Insgesammt: 2
SWABs: 285

...
</code></pre>
<p>Der gleiche Fehler tritt auch bei mehr als 2 Threads auf, Getestet mit 3 und 4 Threads. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/856810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856810</guid><dc:creator><![CDATA[wastman]]></dc:creator><pubDate>Tue, 23 Aug 2005 11:37:29 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim Synchorniesieren von Threads on Tue, 23 Aug 2005 16:15:59 GMT]]></title><description><![CDATA[<p>So der Tipp mit dem geschlossenen Handle war schon mal ganz gut *Danke* <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>
<p>Nur Leider haben ich jetzt gleich das nächste Problem. Und zwar ein Preformance Problem. Es kann nicht sein das ich bei 5 Threads und 1000 RechenDurchläufen 5 Min und länger warten muß. Somal die Threads noch keine Arbeit verrichten außer An und Abmelden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Daher meine Vermutung , das die Threads ewig brauchen um auf die Signale zu reagieren.<br />
Da eine fern Diagnose schwierig ist habe ich mal eine zusammgegefasste Testversion geschrieben ( mit MVS 6.0 Autoren Version).<br />
Kann sich jeder der möchte gerne mal rein/runter ziehen. Bin immer noch für jeden Tip dankbar.</p>
<p><a href="http://www.mannshausen.com/wastman/ThreadStatusTest.zip" rel="nofollow">http://www.mannshausen.com/wastman/ThreadStatusTest.zip</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/857055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/857055</guid><dc:creator><![CDATA[wastman]]></dc:creator><pubDate>Tue, 23 Aug 2005 16:15:59 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim Synchorniesieren von Threads on Wed, 24 Aug 2005 08:35:45 GMT]]></title><description><![CDATA[<p>Soooooo</p>
<p>für alle die das hier vielleicht verfolgen oder über die Suche mit einem ähnlichen Problem hier landen, ich hab es für mich zumindest gelößt.</p>
<p>Und das beste ist mit recht guter Preformance.<br />
Super Simpel.<br />
Und ganz ohne Events... (&lt;-- Blöden S#+#!&quot;# Dinger da....)</p>
<p>Hätte ich mir echt früher überlegen sollen, hätte mir eine menge Zeit und<br />
Frust ersparrt. Na Ja hinterher ist man immer schlauer.<br />
Ist dennoch schon extrem, wie langsam das Programm mit den Event wurde <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>ThreadStatus Header</p>
<pre><code class="language-cpp">#if !defined THREADSTATUS_H
#define THREADSTATUS_H

#include &quot;resource.h&quot;
#include &lt;iostream.h&gt;
#include &lt;windows.h&gt;
#include &lt;direct.h&gt;
#include &quot;Mutex.h&quot;
#include &quot;GlobalData.h&quot;

using namespace std;

class TThreadStatus
{
public:
	TThreadStatus(bool DEBUG =true);	

	void ThreadAlsAktivAnmelden(bool ThreadAnmeldeStatus, int FahrzeugNummer);
	void ThreadWartetAufSynch(bool ThreadAnmeldeStatus ,int FahrzeugNummer);
	void ThreadAusloggen(bool ThreadZustand , int FahrzuegNummer);
	void StatusReset();
	bool SynchThreadStart(int FahrzuegNummer);	

	TGlobalData *GlobalData;

	int FahrzeugeImSystem;
	int RechenDurchlauf;	
	int ThreadAktiv ;
	int ThreadWartend ;
	int ThreadInsgesammt ;
	bool ErsteThreadAnmeldung;
	bool SperreGeradeDurchlaufe;
	bool SperreUngeradeDurchlaufe;

	HWND TS_Dialog;
	bool TS_Dialog_Offen;

	TMutex Mutex;

private:
	bool SynchDebug;

	void OnlineAuswertung(HWND hwnd);
	bool FileAuswertung(int FahrzeugNummer);w

	TMutex TestMutex;
};

#endif
</code></pre>
<p>ThreadStatus CPP</p>
<pre><code class="language-cpp">#include &quot;ThreadStatus.h&quot;

TThreadStatus::TThreadStatus(bool Debug)
// Konstruktor
{	
	this-&gt;SynchDebug = true;
	this-&gt;ErsteThreadAnmeldung = false;
	this-&gt;ThreadInsgesammt =0;
	this-&gt;ThreadAktiv =0;
	this-&gt;ThreadWartend =0;
	this-&gt;RechenDurchlauf =1;
	this-&gt;SperreGeradeDurchlaufe = true;
	this-&gt;SperreUngeradeDurchlaufe = false;
}

void TThreadStatus::ThreadAlsAktivAnmelden(bool ThreadAnmeldeStatus ,int FahrzeugNummer)
// Thread Im Status System auf Aktiv setzen
{
	Mutex.EnterMutex();

	if(this-&gt;ErsteThreadAnmeldung == false) 
		this-&gt;ErsteThreadAnmeldung = true;

	if(ThreadAnmeldeStatus == false)
	{
		this-&gt;ThreadInsgesammt++;
		Sleep(100);
	}

	//if((ThreadWartend &gt;0) &amp;&amp; (ThreadAnmeldeStatus == true))
		//	this-&gt;ThreadWartend--;	

	this-&gt;ThreadAktiv++;	

	this-&gt;FileAuswertung(FahrzeugNummer);	

	Mutex.LeaveMutex();	
}

void TThreadStatus::ThreadWartetAufSynch(bool ThreadAnmeldeStatus , int FahrzeugNummer )
// Thread in wartezustand bis zur herstellunfg der Synchonisation versetzen
{	
	Mutex.EnterMutex();

	if(this-&gt;ErsteThreadAnmeldung == false)	
		ErsteThreadAnmeldung = true;

	if(ThreadAnmeldeStatus == false)
	{
		this-&gt;ThreadInsgesammt++;
		Sleep(100);
	}

	if((this-&gt;ThreadAktiv &gt;0) &amp;&amp; (ThreadAnmeldeStatus == true))
		ThreadAktiv--;

	this-&gt;ThreadWartend++;

	this-&gt;FileAuswertung(FahrzeugNummer);

	if(this-&gt;SynchThreadStart(FahrzeugNummer) == FALSE)	
	{	
		bool test;
		if(this-&gt;RechenDurchlauf % 2 == 0)
		{
			TestMutex.EnterMutex();	
				test = this-&gt;SperreGeradeDurchlaufe;
			TestMutex.LeaveMutex();

			Mutex.LeaveMutex();
			while(test != true)
			{
				TestMutex.EnterMutex();
					test = this-&gt;SperreGeradeDurchlaufe;
				TestMutex.LeaveMutex();

				Sleep(1);
			}
		}
		else
		{
			TestMutex.EnterMutex();				
				test = this-&gt;SperreUngeradeDurchlaufe;
			TestMutex.LeaveMutex();

			Mutex.LeaveMutex();
			while(test != true)
			{				
				TestMutex.EnterMutex();				
					test = this-&gt;SperreUngeradeDurchlaufe;				
				TestMutex.LeaveMutex();				

				Sleep(1);
			}
		}
	}
	else
		Mutex.LeaveMutex();	

}

bool TThreadStatus::SynchThreadStart(int FahrzeugNummer)
// Gibt alle angehaltenen Threads für einen weiteren Berechnungsdurchgang frei
{		
	if((this-&gt;ThreadInsgesammt == this-&gt;ThreadWartend) &amp;&amp; (this-&gt;ThreadAktiv == 0) 
		&amp;&amp; (this-&gt;ErsteThreadAnmeldung==true) &amp;&amp; (this-&gt;ThreadInsgesammt == this-&gt;FahrzeugeImSystem))
	{	
		// Tauschen der Akt. liste mit der Use Liste
		GlobalData-&gt;GDListenTauschen();

		TestMutex.EnterMutex();
		if(this-&gt;RechenDurchlauf % 2 == 0)
		// Sicherstellen das die Akt. Sperre erst freigegeben wird wenn die andere wieder gesetzt ist
		{
			this-&gt;SperreUngeradeDurchlaufe = false;
			this-&gt;SperreGeradeDurchlaufe = true;			
		}
		else
		{
			this-&gt;SperreGeradeDurchlaufe = false;
			this-&gt;SperreUngeradeDurchlaufe = true;
		}
		TestMutex.LeaveMutex();

		this-&gt;RechenDurchlauf++;
		this-&gt;ThreadWartend = 0;
		this-&gt;FileAuswertung(FahrzeugNummer);

		return TRUE;
	}	
	return FALSE;	
}

void TThreadStatus::StatusReset()
// Status in NULL Zustand zurückversetzen
{
	Mutex.EnterMutex();
	ThreadInsgesammt =0;
	ThreadAktiv =0;
	ThreadWartend =0;
	RechenDurchlauf = 1;
	TestMutex.EnterMutex();
	this-&gt;SperreGeradeDurchlaufe = true;
	this-&gt;SperreUngeradeDurchlaufe = false;
	TestMutex.LeaveMutex();
	Mutex.LeaveMutex();

}

void TThreadStatus::ThreadAusloggen(bool ThreadZustand ,int FahrzeugNummer)
// Abmelden eines Threads aus dem Status
{	// was ist mit thread die terminiert werden ???? hmmm noch nicht beachtet

	Mutex.EnterMutex();	

	ThreadInsgesammt--;

	if(this-&gt;ThreadInsgesammt == 0)
		this-&gt;ErsteThreadAnmeldung = false;

	if(ThreadZustand == true)
		if(this-&gt;ThreadAktiv &gt; 0)
			this-&gt;ThreadAktiv--;
	else
		if(this-&gt;ThreadWartend &gt; 0 )
			this-&gt;ThreadWartend--;

	this-&gt;FileAuswertung(FahrzeugNummer);	

	Mutex.LeaveMutex();	
}

bool TThreadStatus::FileAuswertung(int FahrzeugNummer)
{
	if(this-&gt;SynchDebug == true)
	{
		FILE *pf;
		string sDateipfad = &quot;\\TS.txt&quot;; 
		const char * cDateipfad;
		string Pfad;

		int curdrive;
		char path[600];
		curdrive = _getdrive();
		_getdcwd( curdrive, path, 600 );

		string Programmpfad = path;	

		Pfad += Programmpfad;
		Pfad += sDateipfad;

		cDateipfad = Pfad.c_str();	

		pf = fopen( cDateipfad, &quot;a&quot;);  
		if (! pf)
			return FALSE;	

		fprintf(pf,&quot;===================FzN:%d\n&quot;,FahrzeugNummer);
		fprintf(pf,&quot;Aktiv: %d\n&quot;, this-&gt;ThreadAktiv);
		fprintf(pf,&quot;Wartend: %d\n&quot;,this-&gt;ThreadWartend);
		fprintf(pf,&quot;Insgesammt: %d\n&quot;,this-&gt;ThreadInsgesammt);
		fprintf(pf,&quot;SWABs: %d\n&quot;, this-&gt;RechenDurchlauf-1);

		fclose(pf);
		return TRUE;	
	}
	return FALSE;
}
</code></pre>
<p>OK zugegeben meine Rechtschreibung ist manchmal (öhm) komisch, einfach ignorrieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
<p>So nochmal Danke an alle die sich das Problem angeschaut haben und vielleicht den ein oder anderen Gedanken dran mit verschwendet haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/857336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/857336</guid><dc:creator><![CDATA[wastman]]></dc:creator><pubDate>Wed, 24 Aug 2005 08:35:45 GMT</pubDate></item></channel></rss>