<?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[RichEdit nach der Benutzung wieder freigeben?]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe eine Work-Klasse, die einmal eine Consolen-Klasse und einmal einen eig. Thread hat. Die Console verwaltet eine richedit komponent, und sobal CWork erstellt wird, wird ebenfalls die Konsole und der Thread gestartet.</p>
<p>Die Work-Klasse kann 5-20x exisitieren. Je nachdem was zu tun ist. Die Konsole schreibst dabei alles mit was man ihr übergibt.</p>
<p>PROBLEM:</p>
<p>Wenn ich nun, das Programm beenden will, warte ich mit WaitForsingleObject auf das Ende aller Threads.<br />
Doch das gibt Probleme, die Threads scheinen einfach aufzuhören zu arbeiten - nach 20sec geht es manchmal wieder weiter. Via BOOL Variable prüfe ich ob ein Shutdown kommt.</p>
<p>DIE LÖSUNG?</p>
<p>Wenn ich jedoch die RichEdit komponente leer lasse funktioniert alles wunderbar, alles wird perfekt beendet. sobald ich text in die Richedit komponente einfüge gibt es die Fehler.</p>
<p>Bin Ziemlich verwirrt. Kann ich irgendwie ein richedit controle freigeben?<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/181462/richedit-nach-der-benutzung-wieder-freigeben</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 20:19:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/181462.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 May 2007 06:27:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to RichEdit nach der Benutzung wieder freigeben? on Mon, 14 May 2007 06:27:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe eine Work-Klasse, die einmal eine Consolen-Klasse und einmal einen eig. Thread hat. Die Console verwaltet eine richedit komponent, und sobal CWork erstellt wird, wird ebenfalls die Konsole und der Thread gestartet.</p>
<p>Die Work-Klasse kann 5-20x exisitieren. Je nachdem was zu tun ist. Die Konsole schreibst dabei alles mit was man ihr übergibt.</p>
<p>PROBLEM:</p>
<p>Wenn ich nun, das Programm beenden will, warte ich mit WaitForsingleObject auf das Ende aller Threads.<br />
Doch das gibt Probleme, die Threads scheinen einfach aufzuhören zu arbeiten - nach 20sec geht es manchmal wieder weiter. Via BOOL Variable prüfe ich ob ein Shutdown kommt.</p>
<p>DIE LÖSUNG?</p>
<p>Wenn ich jedoch die RichEdit komponente leer lasse funktioniert alles wunderbar, alles wird perfekt beendet. sobald ich text in die Richedit komponente einfüge gibt es die Fehler.</p>
<p>Bin Ziemlich verwirrt. Kann ich irgendwie ein richedit controle freigeben?<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1284376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284376</guid><dc:creator><![CDATA[Freak33]]></dc:creator><pubDate>Mon, 14 May 2007 06:27:03 GMT</pubDate></item><item><title><![CDATA[Reply to RichEdit nach der Benutzung wieder freigeben? on Mon, 14 May 2007 07:50:51 GMT]]></title><description><![CDATA[<p>Eine Konsole mit Richedit-Feld? Oder meinst du eher einen Dialog? (zur Erklärung: Mit &quot;Konsole&quot; wird normalerweise ein DOS-Fenster bezeichnet - das hat keine RichEdits)</p>
<p>Ansonstens solltest du ganz einfach kontrollieren, wo genau der Thread sich aufgehängt hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1284401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284401</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 14 May 2007 07:50:51 GMT</pubDate></item><item><title><![CDATA[Reply to RichEdit nach der Benutzung wieder freigeben? on Mon, 14 May 2007 08:52:31 GMT]]></title><description><![CDATA[<p>Wer erzeugt die Rich Edit Controls?<br />
Windows sind Thread afin. Sendest Du eine Nachricht an ein Fenster in einem anderen Thread, dann muss dieser Thread eine Message Queue haben.</p>
<p>Es ist sicherlich kein Problem im Debugger Break All anzuklicken und zu sehen was die einzelnen Threads in dem kritischen Moment machen. (Doppelklick auf die jeweilgen Threads im Thread Window).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1284453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284453</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 14 May 2007 08:52:31 GMT</pubDate></item><item><title><![CDATA[Reply to RichEdit nach der Benutzung wieder freigeben? on Mon, 14 May 2007 09:36:41 GMT]]></title><description><![CDATA[<p>Hi, jep klar ist das ein Dialog mit einer Richedit kompo. <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>Also die Console Klassen werden im Main-Thread erstellt. Somit ist die Haut-Queue dafür verantwortlich - das klappt auch alles wunderbar und perfekt bis zum Shutdown.</p>
<p>&quot;Es ist sicherlich kein Problem im Debugger Break All anzuklicken und zu sehen was di&quot;</p>
<p>Öhm wir mach ich das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1284500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284500</guid><dc:creator><![CDATA[Freak33]]></dc:creator><pubDate>Mon, 14 May 2007 09:36:41 GMT</pubDate></item><item><title><![CDATA[Reply to RichEdit nach der Benutzung wieder freigeben? on Mon, 14 May 2007 09:40:17 GMT]]></title><description><![CDATA[<p>Freak33 schrieb:</p>
<blockquote>
<p>Also die Console Klassen werden im Main-Thread erstellt. Somit ist die Haut-Queue dafür verantwortlich - das klappt auch alles wunderbar und perfekt bis zum Shutdown.</p>
</blockquote>
<p>Dann ist auch der Haupt-Thread für die Ausgaben verantwortlich (alles andere bereitet Probleme). Aber um ein Sprichwort abzuwandeln - &quot;Ein Code sagt mehr als tausend Worte&quot; <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/1284504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284504</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 14 May 2007 09:40:17 GMT</pubDate></item><item><title><![CDATA[Reply to RichEdit nach der Benutzung wieder freigeben? on Mon, 14 May 2007 11:12:28 GMT]]></title><description><![CDATA[<p>Freak33 schrieb:</p>
<blockquote>
<p>&quot;Es ist sicherlich kein Problem im Debugger Break All anzuklicken und zu sehen was di&quot;</p>
<p>Öhm wir mach ich das?</p>
</blockquote>
<p>Debugger laufen lassen. Bis Problem aufttaucht. Dann gibt es in der Button-Leiste den Schalter Break-All. Anklicken. Debug-Thread Window öffnen und die Threads ansehen, was sie tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1284548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284548</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 14 May 2007 11:12:28 GMT</pubDate></item><item><title><![CDATA[Reply to RichEdit nach der Benutzung wieder freigeben? on Mon, 14 May 2007 13:48:11 GMT]]></title><description><![CDATA[<p>Ok, hab ich jetzt gemacht. Hier die laufenden Threads:</p>
<pre><code>&gt;	2948	__tmainCRTStartup	__tmainCRTStartup	Normal	1
 	436	Win32 Thread	        7c91eb94	        Highest	1
 	2900	Win32 Thread	        7c91eb94	        Normal	0
 	3212	CTable::Run	        7c91eb94	        Normal	1
 	4088	CTable::Run	        7c91eb94	        Normal	1
 	3084	CTable::Run	        7c91eb94 	        Normal	1
 	380				                        0
</code></pre>
<p>Und an folgender Stelle bleibt er hängen:</p>
<pre><code>void CTableManager::Release()
{
	for( int table=0; table &lt; m_aTables.size(); table++ )
	{
&gt;		m_aTables.at(table)-&gt;Stop();  // HIER
	}
}
</code></pre>
<p>Die Methode &quot;Stop&quot; schaue folgendermaßen aus:</p>
<pre><code>BOOL CTable::Stop()
{
	if( m_bInit )
	{
		m_bStop = TRUE;
		WaitForSingleObject( m_hRunThread, 10000 );
		CloseHandle( m_hRunThread );

		return TRUE;
	}
	return FALSE;
}
</code></pre>
<p>So, WaitForSingleObject() scheint wohl die Ursache zu sein. Wenn ich die Funktion entferne, werden alle Threads durch den Primär Thread zum Ende gezwungen.</p>
<p>Hier mal ein Ausschitt aus der CTable::Run</p>
<pre><code>DWORD WINAPI CTable::Run( LPVOID lpParam )
{

	// pointer
	CTable *pT = (CTable*)lpParam;

	// do some updates
	while( !pT-&gt;m_bStop )
	{
                // Wenn diese Zeile weg ist, klappt alles wunderbar
		pT-&gt;m_cConsole.AddLine( &quot;Update&quot; );

		Sleep(0);
	}

	OutputDebugString( &quot;\n Thread Finished&quot; );

	return 2;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1284679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284679</guid><dc:creator><![CDATA[Freak33]]></dc:creator><pubDate>Mon, 14 May 2007 13:48:11 GMT</pubDate></item><item><title><![CDATA[Reply to RichEdit nach der Benutzung wieder freigeben? on Mon, 14 May 2007 13:50:07 GMT]]></title><description><![CDATA[<p>Achja, die Funktion AddLine schaut folgendermaßen aus:</p>
<pre><code>void CConsole::AddLine( char *msg )
{
	if( m_hWnd != NULL )
	{
		int length = (int)SendMessage( m_hWndConsole, WM_GETTEXTLENGTH, 0, 0 );
		SendMessage( m_hWndConsole, EM_SETSEL, length, length );
		SendMessage( m_hWndConsole, EM_REPLACESEL, TRUE, (LPARAM)msg );
	}

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1284681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284681</guid><dc:creator><![CDATA[Freak33]]></dc:creator><pubDate>Mon, 14 May 2007 13:50:07 GMT</pubDate></item><item><title><![CDATA[Reply to RichEdit nach der Benutzung wieder freigeben? on Mon, 14 May 2007 15:15:53 GMT]]></title><description><![CDATA[<p>Ok, es gibt auf jedenfall eine Verbindung zwischen den RichEdit funktionen (egal was passiert Ob man texte einfügt ob nur die Länge des Textes abgefragt wird), wenn ich das in einem Thread aufrufe und parallel WaitForSingleObject aufrufe gibt es Probleme.</p>
<p>Wobei ich nicht glaube, dass das Problem bei WaitSingleObject liegt - Hier wird nur gewartet bis der Thread beendet wird (Was er nicht tut).</p>
<p>Es muss ein Problem sein, was mit Thread und einer RichEdit Komponente zu tun hat.</p>
<p>Jemand eine Idee?? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1284749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284749</guid><dc:creator><![CDATA[Freak33]]></dc:creator><pubDate>Mon, 14 May 2007 15:15:53 GMT</pubDate></item><item><title><![CDATA[Reply to RichEdit nach der Benutzung wieder freigeben? on Mon, 14 May 2007 15:36:46 GMT]]></title><description><![CDATA[<p><strong>Neue Theorie:</strong></p>
<p>Könnte es sein, dass durch WaitForSingleObject() Die RichEditKomponente keine Nachrichten mehr verarbeiten kann (da dadurch der Primär-Thread mit der Msg-Queue lahmgelegt ist)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1284760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284760</guid><dc:creator><![CDATA[Freak33]]></dc:creator><pubDate>Mon, 14 May 2007 15:36:46 GMT</pubDate></item><item><title><![CDATA[Reply to RichEdit nach der Benutzung wieder freigeben? on Mon, 14 May 2007 18:11:08 GMT]]></title><description><![CDATA[<p>Genau das passiert! Du wartest auf den Thread und nun können keine Nachrichten mehr empfangen werden. Verwende MsgWaitForMutipleObjects und lass die Message Loop weiter laufen.<br />
Es ist gar nicht gut, dass das RTF Control in einem anderen Thread liegt!<br />
Warum machst Du das überhaupt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1284873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284873</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 14 May 2007 18:11:08 GMT</pubDate></item><item><title><![CDATA[Reply to RichEdit nach der Benutzung wieder freigeben? on Mon, 14 May 2007 18:39:45 GMT]]></title><description><![CDATA[<p>Also ich hab das mal mit &quot;MsgWaitForMultipleObjects&quot; ausprobiert - war aber kein Erfolg.</p>
<pre><code>MsgWaitForMultipleObjects( 1, &amp;m_hRunThread, TRUE, INFINITE, QS_ALLINPUT );
CloseHandle( m_hRunThread );
</code></pre>
<p>Mit folgendem Code klappt alles wunderbar:</p>
<pre><code>while( m_bThreadRunning )
{
	CBaseApp::GetApp()-&gt;ProcessMessageQueue();
	Sleep(0);
}
</code></pre>
<p>Mit CBaseApp::ProcessMessageQueue</p>
<pre><code>void CBaseApp::ProcessMessageQueue()
{
	MSG msg;
	if( PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE) )
	{
		TranslateMessage(&amp;msg); 
		DispatchMessage(&amp;msg); 
	}
}
</code></pre>
<blockquote>
<p>Warum machst Du das überhaupt?</p>
</blockquote>
<p>Das ist automatisch so, da die Klasse CConsole im Primär-Thread erstellt wird und damit auch zu dieser Queue &quot;gehört&quot;!!<br />
Wie könnte man das denn anders regeln? -&gt; Somit hätte jeder Thread eine eig. Queue?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1284888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284888</guid><dc:creator><![CDATA[Freak33]]></dc:creator><pubDate>Mon, 14 May 2007 18:39:45 GMT</pubDate></item><item><title><![CDATA[Reply to RichEdit nach der Benutzung wieder freigeben? on Tue, 15 May 2007 06:09:58 GMT]]></title><description><![CDATA[<p>1. MsgWaitForMultipleObjects returniert auch, wenn eine Nachriht in der Message Queue drin ist! Dann muss also auch die Nachrichtenschleife laufen. Diese Funktion behandelt keine Nachrichten!</p>
<p>2. Ich verstehe immer noch nicht was CConsole ist! Das ist das RTF Control?</p>
<p>Wenn Du also Nachrichten aus den anderen Threads bekommst, dann musst Du auch bis zum letzten Moment auf Nachrichten reagieren.<br />
Also<br />
MsgWaitForMultipleObjects durchführen.<br />
Wenn eine Nachricht vorhanden ist, diese bearbeiten.<br />
Solange das weiter machen, bis alle Threads terminiert haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285044</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 15 May 2007 06:09:58 GMT</pubDate></item><item><title><![CDATA[Reply to RichEdit nach der Benutzung wieder freigeben? on Tue, 15 May 2007 10:23:32 GMT]]></title><description><![CDATA[<p>BTW:<br />
Dein Code:</p>
<pre><code class="language-cpp">int length = (int)SendMessage( m_hWndConsole, WM_GETTEXTLENGTH, 0, 0 ); 
     SendMessage( m_hWndConsole, EM_SETSEL, length, length ); 
     SendMessage( m_hWndConsole, EM_REPLACESEL, TRUE, (LPARAM)msg );
</code></pre>
<p>Ist nicht threadsicher. Was passiert wenn zwei Threads gleichzeitig hier die Nachrichten &quot;durcheinander&quot; senden. Also nachdem du WM_GETETXTLENGTH ausgeführt hast ein anderer Thread die Länge verändert.</p>
<p>Du solltest Dir einen anderen Mechanismus für die Nachrichten ausdenken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285256</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 15 May 2007 10:23:32 GMT</pubDate></item></channel></rss>