<?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[Threads mit Hilfe von Event-Objects steuern]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>mein Programm beinhaltet zwei Threads. Nach einer bestimmten aktion sollte ThreadLesenPerson angehalten werden und ThreadLesenGeraet gestartet werden.<br />
Ich versuche es mit Hilfe von Event objects zu realisieren. Dabei werden beide threads mit einem Button gestartet. Sie warten dann auf &quot;aktivierung&quot; und laufen bis sie beenden werden. Thread laufen nich gleichzeitig. ThreadLesenGeraete startet wenn der erste Thread beendet wird.</p>
<p>Mein Problemm: Ersten Thread anhalten und zweiten startet. Mit meinem Code (weiter unten skizziert) schaffe ich es nicht. Erste Thread hält nie an. Deshalb bitte um Hilfe, Hinweise und weblinks.</p>
<pre><code>UINT ThreadLesenPerson(LPVOID param)
{
	bool bTagread = false;
	sSerNr = '0';
	sError = '0';

	::WaitForSingleObject(threadStart.m_hObject, INFINITE);

	BOOL keepRunning = TRUE;
	while (keepRunning)
	{
		int result = ::WaitForSingleObject(threadEnd.m_hObject, 0);
		if (result == WAIT_OBJECT_0) 
		{
			keepRunning = FALSE;
		}

		//Funktion
		Identification(sSerNr, bTagread, sError);

		if(bTagread)
		{
			::PostMessage((HWND)param, WM_PERSID, 1, 0); // hier setze ich: threadStart.ResetEvent();
		}												 // und: threadGerIdentStart.SetEvent();
		else
		{
			::PostMessage((HWND)param, WM_PERSID, 0, 0);
		}
	}

	return 0;
}
UINT ThreadLesenGeraet(LPVOID param)
{		
	bool bTagread = false;
	sSerNr = '0';
	sError = '0';

	::WaitForSingleObject(threadGerIdentStart.m_hObject, INFINITE);

	BOOL keepRunning = TRUE;
	while (keepRunning)
	{
		int result = ::WaitForSingleObject(threadGerIdentEnd.m_hObject, 0);
		if (result == WAIT_OBJECT_0) 
				keepRunning = FALSE;

		Identification(sSerNr, bTagread, sError);
		if(bTagread)
		{
			::PostMessage((HWND)param, WM_GERID, 1, 0);
		}
		else
		{
			::PostMessage((HWND)param, WM_GERID, 0, 0);
		}
	}
	return 0;
}
</code></pre>
<p>Vielen Dank im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/156974/threads-mit-hilfe-von-event-objects-steuern</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Jul 2026 07:34:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/156974.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 Aug 2006 05:16:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Threads mit Hilfe von Event-Objects steuern on Tue, 22 Aug 2006 05:16:28 GMT]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>mein Programm beinhaltet zwei Threads. Nach einer bestimmten aktion sollte ThreadLesenPerson angehalten werden und ThreadLesenGeraet gestartet werden.<br />
Ich versuche es mit Hilfe von Event objects zu realisieren. Dabei werden beide threads mit einem Button gestartet. Sie warten dann auf &quot;aktivierung&quot; und laufen bis sie beenden werden. Thread laufen nich gleichzeitig. ThreadLesenGeraete startet wenn der erste Thread beendet wird.</p>
<p>Mein Problemm: Ersten Thread anhalten und zweiten startet. Mit meinem Code (weiter unten skizziert) schaffe ich es nicht. Erste Thread hält nie an. Deshalb bitte um Hilfe, Hinweise und weblinks.</p>
<pre><code>UINT ThreadLesenPerson(LPVOID param)
{
	bool bTagread = false;
	sSerNr = '0';
	sError = '0';

	::WaitForSingleObject(threadStart.m_hObject, INFINITE);

	BOOL keepRunning = TRUE;
	while (keepRunning)
	{
		int result = ::WaitForSingleObject(threadEnd.m_hObject, 0);
		if (result == WAIT_OBJECT_0) 
		{
			keepRunning = FALSE;
		}

		//Funktion
		Identification(sSerNr, bTagread, sError);

		if(bTagread)
		{
			::PostMessage((HWND)param, WM_PERSID, 1, 0); // hier setze ich: threadStart.ResetEvent();
		}												 // und: threadGerIdentStart.SetEvent();
		else
		{
			::PostMessage((HWND)param, WM_PERSID, 0, 0);
		}
	}

	return 0;
}
UINT ThreadLesenGeraet(LPVOID param)
{		
	bool bTagread = false;
	sSerNr = '0';
	sError = '0';

	::WaitForSingleObject(threadGerIdentStart.m_hObject, INFINITE);

	BOOL keepRunning = TRUE;
	while (keepRunning)
	{
		int result = ::WaitForSingleObject(threadGerIdentEnd.m_hObject, 0);
		if (result == WAIT_OBJECT_0) 
				keepRunning = FALSE;

		Identification(sSerNr, bTagread, sError);
		if(bTagread)
		{
			::PostMessage((HWND)param, WM_GERID, 1, 0);
		}
		else
		{
			::PostMessage((HWND)param, WM_GERID, 0, 0);
		}
	}
	return 0;
}
</code></pre>
<p>Vielen Dank im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121914</guid><dc:creator><![CDATA[Ugene]]></dc:creator><pubDate>Tue, 22 Aug 2006 05:16:28 GMT</pubDate></item><item><title><![CDATA[Reply to Threads mit Hilfe von Event-Objects steuern on Tue, 22 Aug 2006 06:35:59 GMT]]></title><description><![CDATA[<p>Wenn die beiden Threads sowieso nicht gleichzeitig sondern nacheinander laufen, wieso kannst Du nicht alles in einen Thread packen?</p>
<p>Wenn niemand die endThread Events setzt wird auch keiner der Threads beendet werden.<br />
Ich kan an Deinen Threads nicht erkennen woher Sie Ihre Informationen beziehen und vor allem was sie eigentlich tun. Die Laufzeitdaten ändern sich ja in diesem Code nicht. Wer setzt den die Daten? Wer setzt die Events?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121934</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 22 Aug 2006 06:35:59 GMT</pubDate></item><item><title><![CDATA[Reply to Threads mit Hilfe von Event-Objects steuern on Tue, 22 Aug 2006 07:03:16 GMT]]></title><description><![CDATA[<p>erstmals danke für die Anwort.</p>
<p>Alles in einen Thread packen - daran habe ich auch grad eben gedacht. Das werde ich auch machen. Später.</p>
<p>So sieht die Struktur meines Progs aus:</p>
<pre><code>/*****************************************************************************
*
* Threads global
*
*****************************************************************************/
UINT ThreadLesenPerson(LPVOID param)
{
	bool bTagread = false;
	sSerNr = '0';
	sError = '0';

	::WaitForSingleObject(threadStart.m_hObject, INFINITE);

	BOOL keepRunning = TRUE;
	while (keepRunning)
	{
		int result = ::WaitForSingleObject(threadEnd.m_hObject, 0);
		if (result == WAIT_OBJECT_0) 
		{
			keepRunning = FALSE;
		}

		//Funktion
		Identification(sSerNr, bTagread, sError);

		if(bTagread)
		{
			::PostMessage((HWND)param, WM_PERSID, 1, 0); 
		}												 
		else
		{
			::PostMessage((HWND)param, WM_PERSID, 0, 0);
		}
	}

	return 0;
}
UINT ThreadLesenGeraet(LPVOID param)
{		
	bool bTagread = false;
	sSerNr = '0';
	sError = '0';

	::WaitForSingleObject(threadGerIdentStart.m_hObject, INFINITE);

	BOOL keepRunning = TRUE;
	while (keepRunning)
	{
		int result = ::WaitForSingleObject(threadGerIdentEnd.m_hObject, 0);
		if (result == WAIT_OBJECT_0) 
				keepRunning = FALSE;

		Identification(sSerNr, bTagread, sError);
		if(bTagread)
		{
			::PostMessage((HWND)param, WM_GERID, 1, 0);
		}
		else
		{
			::PostMessage((HWND)param, WM_GERID, 0, 0);
		}
	}
	return 0;
}
/******************************************************************************
*
* START
*
******************************************************************************/
void CBerwachungderMessgerteDlg::OnButtonStart() 
{ 

	bool ReaderReady = false;
	UpdateData(TRUE);

	ReaderReady = DetectReader();
	if(ReaderReady)//Reader ist betriebsbereit
	{
		if(ThreadIsStarted)
		{
			DeleteReader();
			m_Start.SetWindowText(&quot;&amp;Start&quot;);
			threadEnd.SetEvent();
			ThreadIsStarted = false;
			CEdit *Edtext = (CEdit *) GetDlgItem(IDC_EDIT_START_INFO); 
		}
		else
		{
			//CWaitCursor wait;
			m_Start.SetWindowText(&quot;&amp;Stop&quot;);
			//threadStart.SetEvent();
			threadGerIdentStart.SetEvent();
			HWND hWnd = GetSafeHwnd();
			AfxBeginThread(ThreadLesenPerson, hWnd, THREAD_PRIORITY_NORMAL);
			AfxBeginThread(ThreadLesenGeraet, hWnd, THREAD_PRIORITY_NORMAL);
			ThreadIsStarted = true;
		}
	}
	else//Reader nicht angeschlossen
	{
		GetDlgItem(IDC_EDIT_START_INFO)-&gt;SetWindowText(&quot;Reader anschließen&quot;);
		//hintergurnd in ROT färben
		m_Edt_StartInfo.SetBackColor(RGB(255,0,0));
		return;
	}

}	
/*****************************************************************************
*
* Thread Person Identifizierung
*
*
*****************************************************************************/
LONG CBerwachungderMessgerteDlg::PersID(WPARAM wParam, LPARAM lParam)
{						

	bool readFile = true;
	CString	info = '0';
	fstream PersFile;
	char zeile[80];
	char datSerNr[16];
	int i=0;

	datSerNr[0]='\0';

	//wenn Kein Tag gefunden
	if(wParam == 0)
	{
		GetDlgItem(IDC_EDIT_START_INFO)-&gt;SetWindowText(&quot;Bitte anmelden&quot;);
		m_Edt_StartInfo.SetBackColor(RGB(80,100,245));
		m_Edt_MemberInfo = &quot;Um sich anzumelden, ID-Karte in die Nähe des Readers bringen&quot;;

		m_Edt_BuchInfo.SetBackColor(RGB(192, 200, 200));
		m_Btn_Buchen.EnableWindow(FALSE);
		m_Edt_BuchInfo.EnableWindow(FALSE);
		m_sBuchInfo = &quot; &quot;;
		m_sKommentar = &quot; &quot;;
	}
	else
	{	
		//Datei öffnen
		PersFile.open(&quot;Autorisierte Personen.txt&quot;, ios::in);

		//zeilenweise Auslesen 
		//wenn ID gefunden oder FileEnde dann stop
		while(readFile &amp; !PersFile.eof())
		{	
			PersFile.getline(zeile, 80);

			info = zeile;	
			strcpy(datSerNr, zeile);
			datSerNr[16] = '\0';

			//Wenn ID aus der Datei mit ID des gelesenen TAGs übereinstimmen
			//D.h. autorisierte Person identifiziert 
			if(datSerNr == sSerNr)
			{
				readFile = false;
				GetDlgItem(IDC_EDIT_START_INFO)-&gt;SetWindowText(&quot;Anmeldung OK&quot;);
				//hintergurnd in GRÜN färben, Info im Fester ausgeben
				m_Edt_StartInfo.SetBackColor(RGB(0,255,0));
				m_Edt_MemberInfo = info;

				//m_Btn_Buchen.EnableWindow(TRUE);
				//m_Edt_Kommentar.EnableWindow(TRUE);
				//m_sKommentar =&quot;Kommentar hier einfügen&quot;;

				//Fenster Buchinfo einschalten und Infos darstellen
				m_Edt_BuchInfo.EnableWindow(TRUE);
				CEdit *GerInfoText = (CEdit *) GetDlgItem(IDC_EDIT_GERAETINFO); 
				GerInfoText-&gt;SetFont(&amp;FGerInfo); 
				m_sBuchInfo = &quot;Messgerät identifizieren&quot;;
				m_Edt_BuchInfo.SetBackColor(RGB(80,150,255));

				//ersten Thread anhalten
				//threadStart.ResetEvent();

				//zweiten Thread starten
				//threadGerIdentStart.SetEvent();
			}
			else
			{
				readFile = true; // weiter nach ID in der .txt Datei suchen
				GetDlgItem(IDC_EDIT_START_INFO)-&gt;SetWindowText(&quot;nicht autorisiert&quot;);
				m_Edt_StartInfo.SetBackColor(RGB(255,0,0));
				m_Edt_MemberInfo = &quot;Sie versuchen sich mit nicht autorisierter ID-Karte anzumelden&quot;;

				m_Btn_Buchen.EnableWindow(FALSE);
				m_Edt_BuchInfo.EnableWindow(FALSE);
				m_sKommentar =&quot; &quot;;	
			}	
		}

		PersFile.close();	
	}
	UpdateData(FALSE);
	return 0;
}	
/*****************************************************************************
*
* Thread Person Identifizierung
*
*	-	wParam = 0 -&gt; kein Tag gelesen
*	-	wParam = 1 -&gt; Tag wurde gelesen
*
*****************************************************************************/
LONG CBerwachungderMessgerteDlg::GerID(WPARAM wParam, LPARAM lParam)
{	
	bool bTagread = false;
	bool readFile = true;
	CString	zeilentext = '0';
	fstream GerListFile;
	char zeile[150];
	char datGerSerNr[16];
	char GerDaten[100];
	int i = 0;
	int a = 0;
	int j = 0;

	datGerSerNr[0]='\0'; //SerienNummer des GeräteTags aus der Datei

	UpdateData(TRUE);

	//Tag nicht gelesen
	if(wParam == 0)
	{
		GetDlgItem(IDC_EDIT_BUCHINFO)-&gt;SetWindowText(&quot;fehler!&quot;);
		//hintergurnd in ROT färben
		m_Edt_BuchInfo.SetBackColor(RGB(255,0,0));
		m_sKommentar = sError;

	}
	//Tag gelesen
	else
	{		
		//GerätListe.txt Datei öffnen
		GerListFile.open(&quot;GerätListe.txt&quot;, ios::in);

		//zeilenweise Auslesen 
		//wenn ID gefunden oder FileEnde dann stop
		while(readFile &amp; !GerListFile.eof())
		{	
			//zeilenweise GerätListe.txt lesen
			GerListFile.getline(zeile, 150);

			//zeilentext ist die gesamt gespeicherte information über messgerät
			zeilentext = zeile;	
			strcpy(datGerSerNr, zeile);
			datGerSerNr[16] = '\0';

			//Wenn ID aus der Datei mit ID des gelesenen TAGs übereinstimmen
			if(datGerSerNr == sSerNr)
			{
				//Nur Bezeichnung, Gerätart, Hersteller aus der Datei hollen
				//Diese Infos liegen genau zw 5ten und 8ten Semicollon
				int l = strlen(zeilentext);	
				for(i=0; i&lt;l; i++)
				{
					if (zeilentext[i]==';') a++;

					if (a &gt;= 5 &amp;&amp; a &lt; 8) 
					{
						GerDaten[j] = zeilentext[i+1];
						if(GerDaten[j]==';') GerDaten[j]=',';
						j++;
					}

					if(a == 8) GerDaten[j-1]=0;
				}
				readFile = false;
				//hintergurnd in GRÜN färben
				m_Edt_BuchInfo.SetBackColor(RGB(0,255,0));
				m_sBuchInfo = GerDaten;
				m_sGerInfo = &quot;Gerät identifiziert. Warte auf Buchung...&quot;;
				threadGerIdentEnd.SetEvent();
			}

			//sonst weitersuchen
			else
			{
				readFile = true;
				m_sBuchInfo = &quot;Fehler&quot;;
				m_Edt_BuchInfo.SetBackColor(RGB(255,0,0));
				m_sKommentar = &quot;Dieser ID-Karte ist kein Gerät zugewiesen&quot;;	
			}	
		}

		GerListFile.close();	
	}

	UpdateData(FALSE);
	return 0;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1121944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121944</guid><dc:creator><![CDATA[Ugene]]></dc:creator><pubDate>Tue, 22 Aug 2006 07:03:16 GMT</pubDate></item><item><title><![CDATA[Reply to Threads mit Hilfe von Event-Objects steuern on Tue, 22 Aug 2006 07:19:21 GMT]]></title><description><![CDATA[<p>das Programm sollte folgendes können:<br />
1.Identifizierung der Person<br />
2.Idnetifizierung des Gerätes<br />
Zeitliche Abfolge:<br />
wenn 1. fertig -&gt; 2.<br />
wenn 2. fertig -&gt; user action -&gt; 1. usw.</p>
<p>bisher kann es aber nur Punkt 1. problemmlos ausgeführt werden.</p>
<p>Fragen:<br />
a) Thread anhalten (ohne benutzung von sleep oder ähnlichem)<br />
b) Eventobjekt wieder als unsignaled setzen, nachdem es durch SetEvent() als signaled markiert wurde. mit ResetEvent()??</p>
<p>vielen Dank für eure Unterstützung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121951</guid><dc:creator><![CDATA[Ugene]]></dc:creator><pubDate>Tue, 22 Aug 2006 07:19:21 GMT</pubDate></item><item><title><![CDATA[Reply to Threads mit Hilfe von Event-Objects steuern on Tue, 22 Aug 2006 12:08:22 GMT]]></title><description><![CDATA[<p>Problem anderweitig gelöst.</p>
<p>vielen Dank fürs Lesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1122061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1122061</guid><dc:creator><![CDATA[Ugene]]></dc:creator><pubDate>Tue, 22 Aug 2006 12:08:22 GMT</pubDate></item></channel></rss>