问题
How do I create a thread routine of a static member function
class Blah
{
static void WINAPI Start();
};
// ..
// ...
// ....
hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL);
This gives me the following error:
***error C2664: '_beginthreadex' : cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)'***
What am I doing wrong?
回答1:
Sometimes, it is useful to read the error you're getting.
cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)'
Let's look at what it says. For parameter three, you give it a function with the signature void(void)
, that is, a function which takes no arguments, and returns nothing. It fails to convert this to unsigned int (__stdcall *)(void *)
, which is what _beginthreadex
expects:
It expects a function which:
- Returns an
unsigned int
: - Uses the
stdcall
calling convention - Takes a
void*
argument.
So my suggestion would be "give it a function with the signature it's asking for".
class Blah
{
static unsigned int __stdcall Start(void*);
};
回答2:
class Blah
{
static unsigned int __stdcall Start(void*); // void* should be here, because _beginthreadex requires it.
};
The routine passed to _beginthreadex
must use the __stdcall
calling convention and must return a thread exit code.
Implementation of Blah::Start:
unsigned int __stdcall Blah::Start(void*)
{
// ... some code
return 0; // some exit code. 0 will be OK.
}
Later in your code you could write any of the following:
hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL);
// or
hThread = (HANDLE)_beginthreadex(NULL, 0, &CBlah::Start, NULL, NULL, NULL);
In first case Function-to-pointer conversion
will be applied according to C++ Standard 4.3/1. In second case you'll pass pointer to function implicitly.
回答3:
class Blah
{
public:
static DWORD WINAPI Start(void * args);
};
回答4:
Following is the compiling version:
class CBlah
{
public:
static unsigned int WINAPI Start(void*)
{
return 0;
}
};
int main()
{
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &CBlah::Start, NULL, NULL, NULL);
return 0;
}
Following are the changes required:
(1). Start() function should return unsigned int
(2). It should take a void* as the parameter.
EDIT
Deleted point (3) as per comment
回答5:
class Blah
{
static unsigned int __stdcall Start(void *);
};
来源:https://stackoverflow.com/questions/1259815/beginthreadex-static-member-function