<?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[Problem mit Methode einer Klasse als Threadfunktion]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte in einem Thread die Methode einer Klasse aufrufen. Dazu habe ich in der Klasse extra einen Wrapper deklariert, der dann meine gewünschte Funktion aufruft. Wenn ich in dieser Funktion aber auf Members der Klasse zugreife, kommt es immer zum Programmabsturz. Wenn ich das Programm debugge und in der Funktion Run (also Zeile 20 lande), dann steht im Debug-Fenster für die Variable m_iVal &quot;CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden&quot;.<br />
Könnte mir bitte jemand erklären, woran das liegt und was ich machen muss, um das Problem zu beseitigen? Im Anhang ein Beispielprogramm, wo soeben genanntest Problem auftritt:</p>
<pre><code class="language-cpp">HANDLE hMutex;

class cClass
{
public:
	cClass::cClass() : m_iVal(0)
	{}
  static void ThreadRun(LPVOID who)
  {
    static_cast&lt;cClass*&gt;(who)-&gt;Run();
  }
	void Run  (); 

private:
	int m_iVal;
};

void cClass::Run  ()
{
	if(!m_iVal) // Diese Zeile hier scheint zum Absturz zu führen!
	{
		for (int i=0;i&lt;75;i++)
		{
			std::cout &lt;&lt; i &lt;&lt; &quot; Run&quot; &lt;&lt; std::endl;
		}
	}
} 

int main()
{
	cClass	cTest;
	HANDLE	hThrds[1];
	DWORD		aThreadID[1];

	hMutex = CreateMutex(NULL,FALSE,NULL);
	hThrds[0] = (HANDLE) _beginthreadex(0,0,
	(unsigned (_stdcall *)(void *)) cTest.ThreadRun,
	NULL,0,  (unsigned *) &amp;aThreadID[0]);

	WaitForMultipleObjects(1, hThrds, TRUE, INFINITE);

  CloseHandle(hThrds[0]);
	return(0);
}
</code></pre>
<p>Vielen Dank!<br />
V.K.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/215810/problem-mit-methode-einer-klasse-als-threadfunktion</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 21:20:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/215810.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 15 Jun 2008 20:27:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Methode einer Klasse als Threadfunktion on Sun, 15 Jun 2008 20:27:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte in einem Thread die Methode einer Klasse aufrufen. Dazu habe ich in der Klasse extra einen Wrapper deklariert, der dann meine gewünschte Funktion aufruft. Wenn ich in dieser Funktion aber auf Members der Klasse zugreife, kommt es immer zum Programmabsturz. Wenn ich das Programm debugge und in der Funktion Run (also Zeile 20 lande), dann steht im Debug-Fenster für die Variable m_iVal &quot;CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden&quot;.<br />
Könnte mir bitte jemand erklären, woran das liegt und was ich machen muss, um das Problem zu beseitigen? Im Anhang ein Beispielprogramm, wo soeben genanntest Problem auftritt:</p>
<pre><code class="language-cpp">HANDLE hMutex;

class cClass
{
public:
	cClass::cClass() : m_iVal(0)
	{}
  static void ThreadRun(LPVOID who)
  {
    static_cast&lt;cClass*&gt;(who)-&gt;Run();
  }
	void Run  (); 

private:
	int m_iVal;
};

void cClass::Run  ()
{
	if(!m_iVal) // Diese Zeile hier scheint zum Absturz zu führen!
	{
		for (int i=0;i&lt;75;i++)
		{
			std::cout &lt;&lt; i &lt;&lt; &quot; Run&quot; &lt;&lt; std::endl;
		}
	}
} 

int main()
{
	cClass	cTest;
	HANDLE	hThrds[1];
	DWORD		aThreadID[1];

	hMutex = CreateMutex(NULL,FALSE,NULL);
	hThrds[0] = (HANDLE) _beginthreadex(0,0,
	(unsigned (_stdcall *)(void *)) cTest.ThreadRun,
	NULL,0,  (unsigned *) &amp;aThreadID[0]);

	WaitForMultipleObjects(1, hThrds, TRUE, INFINITE);

  CloseHandle(hThrds[0]);
	return(0);
}
</code></pre>
<p>Vielen Dank!<br />
V.K.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1529728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1529728</guid><dc:creator><![CDATA[VerbalKint]]></dc:creator><pubDate>Sun, 15 Jun 2008 20:27:30 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Methode einer Klasse als Threadfunktion on Sun, 15 Jun 2008 22:23:37 GMT]]></title><description><![CDATA[<p>vlt solltest du statt NULL &amp;cTest uebergeben? <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>(unsigned (_stdcall *)(void *)) cTest.ThreadRun &lt;-- damit schiesst du dir auch garantiert in den fuss,wenn du an der stelle casten musst hast du ehr in der deklaration was falsch gemacht.</p>
<p>ueberhaupt klappt es nicht da ne statische methode zu nehmen,das sollte so aussehen:</p>
<pre><code class="language-cpp">namespace {
  extern &quot;C&quot; unsigned Class_Run(void* p) {
    static_cast&lt;cClass*&gt;(p)-&gt;Run();
    return 0;
  }
}
</code></pre>
<p>dann kannst du &amp;Class_Run,&amp;cTest an der geeigneten stelle uebergeben. mindestens comeau frisst das sonst nicht.</p>
<p>PS: ungarische notation war (vor)gestern...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1529811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1529811</guid><dc:creator><![CDATA[t001]]></dc:creator><pubDate>Sun, 15 Jun 2008 22:23:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Methode einer Klasse als Threadfunktion on Mon, 16 Jun 2008 05:00:10 GMT]]></title><description><![CDATA[<p>Hi t001,</p>
<p>vielen Dank für deine Hilfe. Ich habe jetzt dein Vorschlag wie folgt umgesetzt, so dass es zu keinen Abstürzen mehr kommt:</p>
<pre><code class="language-cpp">HANDLE hMutex;

class cClass
{
public:
	cClass::cClass() : m_iVal(0)
	{}
	void Run  (); 

private:
	int m_iVal;
};

namespace 
{
	extern &quot;C&quot; unsigned Class_Run(void* p) 
	{
		static_cast &lt;cClass*&gt; (p)-&gt;Run();
		return 0;
	}
}

void cClass::Run  ()
{
	if(!m_iVal)
	{
		for (int i=0;i&lt;75;i++)
		{
			std::cout &lt;&lt; i &lt;&lt; &quot; Run&quot; &lt;&lt; std::endl;
		}
	}
} 

int main()
{
	cClass	cTest;
	HANDLE	hThrds[1];
	DWORD		aThreadID[1];

	hMutex = CreateMutex(NULL,FALSE,NULL);
	hThrds[0] = (HANDLE) _beginthreadex(0,0,
	(unsigned (_stdcall *)(void *)) &amp;Class_Run,&amp;cTest,0,(unsigned *) &amp;aThreadID[0]);

	WaitForMultipleObjects(1, hThrds, TRUE, INFINITE);

  CloseHandle(hThrds[0]);
	return(0);
}
</code></pre>
<p>Dazu hätte ich aber noch ein paar Fragen.<br />
1.) Das casten bei _beginthreadex wie folgt &quot;(unsigned (_stdcall *)(void *)) &amp;Class_Run&quot; konnte ich nicht anders umsetzen. Ich habe es probiert an anderer Stelle unterzubringen, aber leider hat der Compiler das nicht mitgemacht.<br />
2.) Habe ich es richtig verstanden, dass das namespace außerhalb der Klasse aufgeführt werden muß?<br />
3.) Kann man das ganz noch eleganter machen, in dem man z.B. eine Thread-Klasse definiert und die Klasse cClass dann von dieser ableitet und die run-Funktion dann virtual deklariert? Sowas habe ich auch schonmal irgendwo gesehen.<br />
4.) Wieso benutzt man keine ungarische Notation mehr? Was gibt es da Neueres?</p>
<p>Vielen Dank!!<br />
V.K.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1529844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1529844</guid><dc:creator><![CDATA[VerbalKint]]></dc:creator><pubDate>Mon, 16 Jun 2008 05:00:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Methode einer Klasse als Threadfunktion on Mon, 16 Jun 2008 06:13:21 GMT]]></title><description><![CDATA[<p>schau dir mal das ActiveObject Pattern an.. das ist genau das was du suchst;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1529878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1529878</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Mon, 16 Jun 2008 06:13:21 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Methode einer Klasse als Threadfunktion on Mon, 16 Jun 2008 08:04:06 GMT]]></title><description><![CDATA[<p>VerbalKint schrieb:</p>
<blockquote>
<p>4.) Wieso benutzt man keine ungarische Notation mehr? Was gibt es da Neueres?</p>
</blockquote>
<p>Jein. UN ist durchaus in den ein oder anderen Projekt noch in Verwendung, aber am aussterben. Statt dessen verwendet man sinnvolle IDEs die den Typ eh anzeigen, sprechende Bezeichner...</p>
<p>Kurze Gründe gegen UN:<br />
a) Weitere Sprache zu lernen (und Lesbarkeit leidet)<br />
b) In jeder Sprache in der man eigene Typen definieren kann nimmt es überhand<br />
c) Spätestens mit Templates ist eh die UN unmöglich einzusetzen</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1529921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1529921</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 16 Jun 2008 08:04:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Methode einer Klasse als Threadfunktion on Mon, 16 Jun 2008 23:13:01 GMT]]></title><description><![CDATA[<p>VerbalKint schrieb:</p>
<blockquote>
<p>1.) Das casten bei _beginthreadex wie folgt &quot;(unsigned (_stdcall *)(void *)) &amp;Class_Run&quot; konnte ich nicht anders umsetzen. Ich habe es probiert an anderer Stelle unterzubringen, aber leider hat der Compiler das nicht mitgemacht.</p>
</blockquote>
<p>Der cast sollte gar nicht mehr noetig sein,was passiert denn,wenn du ihn in der letzten version einfach rausnimmst, &amp;Class_Run sollte den richtigen typ haben.</p>
<blockquote>
<p>2.) Habe ich es richtig verstanden, dass das namespace außerhalb der Klasse aufgeführt werden muß?</p>
</blockquote>
<p>joah, das sagt in dem fall das die elemente darin nicht aus der datei exportiert werden, weils nur hilfsfunktionen sind.</p>
<blockquote>
<p>3.) Kann man das ganz noch eleganter machen, in dem man z.B. eine Thread-Klasse definiert und die Klasse cClass dann von dieser ableitet und die run-Funktion dann virtual deklariert? Sowas habe ich auch schonmal irgendwo gesehen.</p>
</blockquote>
<p>Klar kann man das,hast du ja schon fast gemacht. der unterbau zur C API wird allerdings nie huebscher. vlt willst du auch boost.threads verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1530479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1530479</guid><dc:creator><![CDATA[t001]]></dc:creator><pubDate>Mon, 16 Jun 2008 23:13:01 GMT</pubDate></item></channel></rss>