<?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[Fehler beim öffnen der seriellen Schnittstelle]]></title><description><![CDATA[<p>Hallo,</p>
<p>in folgender Memberfunktion möchte ich die Serielle Schnittstelle konfigurieren. Das Problem das ich habe ist das ich bei der if-Anweisung<br />
if(m_hCom == INVALID_HANDLE_VALUE) {...} immer den Wert 6 mit GetLastError bekomme also das der HANDLE ungültig ist. Woran kann das liegen denn am Anfang schliesse ich ja eventuell geöfneten Handle mit CloseHandle(...).<br />
Die BCD Struktur initialisiere ich mit GetCommState vor also kann das schon mal daran nicht liegen. Weis jemand wo mein Fehler liegt. Das ganze läuft in der Debug-Version erstmal soll aber später als Release laufen.</p>
<p>vielen Dank schon mal</p>
<p>MfG</p>
<pre><code class="language-cpp">BOOL CLVErrSimDlg::SerialCommunikation()
{
	DWORD f = 10;
	DCB dcb;
	COMMTIMEOUTS comtimeout;

	CloseHandle(m_hCom);			// HANDLE falls vergeben löschen

	// Serielle Schnittstelle konfigurieren
	m_hCom = CreateFile(m_pCOMPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); 
	GetCommState(m_hCom, &amp;dcb);		// Werte des COM-Ports holen (vorinitialisieren)

	dcb.BaudRate	 = CBR_9600;
	dcb.ByteSize	 = 8;
	dcb.Parity		 = NOPARITY;
	dcb.StopBits	 = ONESTOPBIT;

	SetCommState(m_hCom, &amp;dcb);		// neue Werte übergeben

	// Timeout-Zeit für die Serielle Schnittstelle einstellen
	GetCommTimeouts(m_hCom, &amp;comtimeout);			
	comtimeout.ReadIntervalTimeout = MAXDWORD;	
	comtimeout.ReadTotalTimeoutConstant = 500;	
	comtimeout.ReadTotalTimeoutMultiplier = MAXDWORD;
	comtimeout.WriteTotalTimeoutConstant = 500;
	comtimeout.WriteTotalTimeoutMultiplier = MAXWORD;
	SetCommTimeouts(m_hCom, &amp;comtimeout);		

	if(m_hCom == INVALID_HANDLE_VALUE)
	{
		DWORD FileErr = GetLastError();
		CString str = &quot; &quot;;
		str.Format(&quot;%d&quot;, FileErr);
		MessageBox(str);
		return 0;
	}

	else
		return 1;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/53565/fehler-beim-öffnen-der-seriellen-schnittstelle</link><generator>RSS for Node</generator><lastBuildDate>Mon, 01 Jun 2026 09:35:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/53565.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Oct 2003 11:45:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Thu, 30 Oct 2003 11:45:24 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>in folgender Memberfunktion möchte ich die Serielle Schnittstelle konfigurieren. Das Problem das ich habe ist das ich bei der if-Anweisung<br />
if(m_hCom == INVALID_HANDLE_VALUE) {...} immer den Wert 6 mit GetLastError bekomme also das der HANDLE ungültig ist. Woran kann das liegen denn am Anfang schliesse ich ja eventuell geöfneten Handle mit CloseHandle(...).<br />
Die BCD Struktur initialisiere ich mit GetCommState vor also kann das schon mal daran nicht liegen. Weis jemand wo mein Fehler liegt. Das ganze läuft in der Debug-Version erstmal soll aber später als Release laufen.</p>
<p>vielen Dank schon mal</p>
<p>MfG</p>
<pre><code class="language-cpp">BOOL CLVErrSimDlg::SerialCommunikation()
{
	DWORD f = 10;
	DCB dcb;
	COMMTIMEOUTS comtimeout;

	CloseHandle(m_hCom);			// HANDLE falls vergeben löschen

	// Serielle Schnittstelle konfigurieren
	m_hCom = CreateFile(m_pCOMPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); 
	GetCommState(m_hCom, &amp;dcb);		// Werte des COM-Ports holen (vorinitialisieren)

	dcb.BaudRate	 = CBR_9600;
	dcb.ByteSize	 = 8;
	dcb.Parity		 = NOPARITY;
	dcb.StopBits	 = ONESTOPBIT;

	SetCommState(m_hCom, &amp;dcb);		// neue Werte übergeben

	// Timeout-Zeit für die Serielle Schnittstelle einstellen
	GetCommTimeouts(m_hCom, &amp;comtimeout);			
	comtimeout.ReadIntervalTimeout = MAXDWORD;	
	comtimeout.ReadTotalTimeoutConstant = 500;	
	comtimeout.ReadTotalTimeoutMultiplier = MAXDWORD;
	comtimeout.WriteTotalTimeoutConstant = 500;
	comtimeout.WriteTotalTimeoutMultiplier = MAXWORD;
	SetCommTimeouts(m_hCom, &amp;comtimeout);		

	if(m_hCom == INVALID_HANDLE_VALUE)
	{
		DWORD FileErr = GetLastError();
		CString str = &quot; &quot;;
		str.Format(&quot;%d&quot;, FileErr);
		MessageBox(str);
		return 0;
	}

	else
		return 1;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/382547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/382547</guid><dc:creator><![CDATA[mike2003]]></dc:creator><pubDate>Thu, 30 Oct 2003 11:45:24 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Thu, 30 Oct 2003 12:29:32 GMT]]></title><description><![CDATA[<p>Wenn ich den PC neustarte, bekomme ich einen gültigen Handle, aber sowas muss doch auch ohne herunterfahren gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/382612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/382612</guid><dc:creator><![CDATA[mike2003]]></dc:creator><pubDate>Thu, 30 Oct 2003 12:29:32 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Thu, 30 Oct 2003 12:48:40 GMT]]></title><description><![CDATA[<p>Hi,<br />
nach SetCommTimeouts füge mal ein:</p>
<pre><code class="language-cpp">PurgeComm( hPortHandle, PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_RXABORT );
</code></pre>
<p>Dann müsste es gehen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/382642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/382642</guid><dc:creator><![CDATA[Cosmixx]]></dc:creator><pubDate>Thu, 30 Oct 2003 12:48:40 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Thu, 30 Oct 2003 16:13:32 GMT]]></title><description><![CDATA[<p>danke für deine hilfe aber es geht immer noch nicht kann einmal diese Funktion bei Programmstart ausführen danach bekomme ich wieder von GetLastError die 6 zurück</p>
<p>noch ne andere Idee ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/382846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/382846</guid><dc:creator><![CDATA[mike2003]]></dc:creator><pubDate>Thu, 30 Oct 2003 16:13:32 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 07:26:25 GMT]]></title><description><![CDATA[<p>Hmmm, das is komisch. Ich mach eigentlich alles genauso wie Du beim Öffnen der seriellen Schnittstelle - und bei mir funktionierts. Das einzige is, dass ich die Timeouts anders setze. Vielleicht probierst Du das mal:</p>
<pre><code class="language-cpp">COMMTIMEOUTS comtime;
GetCommTimeouts( m_hPort, &amp;comtime );  
comtime.ReadIntervalTimeout= MAXDWORD;
comtime.ReadTotalTimeoutMultiplier=0;
comtime.ReadTotalTimeoutConstant= 0;
comtime.WriteTotalTimeoutMultiplier=10;
comtime.WriteTotalTimeoutConstant=100;
SetCommTimeouts( m_hPort, &amp;comtime );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/383183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383183</guid><dc:creator><![CDATA[Cosmixx]]></dc:creator><pubDate>Fri, 31 Oct 2003 07:26:25 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 07:50:58 GMT]]></title><description><![CDATA[<p>Der Fehler tritt ja schon vorher auf bei<br />
m_hCom = CreateFile(...), deshalb kann das nicht an den Werten der COMMTIMEOUT Struktur liegen. Ich bekomme ja bei h_mCom das vorher ausgeführt wird den ungültigen Handle. Auch schon mit PurgeCom.. und CloseHandle... ausprobiert aber irgendwie funzt das alles nicht :-(( Bekomme immer wieder von GetLastError 6 zurück komisch.</p>
<p>Hast du sonst noch eine Idee ?</p>
<p>Kann ich z.B. abfragen warum ich keinen gültigen HANDLE bekomme um auf die Ursache zu stossen ?</p>
<pre><code class="language-cpp">// Serielle Schnittstelle konfigurieren
	m_hCom = CreateFile(m_pCOMPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); 
	BOOL handle = GetCommState(m_hCom, &amp;dcb);		// Werte des COM-Ports holen (vorinitialisieren)
	int error = GetLastError();

	dcb.BaudRate	 = CBR_9600;
	dcb.ByteSize	 = 8;
	dcb.Parity		 = NOPARITY;
	dcb.StopBits	 = ONESTOPBIT;

	SetCommState(m_hCom, &amp;dcb);		// neue Werte übergeben

	// Timeout-Zeit für die Serielle Schnittstelle einstellen
	GetCommTimeouts(m_hCom, &amp;comtimeout);			
	comtimeout.ReadIntervalTimeout = MAXDWORD;	
	comtimeout.ReadTotalTimeoutConstant = 500;	
	comtimeout.ReadTotalTimeoutMultiplier = 10;
	comtimeout.WriteTotalTimeoutConstant = 500;
	comtimeout.WriteTotalTimeoutMultiplier = MAXWORD;
	SetCommTimeouts(m_hCom, &amp;comtimeout);
</code></pre>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383198</guid><dc:creator><![CDATA[mike2003]]></dc:creator><pubDate>Fri, 31 Oct 2003 07:50:58 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 07:55:25 GMT]]></title><description><![CDATA[<p>GetLastError sollte helfen.</p>
<p>Ich bin mal so neugierig: Hast du keine MSDN? Ich habe nur das Kapitel zu CreateFile überflogen und das gefunden.<br />
Das soll jetzt keineswegs böse gemeint sein, ich bin echt nur neugierig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383201</guid><dc:creator><![CDATA[estartu]]></dc:creator><pubDate>Fri, 31 Oct 2003 07:55:25 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 08:04:56 GMT]]></title><description><![CDATA[<p>Habe noch zu erwähnen das das ganze im Thread abläuft sorry. Nämlich so<br />
wird sie aufgerufen:</p>
<p>Ablauf:<br />
OnStartSim ruft - &gt; MainThread und der wiederrum -&gt; Automaticsim. Am Ende der Simulation wird dann SendStopCommand aufgerufen um den Test zu beenden.</p>
<pre><code class="language-cpp">void CLVErrSimDlg::OnStartsim01() 
{
	// Listboxinhalt löschen
	m_ctrLogStatus.ResetContent();	
	m_ctrLogStatus.AddString(&quot;Test wird gestartet&quot;);

	m_nFlagNum = 2;
	CWinThread* pThread = AfxBeginThread(MainThread, this);
}

UINT CLVErrSimDlg::MainThread(LPVOID pParam)
{
	CLVErrSimDlg* pDlg = (CLVErrSimDlg*) pParam; // Konverierung des NULL-Zeigers in den gewünschten

	if(pDlg-&gt;m_nFlagNum == 1)
	{
		pDlg-&gt;DataSend();																// normale Simulation ausführen
		return 0;
	}

	if(pDlg-&gt;m_nFlagNum == 2)
	{
		pDlg-&gt;Automaticsim();														// automatische Simualation ohne Rücksprung auf 00 ausführen 
		return 0;
	}

	if(pDlg-&gt;m_nFlagNum == 3)
	{
		pDlg-&gt;Automaticsim2();													// automatische Simualation mit Rücksprung auf 00 ausführen 
		return 0;
	}

return	1;
}

void CLVErrSimDlg::Automaticsim() 
{
		m_nAnzlichtsnr = 100;
		m_nFehlerstation = 11;
		m_nCodeNum = 1;

		m_bWrite = 0;
		m_bReadStatus = 0;
		m_bErrFlgTr = FALSE;
		m_bErrFlgRc = FALSE;

		m_bStartFlg = TRUE;
		m_bAutomTestFlg = TRUE;
		int nDelayTime = 1;
		BOOL status = TRUE;				// Status der Datenkommunikation

		// Start -und Stoppbit werden automatisch generiert

		// SerielleSchnittstelle konfigurieren
		if((status = this-&gt;SerialCommunikation()) == FALSE)
			MessageBox(&quot;Kein Zugriff auf die serielle Schittstelle !!!&quot;, &quot;Zugriffsverweigerung auf die serielle Schnittstelle&quot;, MB_ICONERROR);

		else
		{...}
}

BOOL CLVErrSimDlg::SendStopCommand()
{
	DWORD f = 10; 
	int m_nAKN = 0;
	BOOL m_bWrite = 0;
	BOOL m_bReadStatus = 0;

	if((m_bStartFlg == TRUE) &amp;&amp; (m_bErrFlgRc == FALSE))
	{...}

	//m_hCom = 0;
	m_bStartFlg = FALSE;
	m_bErrFlgTr = FALSE;
	m_bErrFlgRc = FALSE;
	m_bAutomTestFlg = FALSE;
	m_nFlagNum = 0;

	m_ctrLogStatus.AddString(&quot;Test gestoppt !!!&quot;);

	BOOL handle = CloseHandle(m_hCom);

int error = GetLastError();
	if((m_bErrFlgTr == FALSE) &amp;&amp; (m_bErrFlgTr == FALSE))
		return 1;
	else
		return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/383210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383210</guid><dc:creator><![CDATA[mike2003]]></dc:creator><pubDate>Fri, 31 Oct 2003 08:04:56 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 08:12:18 GMT]]></title><description><![CDATA[<p>Ja ich habe die MSDN aber da steht auch nicht mehr wie</p>
<p>Communications Resources<br />
The CreateFile function can create a handle to a communications resource, such as the serial port COM1. For communications resources, the dwCreationDisposition parameter must be OPEN_EXISTING, and the hTemplate parameter must be NULL. Read, write, or read-write access can be specified, and the handle can be opened for overlapped I/O. For more information about communications, see Communications.</p>
<p>drinne. Und das habe ich alles gemacht.</p>
<p>GetLastError() benutze ich auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383211</guid><dc:creator><![CDATA[mike2003]]></dc:creator><pubDate>Fri, 31 Oct 2003 08:12:18 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 08:16:28 GMT]]></title><description><![CDATA[<p>Aaaaah,<br />
schreib mal beim 6. Parameter von CreateFile FILE_ATTRIBUTE_NORMAL hin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383212</guid><dc:creator><![CDATA[Cosmixx]]></dc:creator><pubDate>Fri, 31 Oct 2003 08:16:28 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 08:30:49 GMT]]></title><description><![CDATA[<p>Und was sagt dir GetLastError?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383220</guid><dc:creator><![CDATA[estartu]]></dc:creator><pubDate>Fri, 31 Oct 2003 08:30:49 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 08:36:56 GMT]]></title><description><![CDATA[<p>funzt auch nicht</p>
<p>GetLastError sagt liefert immer noch 6 zurück.</p>
<p>Gibts keine API oder MFC-Funktion Funktion die mir sagen kann warum mir das Betriebssystem keinen gültigen HANDLE übergibt ?</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383223</guid><dc:creator><![CDATA[mike2003]]></dc:creator><pubDate>Fri, 31 Oct 2003 08:36:56 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 08:52:36 GMT]]></title><description><![CDATA[<p>Mach mal das hier:</p>
<pre><code class="language-cpp">LPVOID lpMsgBuf;
FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    GetLastError(),
    0, // Default language
    (LPTSTR) &amp;lpMsgBuf,
    0,
    NULL 
);
// Process any inserts in lpMsgBuf.
// ...
// Display the string.
MessageBox( NULL, (LPCTSTR)lpMsgBuf, &quot;Error&quot;, MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/383227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383227</guid><dc:creator><![CDATA[Cosmixx]]></dc:creator><pubDate>Fri, 31 Oct 2003 08:52:36 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 08:52:39 GMT]]></title><description><![CDATA[<p>Mein letzter Versuch:</p>
<p>Du machst vielleicht schon vor dem Öffnen was falsch. Habe gerade das hier gefunden:</p>
<blockquote>
<p>ERROR_INVALID_HANDLE : The internal file identifier is incorrect.</p>
</blockquote>
<p>Naja, noch viel Glück</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383228</guid><dc:creator><![CDATA[estartu]]></dc:creator><pubDate>Fri, 31 Oct 2003 08:52:39 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 08:54:16 GMT]]></title><description><![CDATA[<p>Habe eine neue Erkenntnis erlangt. Nachdem ich den Rechner neugestartet habe, und vorher den 6 Parameter auf FILE_ATTRIBUTE_NORMAL geändert habe, funzt es (bin zwar immer noch nicht 100% sicher das es auf Langzeit ohne Probleme läuft aber werde ich ja sehen) z.B. hat eben das Programm nach 3 mal starten gehangen und muste es über den Task-Manager beenden. Hast du eine Idee wie ich das abfangen kann (also das das Programm nicht hängen bleibt)?</p>
<p>Finde es echt blöd das wenn man im Debugmodus einmal einen üngültigen Handler durch die Programmierung bekommt, das man Win neustarten muss. Verstehst du warum das so ist ?</p>
<p>Weist du des weiteren vieleicht wie ich einen Thread ausserhalb einer Schleife beenden kann.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383231</guid><dc:creator><![CDATA[mike2003]]></dc:creator><pubDate>Fri, 31 Oct 2003 08:54:16 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 09:14:33 GMT]]></title><description><![CDATA[<p>Schön das es funktioniert. Das mit dem neustarten is komisch. Am besten is, wenn Du im Hintergrund einem Port-Monitor laufen hast, dann siehst Du genau, was passiert, z.B. Portmon (Freeware) bei <a href="http://www.sysinternals.com" rel="nofollow">www.sysinternals.com</a></p>
<p>Von außen kann man einen Thread über TerminateThread beenden, das sollte man aber im Normalfall unterlassen (Siehe MSDN).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383254</guid><dc:creator><![CDATA[Cosmixx]]></dc:creator><pubDate>Fri, 31 Oct 2003 09:14:33 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 09:17:59 GMT]]></title><description><![CDATA[<p>Danke für Eure Hilfe Jungs,</p>
<p>aber warum sollte man es unterlassen einen Thread von aussen zu beenden ?</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383257</guid><dc:creator><![CDATA[mike2003]]></dc:creator><pubDate>Fri, 31 Oct 2003 09:17:59 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 09:20:17 GMT]]></title><description><![CDATA[<p><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>
<blockquote>
<p>TerminateThread is used to cause a thread to exit. When this occurs, the target thread has no chance to execute any user-mode code and its initial stack is not deallocated. DLLs attached to the thread are not notified that the thread is terminating.</p>
<p>This function reduces memory leaks by clearing the stack before exiting. It also terminates the thread process only if the thread in question is the main or primary thread.</p>
<p>TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination. For example, TerminateThread can result in the following problems:</p>
<p>If the target thread owns a critical section, the critical section will not be released.<br />
If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread’s process could be inconsistent.<br />
If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/383259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383259</guid><dc:creator><![CDATA[Cosmixx]]></dc:creator><pubDate>Fri, 31 Oct 2003 09:20:17 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 09:22:05 GMT]]></title><description><![CDATA[<p>Weil der Thread sonst keine Aufräumarbeiten mehr erledigen kann. Sowas sollte man tatsächlich nur im Ausnahmefall machen oder wenn man keinen Einfluss hat auf den Thread. Da du aber den Thread selber schreibst, kannst du auch eine Abfrage auf ein Flag einfügen, das den Thread dazu veranlasst zu beenden.</p>
<p>Ich machs häufig ähnlich dem Shutdown-Prozess von Linux:<br />
Erst das Flag setzen (Sending term Signal), eine bestimmte Zeit auf den Thread warten, und dann, wenns bis dahin nicht beendet wurde, mit Gewalt dahinter (Sending kill signal) um den restlichen Ablauf nicht zu stören.</p>
<p>-junix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383261</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Fri, 31 Oct 2003 09:22:05 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 09:24:51 GMT]]></title><description><![CDATA[<p>Oh oh da habt Ihr Recht.</p>
<p>Aber gibts denn eine Methode die laufende Threads des Programms aus abfragen kann ohne externe Programme wie z.B. den Prozessexplorer zu verwenden ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383265</guid><dc:creator><![CDATA[mike2003]]></dc:creator><pubDate>Fri, 31 Oct 2003 09:24:51 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 09:31:26 GMT]]></title><description><![CDATA[<p>Ja, GetExitCodeThread()</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/760">@junix</a><br />
Dieses Flag sollte man aber dann irgendwie in eine CriticalSection o.ä. packen, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383274</guid><dc:creator><![CDATA[Cosmixx]]></dc:creator><pubDate>Fri, 31 Oct 2003 09:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 09:37:46 GMT]]></title><description><![CDATA[<p>wieso in eine CriticalSection dieses Flag rettet nur im Falle der Terminierung des Threads den Zustand also ob der Thread erfolgreich oder nicht erfolgreich beendet wurde mehr macht diese Funktion doch nicht.</p>
<p>Ich finde sogar was oft in Vergessenheit gerät weil man schneller programmieren will sollte man generell bei mehreren Threads Prioritäten vergeben und Isollieren d.h. wie z.B. CriticalSection aber den Thread an sich nicht den Zusatand des Flags oder ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383281</guid><dc:creator><![CDATA[mike2003]]></dc:creator><pubDate>Fri, 31 Oct 2003 09:37:46 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 10:32:32 GMT]]></title><description><![CDATA[<p>Mmh, also ich dachte das wär so:</p>
<p>Im Thread befindet sich irgendwo die Zeile:</p>
<pre><code class="language-cpp">if ( flagShutdown )
{
 //Thread beenden
}
</code></pre>
<p>So. Und wenn jetzt irgendwo im Programm dieses Flag auf true gesetzt wird,<br />
während der Thread gerade die Zeile if( flagShutdown ) liest, dann ist das doch nicht ynchronisiert oder hab ich da was falsch verstanden? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/383339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383339</guid><dc:creator><![CDATA[Cosmixx]]></dc:creator><pubDate>Fri, 31 Oct 2003 10:32:32 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 10:38:21 GMT]]></title><description><![CDATA[<p>Cosmixx schrieb:</p>
<blockquote>
<p>Dieses Flag sollte man aber dann irgendwie in eine CriticalSection o.ä. packen, oder?</p>
</blockquote>
<p>Wenn mans wirklich sauber machen will, dann sollte man in der Tat über eine Zugriffsfunktion welche das Flag in einer Thread-Sicheren umgebung abfragt gehen. Der (Prozessor-)Zeitverlust ist meines Erachtens minimal. Wobei das Terminate-Flag in sofern eigentlich nicht weiter Thread-Kritisch sein muss.</p>
<p>Ich hab z.B. immer eine Zugriffsfunktion &quot;Terminate&quot; welche das Flag auf true setzt. Alle anderen lesen nur davon... Theoretisch sollte eigentlich da nix passieren, wenn man den lesenden Zugriff nicht in eine Critical Section passt. Allerdings muss man das natürlich von implementation zu implementation entscheiden... Ich hab mir z.B. eine CThread-Klasse gebaut, welche keine Critical-Sections nutzt. Aus oben genannten Gründen.</p>
<p>Das schlimmste was passieren kann, ist das der Thread in der Schleife einmal mehr durchläuft als eigentlich nötig. Wie gesagt. Der Programmierer muss hier klar abschätzen.</p>
<p>Für die &quot;Sending kill signal&quot;-Phase welche man dann ja mit TerminateThread implementiert, ist das Alles sowieso wieder eher nichtig.</p>
<p>-junix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383347</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Fri, 31 Oct 2003 10:38:21 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 10:43:15 GMT]]></title><description><![CDATA[<p>Das man in der Schleife den Thread mit einem Flag auf true setzen beendet ist logisch, ich meinte aber angenommen ich starte einen Thread der etwas abarbeitet und dann beendet werden soll ohne überhaupt nur eine Schleife zu durchlaufen, wie beende ich dann den Thread oder brauche ich das nicht killt Windows dem Thread nach einer Timeoutzeit von alleine ? Was muss ich aber machen wenn ich ihn vorher beenden will und nicht auf Windows warten möchte ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383354</guid><dc:creator><![CDATA[mike2003]]></dc:creator><pubDate>Fri, 31 Oct 2003 10:43:15 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler beim öffnen der seriellen Schnittstelle on Fri, 31 Oct 2003 10:43:42 GMT]]></title><description><![CDATA[<p>Cosmixx schrieb:</p>
<blockquote>
<p>Mmh, also ich dachte das wär so:</p>
<p>Im Thread befindet sich irgendwo die Zeile:</p>
<pre><code class="language-cpp">if ( flagShutdown )
{
 //Thread beenden
}
</code></pre>
</blockquote>
<p>Naja würde ich nicht unbedingt sagen. Meistens läuft ein Thread ja mehrere Male durch seine Aufgaben. also sähe es eher so aus:</p>
<pre><code class="language-cpp">//-- Setup code
while (!flagShutdown)
{
    //-- Working code
}
//-- Cleanup code

return result_int
</code></pre>
<p>Sollte es nun passieren, dass der Thread in sich wieder Aufgaben erledigt, die schleifen enthalten, gilt natürlich das Selbe. Wenn einfach eine &quot;längere&quot; Sequenz innerhalb der Schleife steckt, dann kanns allerdings vorkommen, dass (zumindest ich mach das so) noch ein paar extra if-abfragen gesetzt werden... das kommt bei mir allerdings selten vor, weil ich meistens noch Progressbars aktualisieren möchte, etc. Und dafür kann ich sowieso keine längeren Rechnungen als ca. 0.5s am Stück brauchen.</p>
<p>-junix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/383356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/383356</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Fri, 31 Oct 2003 10:43:42 GMT</pubDate></item></channel></rss>