Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// ------------------------------------------------------------------- // Name: frmServer_StartServer() // Desc: Starts the winsock server. // ------------------------------------------------------------------- int frmServer::frmServer_StartServer() { // [...] if(pServerThread->Create(NULL, 0, &frmServer::frmServer_ServerThreadProc, NULL, 0) != THREAD_CREATING_ERROR) return THREAD_CREATING_ERROR; // [...] return SRV_OK; } // frmServer_StartServer() // ------------------------------------------------------------------- // Name: frmServer_ServerThreadProc() // Desc: Thread procedure for the winsock server. // ------------------------------------------------------------------- DWORD WINAPI frmServer::frmServer_ServerThreadProc (LPVOID lpPAram) { int i = GetCurrentThreadId(); return i; } // frmServer_ServerThreadProc() |
Zitat von »"rewb0rn"«
es ist ein unterschied, ob du eine klassenmethode oder eine funktion übergibst. im schlechtesten fall musst du dir eine kapselungsfunktion schreiben, die die methode deines objektes ausführst. wenn du glück hast gibts für create auch eine variante für klassenmethoden, da musst du mal gucken. in dem fall musst du aber ein objekt mit übergeben, von dem die methode dann aufgerufen wird, weil nur frmServer::frmServer_ThreadProc dem compiler nicht sagt auf welche instanz sich das bezieht.
Zitat von »"rewb0rn"«
weil nur frmServer::frmServer_ThreadProc dem compiler nicht sagt auf welche instanz sich das bezieht.
C-/C++-Quelltext |
|
1 2 |
template<class T> deinefunktion(T::MemberFunction* (DWORD)(LPVOID), T* Object); |
C-/C++-Quelltext |
|
1 |
deinefunktion(&frmServer::frmServer_ThreadProc, this) |
C-/C++-Quelltext |
|
1 2 3 4 5 |
template< typename T > void test( DWORD ( T::*FunPtr )( LPVOID ), T* instance ) { (instance->*FunPtr)(0); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 |
template<typename T > void test( std::binder1st<T> fun ) { fun(0); } // ... foo bar; test( std::bind1st( std::mem_fun( &foo::bar ), &bar ) ); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
template< typename T > struct funobj { typedef DWORD ( T::*FunPtr_t )( LPVOID ); funobj( FunPtr_t fun ) : ptr( new T() ), fun_( fun ) {} DWORD operator()( LPVOID p ) { return ( *ptr.*fun_ )(p); } private: std::auto_ptr<T> ptr; FunPtr_t fun_; }; template< typename T > void test( funobj<T>& fun ) { fun(0); } // ... funobj<foo> obj(&foo::bar); test( obj ); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
class BasicServer : public Netzwerk { #ifdef _WIN32 HANDLE ThreadID1, ThreadID2; #else pthread_t thread1, thread2; #endif static DWORD WINAPI empfangenClients(LPVOID); static DWORD WINAPI empfangenServer(LPVOID); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// ------------------------------------------------------------------- // Name: Test() // Desc: Creates a new thread. // ------------------------------------------------------------------- template<typename T> int Thread::Test(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, DWORD (T::*ThreadProc)(LPVOID), T* instance, LPVOID lpParameter, DWORD dwCreationFlags) { return THREAD_OK; } // aufruf: if(pServerThread->Test(NULL, 0, &frmServer::frmServer_ServerThreadProc, this, NULL, 0) == THREAD_CREATING_ERROR) return THREAD_CREATING_ERROR; |
Zitat
error C2784: "int Thread::Test(LPSECURITY_ATTRIBUTES,SIZE_T,DWORD (__thiscall T::* )(LPVOID),T *,LPVOID,DWORD)": template-Argument für "DWORD (__thiscall T::* )(LPVOID)" konnte nicht von "DWORD (__stdcall frmServer::* )(LPVOID)" hergeleitet werden.
Werbeanzeige