<?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 posix-thread]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem bei der Thread-Programmierung.<br />
Und zwar möchte ich pthread_create(..) innerhalb einer Klasse aufrufen.<br />
Das funktioniert irgendwie nicht richtig, obwohl die gleiche Art der Anwendung in einer C-Bibliothek problemlos läuft (natürlich ohne Klasse).</p>
<p>Gibt es da bekannte generelle Probleme ?</p>
<p>Der Funktionsaufruf innerhalb der Klasse sieht so aus :</p>
<p>void CDisplay::StartThread(void)<br />
{<br />
if(!bThreadStart)<br />
{<br />
pthread_create(&amp;ThreadID, NULL, &amp;ThreadFunction, NULL);<br />
}<br />
}</p>
<p>An Parameter 3 meckert der Compiler ständig rum, auch wenn ich dort z. B.<br />
einen Cast mache wie z. Bsp. &quot;(void*)ThreadFunction&quot;.</p>
<p>Der Prototyp von &quot;ThreadFunction&quot; ist &quot;void* ThreadFunction(void)&quot;.</p>
<p>Was mache ich verkehrt ?<br />
Wie gesagt, der Aufruf und die Kreierung sollen in einer Klasse bzw. in deren Memberfunktionen ablaufen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Danke für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/232745/probleme-mit-posix-thread</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 04:53:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/232745.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 26 Jan 2009 17:49:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit posix-thread on Mon, 26 Jan 2009 17:49:12 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem bei der Thread-Programmierung.<br />
Und zwar möchte ich pthread_create(..) innerhalb einer Klasse aufrufen.<br />
Das funktioniert irgendwie nicht richtig, obwohl die gleiche Art der Anwendung in einer C-Bibliothek problemlos läuft (natürlich ohne Klasse).</p>
<p>Gibt es da bekannte generelle Probleme ?</p>
<p>Der Funktionsaufruf innerhalb der Klasse sieht so aus :</p>
<p>void CDisplay::StartThread(void)<br />
{<br />
if(!bThreadStart)<br />
{<br />
pthread_create(&amp;ThreadID, NULL, &amp;ThreadFunction, NULL);<br />
}<br />
}</p>
<p>An Parameter 3 meckert der Compiler ständig rum, auch wenn ich dort z. B.<br />
einen Cast mache wie z. Bsp. &quot;(void*)ThreadFunction&quot;.</p>
<p>Der Prototyp von &quot;ThreadFunction&quot; ist &quot;void* ThreadFunction(void)&quot;.</p>
<p>Was mache ich verkehrt ?<br />
Wie gesagt, der Aufruf und die Kreierung sollen in einer Klasse bzw. in deren Memberfunktionen ablaufen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Danke für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652771</guid><dc:creator><![CDATA[Schubi]]></dc:creator><pubDate>Mon, 26 Jan 2009 17:49:12 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit posix-thread on Mon, 26 Jan 2009 18:15:20 GMT]]></title><description><![CDATA[<p>Der dritte Parameter muss eine statische Funktion sein, die keinen Parameter hat und einen Zeiger auf void zurückgibt. Tut das deine?<br />
Merke: Eine Memberfunktion kannst du da nicht angeben! (ausser sie ist statisch).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652786</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 26 Jan 2009 18:15:20 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit posix-thread on Mon, 26 Jan 2009 18:45:15 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Der dritte Parameter muss eine statische Funktion sein, die keinen Parameter hat und einen Zeiger auf void zurückgibt.</p>
</blockquote>
<p>Nur eine kleine Ergänzung/Berichtigung dazu: Die Funktion, die als Thread laufen soll, hat einen Pointer als Parameter, also z.B.</p>
<pre><code class="language-cpp">void* CDisplay::StartThread(void *arg);
</code></pre>
<p>Was man in dieser Situation häufig macht ist, den this-Zeiger als letztes Argument von pthread_create() zu übergeben. Dieser wird dann als Argument an die Thread-Funktion weitergegeben. Die Funktion kann ihn nach <code>CDisplay*</code> zurück casten, um trotz <code>static</code> an den this-Zeiger ranzukommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652807</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Mon, 26 Jan 2009 18:45:15 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit posix-thread on Mon, 26 Jan 2009 18:49:08 GMT]]></title><description><![CDATA[<p>dooooomi schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Der dritte Parameter muss eine statische Funktion sein, die keinen Parameter hat und einen Zeiger auf void zurückgibt.</p>
</blockquote>
<p>Nur eine kleine Ergänzung/Berichtigung dazu: Die Funktion, die als Thread laufen soll, hat einen Pointer als Parameter, also z.B.</p>
<pre><code class="language-cpp">void* CDisplay::StartThread(void *arg);
</code></pre>
</blockquote>
<p>Danke, das wusste ich nicht. Ich habe einfach mal angenommen, dass die Fehlermeldung stimmt. <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>Dem Fall ist es, wie du richtig sagst kein Problem den this Zeiger explizit anzugeben und zu casten. (nervig wäre es, wenn die wirklich void wäre. :))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652809</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 26 Jan 2009 18:49:08 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit posix-thread on Tue, 27 Jan 2009 07:14:29 GMT]]></title><description><![CDATA[<p>vielen Dank für eure Antworten. Wenn ich das richtig verstehe, dann muss also die Thread-Fkt. statisch sein, dann darf diese auch eine Member-fkt. der Klasse darstellen. Das Dumme dabei ist halt nur, dass eine statische Fkt. ja auch nur statische Elemente enthalten darf, un das ist halt in der Fkt., die im Thread laufen soll leider nicht der Fall. Das würde also heissen, dass ich den Thread sozusagen &quot;aussen vor&quot; (nicht in einer Klasse&quot; definieren muss, oder ?<br />
Z. B. als c- Datei, die ich dann dort einbinde.<br />
Kann nicht sagen, dass ich das toll finde.<br />
Gibt es da noch &quot;echte&quot; c++ - Alternativen ??</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653008</guid><dc:creator><![CDATA[schubi]]></dc:creator><pubDate>Tue, 27 Jan 2009 07:14:29 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit posix-thread on Tue, 27 Jan 2009 13:38:21 GMT]]></title><description><![CDATA[<p>schubi schrieb:</p>
<blockquote>
<p>vielen Dank für eure Antworten. Wenn ich das richtig verstehe, dann muss also die Thread-Fkt. statisch sein, dann darf diese auch eine Member-fkt. der Klasse darstellen. Das Dumme dabei ist halt nur, dass eine statische Fkt. ja auch nur statische Elemente enthalten darf, un das ist halt in der Fkt., die im Thread laufen soll leider nicht der Fall.</p>
</blockquote>
<p>Wie meinst du das, &quot;nur statische Elemente&quot;? Im Prinzip gibt es nur einen einzigen Unterschied zwischen statischen und nicht-statischen Memberfunktionen, nämlich daß du in den statischen keinen this-Zeiger hast (ist ja auch klar, weil die Funktion ja auf kein konkretes Objekt aufgerufen wird). Und wie du in der statischen Funktion an den this-Zeiger kommst habe ich oben schon beschrieben.</p>
<p>Was du wohl machen kannst, ist den Thread als normale Memberfunktion zu schreiben, und dann eine kleine statische Memberfunktion als Wrapper. Das würde dann etwa so aussehen:</p>
<pre><code class="language-cpp">class CDisplay
{
    void ThreadFunktion();
    static void* ThreadFunctionWrapper(void *arg);
    void StartThread();
};

void CDisplay::ThreadFunction()
{
    // das hier ist eine ganz normale Member-Funktion
    // ...
}

void* CDisplay::ThreadFunctionWrapper(void *arg)
{
    CDisplay *this_ = static_cast&lt;CDisplay*&gt;(arg);
    this_-&gt;ThreadFunction();
}

void CDisplay::StartThread()
{
    // hier werden die Wrapper-Funktion und der this-Zeiger als Parameter angegeben
    pthread_create(&amp;ThreadID, NULL, &amp;ThreadFunctionWrapper, static_cast&lt;void*&gt;(this));
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1653209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653209</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Tue, 27 Jan 2009 13:38:21 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit posix-thread on Tue, 27 Jan 2009 15:49:26 GMT]]></title><description><![CDATA[<p>Man sollte noch anmerken, dass eine Thread-Funktion <strong>nicht</strong> die statische Funktion einer Klasse sein sollte, sondern eine freie extern &quot;C&quot; Funktion. Denn nirgends steht geschrieben, dass eine statische Funktion dieselben Calling Conventions haben muss, wie eine freie extern &quot;C&quot; Funktion.</p>
<p>Ist aber nicht wirklich ein Problem.</p>
<pre><code class="language-cpp">extern &quot;C&quot; void* FreeThreadFunctionWrapper(void* arg)
{
    CDisplay::ThreadFunctionWrapper(arg);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1653297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653297</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 27 Jan 2009 15:49:26 GMT</pubDate></item></channel></rss>