<?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 function ohne boost::bind]]></title><description><![CDATA[<p>hi,</p>
<pre><code class="language-cpp">#include &lt;process.h&gt;
#include &lt;windows.h&gt;
#include &lt;iostream&gt; 
using namespace std;

class MyThreadClass
{
public:
 void WorkFunction(void);
};

void MyThreadClass::WorkFunction(void)
{
 cout &lt;&lt; &quot;Thread called&quot; &lt;&lt; endl;
}

void ThreadFunction(void *pParam)
{
 MyThreadClass *mt = (MyThreadClass*)pParam;
 mt-&gt;WorkFunction();

 _endthread();
}

void main(void)        // Primary Thread
{
 MyThreadClass mt;

 _beginthread(ThreadFunction,   // Pointer to Thread Function
     0,     // Stack Size set automatically
     &amp;mt);    // Parameter: Pointer to Instance

 Sleep(10000);
}
</code></pre>
<p>ich moechte im obrigen beispiel diesen unschoenen cast verhindern:<br />
MyThreadClass *mt = (MyThreadClass*)pParam;<br />
mt-&gt;WorkFunction();<br />
die thread function soll aber auch nicht static in der class sein!!!</p>
<p>dachte an sowas like boost::bind:</p>
<pre><code class="language-cpp">#include &lt;process.h&gt;
#include &lt;windows.h&gt;
#include &lt;iostream&gt; 
#include &lt;functional&gt;
#include &lt;algorithm&gt; 
using namespace std;

class MyThreadClass
{
public:
	void WorkFunction(void) {
		cout &lt;&lt; &quot;Thread called&quot; &lt;&lt; endl;
	}
};

void main(void)								// Primary Thread
{
	MyThreadClass mt;

	_beginthread(std::bind1st (std::mem_fun1 (&amp;MyThreadClass::WorkFunction), &amp;mt),			// Pointer to Thread Function
				 0,					// Stack Size set automatically
				 &amp;mt);				// Parameter: Pointer to Instance

	Sleep(10000);
}
</code></pre>
<p>error:</p>
<pre><code class="language-cpp">c:\temp\thread_test\thread_test\main.cpp(26) : error C2784: 'std::mem_fun1_t&lt;_Result,_Ty,_Arg&gt; std::mem_fun1(_Result (__thiscall _Ty::* )(_Arg))' : could not deduce template argument for '_Result (__thiscall _Ty::* )(_Arg)' from 'void (__thiscall IMyThreadClass::* )(void)'
        c:\program files\microsoft visual studio 8\vc\include\functional(604) : see declaration of 'std::mem_fun1'
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/178698/thread-function-ohne-boost-bind</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 00:24:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/178698.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 13 Apr 2007 16:44:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to thread function ohne boost::bind on Fri, 13 Apr 2007 16:44:37 GMT]]></title><description><![CDATA[<p>hi,</p>
<pre><code class="language-cpp">#include &lt;process.h&gt;
#include &lt;windows.h&gt;
#include &lt;iostream&gt; 
using namespace std;

class MyThreadClass
{
public:
 void WorkFunction(void);
};

void MyThreadClass::WorkFunction(void)
{
 cout &lt;&lt; &quot;Thread called&quot; &lt;&lt; endl;
}

void ThreadFunction(void *pParam)
{
 MyThreadClass *mt = (MyThreadClass*)pParam;
 mt-&gt;WorkFunction();

 _endthread();
}

void main(void)        // Primary Thread
{
 MyThreadClass mt;

 _beginthread(ThreadFunction,   // Pointer to Thread Function
     0,     // Stack Size set automatically
     &amp;mt);    // Parameter: Pointer to Instance

 Sleep(10000);
}
</code></pre>
<p>ich moechte im obrigen beispiel diesen unschoenen cast verhindern:<br />
MyThreadClass *mt = (MyThreadClass*)pParam;<br />
mt-&gt;WorkFunction();<br />
die thread function soll aber auch nicht static in der class sein!!!</p>
<p>dachte an sowas like boost::bind:</p>
<pre><code class="language-cpp">#include &lt;process.h&gt;
#include &lt;windows.h&gt;
#include &lt;iostream&gt; 
#include &lt;functional&gt;
#include &lt;algorithm&gt; 
using namespace std;

class MyThreadClass
{
public:
	void WorkFunction(void) {
		cout &lt;&lt; &quot;Thread called&quot; &lt;&lt; endl;
	}
};

void main(void)								// Primary Thread
{
	MyThreadClass mt;

	_beginthread(std::bind1st (std::mem_fun1 (&amp;MyThreadClass::WorkFunction), &amp;mt),			// Pointer to Thread Function
				 0,					// Stack Size set automatically
				 &amp;mt);				// Parameter: Pointer to Instance

	Sleep(10000);
}
</code></pre>
<p>error:</p>
<pre><code class="language-cpp">c:\temp\thread_test\thread_test\main.cpp(26) : error C2784: 'std::mem_fun1_t&lt;_Result,_Ty,_Arg&gt; std::mem_fun1(_Result (__thiscall _Ty::* )(_Arg))' : could not deduce template argument for '_Result (__thiscall _Ty::* )(_Arg)' from 'void (__thiscall IMyThreadClass::* )(void)'
        c:\program files\microsoft visual studio 8\vc\include\functional(604) : see declaration of 'std::mem_fun1'
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1265482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265482</guid><dc:creator><![CDATA[cpp1]]></dc:creator><pubDate>Fri, 13 Apr 2007 16:44:37 GMT</pubDate></item><item><title><![CDATA[Reply to thread function ohne boost::bind on Fri, 13 Apr 2007 16:46:25 GMT]]></title><description><![CDATA[<p>Kann man nicht verhindern</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265485</guid><dc:creator><![CDATA[asdni]]></dc:creator><pubDate>Fri, 13 Apr 2007 16:46:25 GMT</pubDate></item><item><title><![CDATA[Reply to thread function ohne boost::bind on Fri, 13 Apr 2007 16:48:20 GMT]]></title><description><![CDATA[<p>koennte ja ne art boost::bind nachbauen?</p>
<p>die verwenden ja intern auch ne art: std::bind1st (std::mem_fun1 ... ?</p>
<p>cu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265488</guid><dc:creator><![CDATA[cpp1]]></dc:creator><pubDate>Fri, 13 Apr 2007 16:48:20 GMT</pubDate></item><item><title><![CDATA[Reply to thread function ohne boost::bind on Fri, 13 Apr 2007 16:50:16 GMT]]></title><description><![CDATA[<p>Wird dir nichts bringen, weil _beginthread keinen Fuktor annehmen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265491</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Fri, 13 Apr 2007 16:50:16 GMT</pubDate></item><item><title><![CDATA[Reply to thread function ohne boost::bind on Fri, 13 Apr 2007 16:51:58 GMT]]></title><description><![CDATA[<p>soll ich createThread nehmen? hm. was ruft boost unter windows dann auf? createThread?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265492</guid><dc:creator><![CDATA[cpp1]]></dc:creator><pubDate>Fri, 13 Apr 2007 16:51:58 GMT</pubDate></item><item><title><![CDATA[Reply to thread function ohne boost::bind on Fri, 13 Apr 2007 16:59:46 GMT]]></title><description><![CDATA[<p>Boost regelts auch über eine einfache Funktion:</p>
<pre><code class="language-cpp">DWORD WINAPI ThreadProxy(LPVOID args)
{
    ThreadProxyData* data=reinterpret_cast&lt;ThreadProxyData*&gt;(args);
    DWORD ret=data-&gt;start_address_(data-&gt;arglist_);
    delete data;
    return ret;
}

// ...

HANDLE hthread=CreateThread(static_cast&lt;LPSECURITY_ATTRIBUTES&gt;(security),stack_size,ThreadProxy,
        new ThreadProxyData(start_address,arglist),initflag,&amp;threadID);

// ...
</code></pre>
<p>Zu deinem Compilierfehler. Du kannst bind1st nicht auf eine Methode mit keinem Parameter anwenden! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1265498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265498</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Fri, 13 Apr 2007 16:59:46 GMT</pubDate></item><item><title><![CDATA[Reply to thread function ohne boost::bind on Fri, 13 Apr 2007 17:04:35 GMT]]></title><description><![CDATA[<p>das ist ja genau was ich verhindern wollte:)</p>
<pre><code class="language-cpp">MyThreadClass *mt = (MyThreadClass*)pParam;
mt-&gt;WorkFunction();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1265503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265503</guid><dc:creator><![CDATA[cpp1]]></dc:creator><pubDate>Fri, 13 Apr 2007 17:04:35 GMT</pubDate></item><item><title><![CDATA[Reply to thread function ohne boost::bind on Fri, 13 Apr 2007 17:06:45 GMT]]></title><description><![CDATA[<p>cpp1 schrieb:</p>
<blockquote>
<p>das ist ja genau was ich verhindern wollte:)</p>
<pre><code class="language-cpp">MyThreadClass *mt = (MyThreadClass*)pParam;
mt-&gt;WorkFunction();
</code></pre>
</blockquote>
<p>Das ist genau das was du nicht verhindern kannst!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265505</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Fri, 13 Apr 2007 17:06:45 GMT</pubDate></item><item><title><![CDATA[Reply to thread function ohne boost::bind on Fri, 13 Apr 2007 20:02:58 GMT]]></title><description><![CDATA[<p>@cpp1:<br />
Die &quot;trampoline-function&quot; brauchst du immer, ob nun in einer library gekapselt oder selbst geschrieben, aber ohne die geht nix - das OS kennt nunmal kein C++, und damit kennen OS-threads auch kein C++.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10754">@David_pb</a>:<br />
Boost.Thread verwendet normalerweise _beginthreadex und nicht CreateThread. Die Stelle mit CreateThread die du gepostet hast ist Teil der Ersatzfunktion für Windows CE, wo es _beginthreadex nicht gibt <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>(Ich hab's nachgesehen weil es mir komisch vorkam, ich hab' mir den Boost.Thread Code schon vor längerem etwas angesehen und hatte noch in Erinnerung dass da _beginthreadex und nicht CreateThread verwendet wird.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265633</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 13 Apr 2007 20:02:58 GMT</pubDate></item><item><title><![CDATA[Reply to thread function ohne boost::bind on Sat, 14 Apr 2007 02:06:27 GMT]]></title><description><![CDATA[<p>Ups, stimmt! <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="🙂"
    /> Aber _beginthreadex verwendet genauso eine Funktion:</p>
<pre><code class="language-cpp">extern &quot;C&quot; {
#if defined(BOOST_HAS_WINTHREADS)
    unsigned __stdcall thread_proxy(void* param)
#elif defined(BOOST_HAS_PTHREADS)
        static void* thread_proxy(void* param)
#elif defined(BOOST_HAS_MPTASKS)
        static OSStatus thread_proxy(void* param)
#endif
    {
        try
        {
            thread_param* p = static_cast&lt;thread_param*&gt;(param);
            boost::function0&lt;void&gt; threadfunc = p-&gt;m_threadfunc;
            p-&gt;started();
            threadfunc();
#if defined(BOOST_HAS_WINTHREADS)
            on_thread_exit();
#endif
        }
        catch (...)
        {
#if defined(BOOST_HAS_WINTHREADS)
            on_thread_exit();
#endif
        }
#if defined(BOOST_HAS_MPTASKS)
        ::boost::detail::thread_cleanup();
#endif
        return 0;
    }

}
</code></pre>
<p>Im Prinzip kommts also quasi aufs Gleiche raus! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1265769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265769</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sat, 14 Apr 2007 02:06:27 GMT</pubDate></item></channel></rss>