<?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[Thread in Methode einer Klasse starten Problem]]></title><description><![CDATA[<p>Hallo, ich möchte in der Methode einer Klasse &quot;Server&quot; einen Thread starten und habe das folgendermaßen versucht<br />
(Also ich habe was Threads angeht leider sehr wenig Ahnung)</p>
<p>Server.h:</p>
<pre><code class="language-cpp">#include &lt;winsock2.h&gt;
#include &lt;queue&gt; 
using namespace std; 

#ifndef Server__ 
#define Server__ 
class Server {

public:

	queue&lt;int&gt; *q;

	Server();

	void beginne_empfang();

	DWORD WINAPI ThreadFuncServer(LPVOID data);

 };

#endif
</code></pre>
<p>Server.cpp:</p>
<pre><code class="language-cpp">#include &quot;server.h&quot;

DWORD WINAPI Server::ThreadFuncServer(LPVOID data){

//hier das Empfangen implementieren...

		return((DWORD)data);
}

	Server::Server(){q = new queue();}

	void Server::beginne_empfang()
	{
			hThread[1] = CreateThread(NULL,                        
			0,                            
			ThreadFuncServer,    //Hier liegt das Problem            
			(LPVOID)q,           
			0,                            
			&amp;dwThreadID[1]);

	}
</code></pre>
<p>Das Problem ist nun ,dass die Methode ThreadFuncServer für den Thread unbekannt ist.</p>
<p>Als Fehlermeldung erhalte ich</p>
<blockquote>
<p>Server::ThreadFuncServer&quot;: Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie &quot;&amp;Server::ThreadFuncServer&quot;, um einen Zeiger auf den Member zu erstellen.</p>
</blockquote>
<p>Ändere ich nun den code in</p>
<pre><code class="language-cpp">void Server::beginne_empfang()
	{
			hThread[1] = CreateThread(NULL,                        
			0,                            
			&amp;Server::ThreadFuncServer,    //Hier liegt das Problem            
			(LPVOID)q,           
			0,                            
			&amp;dwThreadID[1]);
			//hier noch weiterschreiben

	}
</code></pre>
<p>Dann erhalte ich die Fehlermeldung</p>
<blockquote>
<p>'CreateThread': Konvertierung des Parameters 3 von 'DWORD (__stdcall Server::* )(LPVOID)' in 'LPTHREAD_START_ROUTINE' nicht möglich<br />
Es gibt keinen Kontext, in dem diese Konvertierung möglich ist</p>
</blockquote>
<p>Was muß ich schreiben, damit es funktioniert?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/160005/thread-in-methode-einer-klasse-starten-problem</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Jul 2026 04:35:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/160005.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 20 Sep 2006 21:05:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Thread in Methode einer Klasse starten Problem on Wed, 20 Sep 2006 21:05:56 GMT]]></title><description><![CDATA[<p>Hallo, ich möchte in der Methode einer Klasse &quot;Server&quot; einen Thread starten und habe das folgendermaßen versucht<br />
(Also ich habe was Threads angeht leider sehr wenig Ahnung)</p>
<p>Server.h:</p>
<pre><code class="language-cpp">#include &lt;winsock2.h&gt;
#include &lt;queue&gt; 
using namespace std; 

#ifndef Server__ 
#define Server__ 
class Server {

public:

	queue&lt;int&gt; *q;

	Server();

	void beginne_empfang();

	DWORD WINAPI ThreadFuncServer(LPVOID data);

 };

#endif
</code></pre>
<p>Server.cpp:</p>
<pre><code class="language-cpp">#include &quot;server.h&quot;

DWORD WINAPI Server::ThreadFuncServer(LPVOID data){

//hier das Empfangen implementieren...

		return((DWORD)data);
}

	Server::Server(){q = new queue();}

	void Server::beginne_empfang()
	{
			hThread[1] = CreateThread(NULL,                        
			0,                            
			ThreadFuncServer,    //Hier liegt das Problem            
			(LPVOID)q,           
			0,                            
			&amp;dwThreadID[1]);

	}
</code></pre>
<p>Das Problem ist nun ,dass die Methode ThreadFuncServer für den Thread unbekannt ist.</p>
<p>Als Fehlermeldung erhalte ich</p>
<blockquote>
<p>Server::ThreadFuncServer&quot;: Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie &quot;&amp;Server::ThreadFuncServer&quot;, um einen Zeiger auf den Member zu erstellen.</p>
</blockquote>
<p>Ändere ich nun den code in</p>
<pre><code class="language-cpp">void Server::beginne_empfang()
	{
			hThread[1] = CreateThread(NULL,                        
			0,                            
			&amp;Server::ThreadFuncServer,    //Hier liegt das Problem            
			(LPVOID)q,           
			0,                            
			&amp;dwThreadID[1]);
			//hier noch weiterschreiben

	}
</code></pre>
<p>Dann erhalte ich die Fehlermeldung</p>
<blockquote>
<p>'CreateThread': Konvertierung des Parameters 3 von 'DWORD (__stdcall Server::* )(LPVOID)' in 'LPTHREAD_START_ROUTINE' nicht möglich<br />
Es gibt keinen Kontext, in dem diese Konvertierung möglich ist</p>
</blockquote>
<p>Was muß ich schreiben, damit es funktioniert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1141472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1141472</guid><dc:creator><![CDATA[Andreas XXL]]></dc:creator><pubDate>Wed, 20 Sep 2006 21:05:56 GMT</pubDate></item><item><title><![CDATA[Reply to Thread in Methode einer Klasse starten Problem on Thu, 21 Sep 2006 00:02:40 GMT]]></title><description><![CDATA[<p>Du kannst nicht so einfach einen Pointer auf einen Member übergeben, wenn nur ein normaler Pointer verlangt ist als Argument.<br />
Du kannst aber die Funktion ThreadFuncServer statisch machen, dann bei createThread this als parameter für die Funktion ThreadFuncServer angeben und in der Funktion ThreadFuncServer &quot;data&quot; nach &quot;Server*&quot; reinterpret_cast'en.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1141509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1141509</guid><dc:creator><![CDATA[bluecode]]></dc:creator><pubDate>Thu, 21 Sep 2006 00:02:40 GMT</pubDate></item><item><title><![CDATA[Reply to Thread in Methode einer Klasse starten Problem on Thu, 21 Sep 2006 08:27:04 GMT]]></title><description><![CDATA[<p>Hallo Andreas,</p>
<p>am einfachsten ist es meines Erachtens die <a href="http://www.boost.org/doc/html/threads.html" rel="nofollow">boost-thread-Library</a> zu benutzen. In Deinem Fall sähe das so aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/thread/thread.hpp&gt;
#include &lt;boost/bind.hpp&gt;

class A
{
public:
    A( int param1, int param2 )
        : m_myInt( param1 ) // eigene Member in der Initialisierungsliste vorbelegen
        , m_thrd( boost::bind( &amp;A::Run, this, param2 ) )
    {}
    ~A()
    {
        // teile ggf. der Schleife in Run mit, dass jetzt Schluss ist
        m_thrd.join(); // blockiert, solange Thread noch läuft
    }
private:
    void Run( int parameter )
    {
        using namespace std;
        cout &lt;&lt; &quot;Thread gestartet &quot; &lt;&lt; endl;
        for(;;)
        {
            // ... if( Schluss ) break;
        }
    }

    int m_myInt;
    boost::thread m_thrd; // Achtung MUSS letzter Member sein
};
</code></pre>
<p>wichtig zu wissen: der Thread startet, sobald Du ein Objekt der Klasse A anlegst. Du kannst dem Thread lokale Parameter mitgeben (s.o. param2). Falls Run und andere Methoden auf Member von A zugreifen (s.o. m_myInt) muss Du den Zugriff mit einem Mutex schützen.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1141619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1141619</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 21 Sep 2006 08:27:04 GMT</pubDate></item></channel></rss>