<?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[Threading problem...]]></title><description><![CDATA[<p>Hi,</p>
<p>wie ich das jetzt mitbekommen habe, darf ich kein MFC Fenster-Objekt einfach an einen Thread weitergeben, sondern nur das Fensterhandle aus dem sich der Thread dann wieder ein MFC Objekt erstellen kann. Jetzt habe ich allerdings das Problem, das ich ein abgeleitetes MFC Fensterobjekt habe, bei dem neue Eigenschaften direkt an dem Fensterobjekt und nicht an dem Fenster selbst gespeichert werden.... und nun?</p>
<p>Vielen dank schonmal im voraus für jede Hilfe<br />
template</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/160139/threading-problem</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Jul 2026 10:15:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/160139.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 Sep 2006 11:16:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Threading problem... on Fri, 22 Sep 2006 11:16:12 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wie ich das jetzt mitbekommen habe, darf ich kein MFC Fenster-Objekt einfach an einen Thread weitergeben, sondern nur das Fensterhandle aus dem sich der Thread dann wieder ein MFC Objekt erstellen kann. Jetzt habe ich allerdings das Problem, das ich ein abgeleitetes MFC Fensterobjekt habe, bei dem neue Eigenschaften direkt an dem Fensterobjekt und nicht an dem Fenster selbst gespeichert werden.... und nun?</p>
<p>Vielen dank schonmal im voraus für jede Hilfe<br />
template</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1142452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1142452</guid><dc:creator><![CDATA[template]]></dc:creator><pubDate>Fri, 22 Sep 2006 11:16:12 GMT</pubDate></item><item><title><![CDATA[Reply to Threading problem... on Fri, 22 Sep 2006 11:27:14 GMT]]></title><description><![CDATA[<p>Was genau brauchst Du in Deinem Thread? Ein Fenster oder bestimmte Elemente, die Du in Deiner abgeleiteten Fenster-Klasse hast?<br />
Falls Du wirklich beides brauchen solltest, dann kannst Du z.B. eine Struktur anlegen, in der Du das Handle des Fensters und zusätzliche Infos ablegen kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1142459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1142459</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Fri, 22 Sep 2006 11:27:14 GMT</pubDate></item><item><title><![CDATA[Reply to Threading problem... on Fri, 22 Sep 2006 11:36:32 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>vielen dank für die schnelle Antwort. Ich brauche leider beides, weil eigenschaften die das verhalten meines abgeleiteten MFC Objektes beieenflussen am MFC Objekt und nicht am Fenster festgehalten sind. Das Problem ist das ich die werte auch nicht einfach by value zum Thread kopieren kann, da diese sich ja während der Laufzeit des Threads ändern können.</p>
<p>Bsp:</p>
<pre><code class="language-cpp">class CNeuerButton : public CButton
{
public:
  SetImages(HBITMAP hPushed, HBITMAP hNonPushed);
  /* Überschriebene Routine */
  OnDraw(....);

private:
  HBITMAP m_hPushedImage;
  HBITMAP m_hNonPushedImage;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1142465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1142465</guid><dc:creator><![CDATA[template]]></dc:creator><pubDate>Fri, 22 Sep 2006 11:36:32 GMT</pubDate></item><item><title><![CDATA[Reply to Threading problem... on Sun, 24 Sep 2006 16:57:35 GMT]]></title><description><![CDATA[<blockquote>
<p>wie ich das jetzt mitbekommen habe, darf ich kein MFC Fenster-Objekt einfach an einen Thread weitergeben, sondern nur das Fensterhandle aus dem sich der Thread kann wieder ein MFC Objekt erstellen kann.</p>
</blockquote>
<p>Warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1143528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1143528</guid><dc:creator><![CDATA[Turing]]></dc:creator><pubDate>Sun, 24 Sep 2006 16:57:35 GMT</pubDate></item><item><title><![CDATA[Reply to Threading problem... on Sun, 24 Sep 2006 19:06:37 GMT]]></title><description><![CDATA[<p>Ein Worker-Thread sollte nie auf GUI-Controls zugreifen. Sieht mir nach einem Designproblem bei Dir aus.</p>
<p>Wenn der Thread Daten aus GUI-Controls lesen muss, dann führt der Weg über eine eigene Datenstruktur (ein struct oder eine Klasse), die sich beide Threads teilen(zu schützen mit CriticalSections). Die Membervar's Deines Buttons, die sich beide Threads teilen, sollten in eine solche Datenstruktur verschoben werden.</p>
<p>Wenn der Thread GUI-Controls verändern muss, dann ist der beste Weg eine eigene Message zu definieren, die der Thread an den GUI-Thread mittels PostMessage sendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1143606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1143606</guid><dc:creator><![CDATA[NickHappy]]></dc:creator><pubDate>Sun, 24 Sep 2006 19:06:37 GMT</pubDate></item><item><title><![CDATA[Reply to Threading problem... on Mon, 25 Sep 2006 09:18:00 GMT]]></title><description><![CDATA[<p>da kann ich nickhappy zustimmen,</p>
<p>Du Musst in deinem Thread mit PostThreadMessage eine Nachricht an den Dlg senden. Dazu musst du im Dlg noch dir die WindowProc Funktion zulegen und im App dafür sorgen das die Messages aus deinem Thread auch zum WindowProc kommen.</p>
<p>Wenn du Speicher im WorkerThread allozierst und Pointer an den Dlg gibts und er sie dann auch wieder löschen sollte musst du aufpassen das der Dlg nicht grad blockt (zB MessageBox) dann würde die Message allerdings nicht ankommen und Memory Leak angeben.</p>
<p>APP:</p>
<pre><code class="language-cpp">BOOL  CmyApp::PreTranslateMessage(MSG* pMsg)
	{
		// Is it the Message you want?
		// You can use a switch statement but because this is
		// only looking for one message, you can use the if/else
		if (pMsg-&gt;message == ID_LASTCONTROL +1) // da dir was definieren &lt;--
		{
			// Call the function to handle this message
			this-&gt;m_pMainWnd-&gt;SendMessage(pMsg-&gt;message, pMsg-&gt;wParam, pMsg-&gt;lParam);
			// Tell MFC no more processing is needed
			return TRUE;
		}
		else
			// Call MFC to have it continue processing the message
			return CWinThread::PreTranslateMessage(pMsg);
	}
</code></pre>
<p>DLG:</p>
<pre><code class="language-cpp">LRESULT CmyDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	if(message == ID_LASTCONTROL + 1) {
		switch (wParam) {
			case UPDATE_XXX:
				if(lParam != NULL) {
					GetDescendantWindow(IDC_METADATA)-&gt;SetWindowText((TCHAR*)lParam);
					delete [] (TCHAR*)lParam;
				}
				break;
			case UPDATE_METABUFFER:
				if(lParam != NULL) {
					GetDescendantWindow(IDC_METADATABUFFER)-&gt;SetWindowText((TCHAR*)lParam);
					delete [] (TCHAR*)lParam;
				}
				break;
			case UPDATE_BUFFERPER:
				((CProgressCtrl*)GetDescendantWindow(IDC_PROGRESS1))-&gt;SetRange(0, 100);
				((CProgressCtrl*)GetDescendantWindow(IDC_PROGRESS1))-&gt;SetPos((unsigned) lParam);

				break;
		}
		return TRUE;
	} else {
		return CDialog::WindowProc(message, wParam, lParam);
	}
}
</code></pre>
<p>Thread:</p>
<pre><code class="language-cpp">unsigned WINAPI	CmyThread::dowork(void* mythread) {
	CmyThread* thisthread = (CmyThread*)mythread;

	WPARAM paramw = MAKEWPARAM(0,0);
	LPARAM paraml = MAKELPARAM(0,0);

	while(!thisthread-&gt;doexit()) {
		{
                  // Weiterer Thread von mir für Datenhaltung
			CAuLck lock(thisthread-&gt;sthreadlock);
			CSocketThread* thissocket = (*thisthread-&gt;sthread);

			if(thissocket != NULL) {
				BOOL success = FALSE;
				// Radio
				TCHAR *rname = NULL, *rgenre = NULL;
				if(thissocket-&gt;GetServerInfo(&amp;rgenre, &amp;rname)) {
					if(rname != NULL) {
						success = PostThreadMessage(thisthread-&gt;uithreadid, thisthread-&gt;msgstart+1, (WPARAM)UPDATE_NAME, (LPARAM) rname);
						if(!success)
							delete [] rname;
					}

					if(rgenre != NULL) {
						success = PostThreadMessage(thisthread-&gt;uithreadid, thisthread-&gt;msgstart+1, (WPARAM)UPDATE_GENRE, (LPARAM) rgenre);
						if(!success)
							delete [] rgenre;
					}
				} else {
					if(rgenre != NULL)
						delete [] rgenre;
					if(rname != NULL)
						delete [] rname;
				}

				// Metadaten
				TCHAR *mtitle = NULL;
				if(thissocket-&gt;GetMetaData(&amp;mtitle)) {
					if(mtitle != NULL) {
						success = PostThreadMessage(thisthread-&gt;uithreadid, thisthread-&gt;msgstart+1, (WPARAM)UPDATE_META, (LPARAM) mtitle);
						if(!success)
							delete [] mtitle;
					}
				} else {
					if(mtitle != NULL)
						delete [] mtitle;
				}

				// buffer
				unsigned per = 0;
				if(thissocket-&gt;GetBufferPerce(per)) {
					PostThreadMessage(thisthread-&gt;uithreadid, thisthread-&gt;msgstart+1, (WPARAM)UPDATE_BUFFERPER,	(LPARAM) per);
				}

			}
		}
		Sleep(250);
	}
	return 0;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1143852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1143852</guid><dc:creator><![CDATA[DaRpH]]></dc:creator><pubDate>Mon, 25 Sep 2006 09:18:00 GMT</pubDate></item></channel></rss>