Лично я бы не стал передавать указатель на функцию, как вы пытаетесь сделать так же, как в C ++. Это код C на C ++
Вместо этого я бы обернул эту вещь в классе. Большим преимуществом является то, что вы можете просто переопределить класс, чтобы иметь сколько угодно членов, вместо того, чтобы выполнять жирные трюки приведения, чтобы каждый раз получать ваши параметры.
Код немного запутан, поэтому я довел его до конца. Но то, что он позволяет вам сделать, выглядит примерно так:
class print_some : public basic_thread {
private:
int i;
public:
print_some (int i) : i(i) {};
action_callback () {
std::cout << i << std::endl;
}
}
int main () {
print_some printer (155);
}
Вот пример кода из одного из наших классов, который делает это:
class basic_thread :
{
public:
basic_thread();
protected:
unsigned long m_ThreadId;
virtual void action_callback () {};
// Internal routine used to bridge between OS callback format and
// action_callback. *Must* be static for the OS.
static unsigned long __stdcall self_calling_callback (void *parameter);
}
... и в .cpp:
unsigned long __stdcall basic_thread::self_calling_callback (void *parameter) {
if (parameter) {
basic_thread * thread = reinterpret_cast<basic_thread *>(parameter);
thread->action_callback();
}
return 0; // The value returned only matters if someone starts calling GetExitCodeThread
// to retrieve it.
}
basic_thread::basic_thread () {
// Start thread.
m_Handle = CreateThread(NULL,
0,
self_calling_callback,
(PVOID)this,
0,
&m_ThreadId );
if( !IsHandleValid() )
throw StartException("CreateThread() failed", GetLastError());
}