<?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[Probleme mit Threads]]></title><description><![CDATA[<p>Hallo,<br />
ich habe in fogendem Code versucht einen Thread zu erstellen.<br />
Ich habe versucht die ThreadFunktion in einer Klasse &quot;test&quot; zu deklarieren, damit ich in dem Thread auf member der Klasse zugreifen kann.<br />
(In diesem Beispiel hat die Klasse keine Member)</p>
<p>Das Problem ist, dass ich es nicht schaffe dem Thread eine Funktion als Threadfunktion zu geben, die in einer Klasse steht:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;time.h&gt;

#define MAX_THREADS 3 

//Version mit dynamischen Objekten und Zufallszahlen

class Point 
{ 

private: 
    CRITICAL_SECTION CriSect; 
    int m_x; 
    int m_y; 
public: 

    Point () { 
      InitializeCriticalSection(&amp;CriSect); 
    } 

	~Point () {
		DeleteCriticalSection(&amp;CriSect);
	}

   void setXY(int x,int y) 
   { 
      EnterCriticalSection(&amp;CriSect); 
            m_x = x; 
            m_y = y; 
      LeaveCriticalSection(&amp;CriSect) ; 

   } 
   void gibaus() { 
        EnterCriticalSection(&amp;CriSect); 
            printf(&quot;%d &quot;  ,(int)m_x  );    
            printf(&quot;%d \n&quot;,(int)m_y  ); 
        LeaveCriticalSection(&amp;CriSect) ; 
   } 

}; 

class test{								//In dieser Klasse steht die ThreadFunktion

public:
DWORD WINAPI ThreadFunc(LPVOID data)		
{
srand( (unsigned)time( NULL ) );
	for (int index=0; index&lt;50; index++) {
		((Point*)data)-&gt;setXY(rand() % 100,rand() % 100);	
		((Point*)data)-&gt;gibaus();
	} 
	return((DWORD)data);
	} 
};

void main(void)
{
	test t;

	srand( (unsigned)time( NULL ) );

	Point *p0 = new Point();	

	HANDLE hThread[MAX_THREADS];		
	DWORD  dwThreadID[MAX_THREADS];		

	printf(&quot;\nAlle Threads starten...\n&quot;);

for (int index=0; index&lt;MAX_THREADS; index++) { 

        hThread[index] = CreateThread(NULL,                        
                                                0,                            
												&amp;t.ThreadFunc,    //Und hier möchte ich die Funktion aufrufen und hier entsteht der Fehler           
                                                (LPVOID)p0,     
                                                0,                            
                                                &amp;dwThreadID[index]);    
    } 

	for (int index=0; index&lt;25; index++) {

		p0-&gt;setXY(rand() % 100,rand() % 100);
		p0-&gt;gibaus();

	} 

	WaitForMultipleObjects(	MAX_THREADS,
									hThread,			
									TRUE,			
									INFINITE);	

	delete(p0);
	Sleep(4000);

	for (int index=0; index&lt;MAX_THREADS; index++)
		CloseHandle(hThread[index]);

	printf(&quot;\nAlle Threads beendet.\n&quot;);

}
</code></pre>
<p>Als Fehler erhalte ich:<br />
error C2276: '&amp;': Ungültige Operation auf Ausdruck einer gebundenen Memberfunktion</p>
<p>Wie schaffe ich es eine Methode für den Thread zu verwenden, die in einer Klasse deklariert ist, damit ich auf die dortigen member zugreifen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/199412/probleme-mit-threads</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 21:58:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/199412.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 02 Dec 2007 20:02:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit Threads on Sun, 02 Dec 2007 20:02:37 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe in fogendem Code versucht einen Thread zu erstellen.<br />
Ich habe versucht die ThreadFunktion in einer Klasse &quot;test&quot; zu deklarieren, damit ich in dem Thread auf member der Klasse zugreifen kann.<br />
(In diesem Beispiel hat die Klasse keine Member)</p>
<p>Das Problem ist, dass ich es nicht schaffe dem Thread eine Funktion als Threadfunktion zu geben, die in einer Klasse steht:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;time.h&gt;

#define MAX_THREADS 3 

//Version mit dynamischen Objekten und Zufallszahlen

class Point 
{ 

private: 
    CRITICAL_SECTION CriSect; 
    int m_x; 
    int m_y; 
public: 

    Point () { 
      InitializeCriticalSection(&amp;CriSect); 
    } 

	~Point () {
		DeleteCriticalSection(&amp;CriSect);
	}

   void setXY(int x,int y) 
   { 
      EnterCriticalSection(&amp;CriSect); 
            m_x = x; 
            m_y = y; 
      LeaveCriticalSection(&amp;CriSect) ; 

   } 
   void gibaus() { 
        EnterCriticalSection(&amp;CriSect); 
            printf(&quot;%d &quot;  ,(int)m_x  );    
            printf(&quot;%d \n&quot;,(int)m_y  ); 
        LeaveCriticalSection(&amp;CriSect) ; 
   } 

}; 

class test{								//In dieser Klasse steht die ThreadFunktion

public:
DWORD WINAPI ThreadFunc(LPVOID data)		
{
srand( (unsigned)time( NULL ) );
	for (int index=0; index&lt;50; index++) {
		((Point*)data)-&gt;setXY(rand() % 100,rand() % 100);	
		((Point*)data)-&gt;gibaus();
	} 
	return((DWORD)data);
	} 
};

void main(void)
{
	test t;

	srand( (unsigned)time( NULL ) );

	Point *p0 = new Point();	

	HANDLE hThread[MAX_THREADS];		
	DWORD  dwThreadID[MAX_THREADS];		

	printf(&quot;\nAlle Threads starten...\n&quot;);

for (int index=0; index&lt;MAX_THREADS; index++) { 

        hThread[index] = CreateThread(NULL,                        
                                                0,                            
												&amp;t.ThreadFunc,    //Und hier möchte ich die Funktion aufrufen und hier entsteht der Fehler           
                                                (LPVOID)p0,     
                                                0,                            
                                                &amp;dwThreadID[index]);    
    } 

	for (int index=0; index&lt;25; index++) {

		p0-&gt;setXY(rand() % 100,rand() % 100);
		p0-&gt;gibaus();

	} 

	WaitForMultipleObjects(	MAX_THREADS,
									hThread,			
									TRUE,			
									INFINITE);	

	delete(p0);
	Sleep(4000);

	for (int index=0; index&lt;MAX_THREADS; index++)
		CloseHandle(hThread[index]);

	printf(&quot;\nAlle Threads beendet.\n&quot;);

}
</code></pre>
<p>Als Fehler erhalte ich:<br />
error C2276: '&amp;': Ungültige Operation auf Ausdruck einer gebundenen Memberfunktion</p>
<p>Wie schaffe ich es eine Methode für den Thread zu verwenden, die in einer Klasse deklariert ist, damit ich auf die dortigen member zugreifen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1413956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1413956</guid><dc:creator><![CDATA[MisterX]]></dc:creator><pubDate>Sun, 02 Dec 2007 20:02:37 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Threads on Mon, 03 Dec 2007 09:09:42 GMT]]></title><description><![CDATA[<p>Funktionen und Methoden sind nicht zuweisungskompatibel. Methoden besitzen immer noch einen unsichtbaren this-Parameter, der ein Zeiger auf die Klasse darstellt. Das gleiche Problem hat man auch in Delphi. Da gibt es allerdinsge inen Trick: <a href="http://www.michael-puff.de/Artikel/2007/2007_08_02_CallbackMethod.php" rel="nofollow">Windows-API Callback-Funktion als Methode einer Klasse</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414075</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Mon, 03 Dec 2007 09:09:42 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Threads on Tue, 04 Dec 2007 00:21:57 GMT]]></title><description><![CDATA[<p>Normalerweise verwendet man eine &quot;trampoline-function&quot;. Sieht ca. so aus:</p>
<pre><code class="language-cpp">class foo
{
public:
    UINT thread_function()
    {
        m_x = 0;
        delete this;
    }

private:
    int m_x;
    // ...
};

UINT __stdcall trampoline_function(void* p) // &lt;- dashier kannst du jetzt mit _beginthreadex verwenden
{
    return static_cast&lt;foo*&gt;(p)-&gt;thread_function();
}
</code></pre>
<p>Wenn du mehr als nur den &quot;this&quot; Zeiger übergeben willst musst du etwas tricksen. z.B. eine Struktur mit new anlegen wo der this Zeiger drinnen ist plus zusätzliche Parameter. Natürlich musst du dann auch die trampoline_function entsprechend umschreiben. Und irgendwer muss die Struktur auch wieder freigeben - das kann dann z.B. auch die trampoline_function erledigen. Oder du entwirfst deine Klasse einfach so dass keine zusätzlichen Parameter übergeben werden müssen - evtl. kann man die nötigen Werte ja als Member ablegen bevor der Thread gestartet wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414530</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 04 Dec 2007 00:21:57 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Threads on Thu, 06 Dec 2007 22:16:53 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>hier auf dieser Wikipedia Seite ist GENAU die Lösung zu deinem Problem.<br />
(etwas weiter unten, bei dem Kapitel mit dem Titel &quot;Windows&quot;)</p>
<p><a href="http://de.wikipedia.org/wiki/Thread_%28Informatik%29" rel="nofollow">http://de.wikipedia.org/wiki/Thread_(Informatik)</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1416206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1416206</guid><dc:creator><![CDATA[Andreas XXL]]></dc:creator><pubDate>Thu, 06 Dec 2007 22:16:53 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Threads on Fri, 07 Dec 2007 10:47:58 GMT]]></title><description><![CDATA[<p>Danke, genau was ich gesucht habe!!!!! <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>
<p>(Komisch, ich währe überhaupt nicht auf die Idee gekommen Code Beispiele in Wikipedia zu suchen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1416395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1416395</guid><dc:creator><![CDATA[MisterX]]></dc:creator><pubDate>Fri, 07 Dec 2007 10:47:58 GMT</pubDate></item></channel></rss>