我正在尝试使用非静态类成员创建一个线程,如下所示:
template <class clName>
DWORD WINAPI StartThread(PVOID ptr) {
((clName*)(ptr))->testf(); // this is static member name I want to be able use different names with the same function
return 1;
}
class Thread {
private :
HANDLE native_handle = 0;
DWORD id = 0;
public :
template <class T,class U>
Thread(T U::*member,U* original); // I want to use different members with the same function
bool run();
}
template<class T,class U>
Thread::Thread(T U::*member, U* original)
{
native_handle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)StartThread<U>,original, CREATE_SUSPENDED, &id);
}
bool Thread::run() {
DWORD res = ResumeThread(native_handle);
if (res == (DWORD)-1) return false;
return true;
}
class testt {
public :
void testf() {
MessageBoxA(0, "working", "", 0);
}
void doIt() {
Thread t(&testt::testf,this);
t.run();
}
};
int main() {
testt tt;
tt.doIt();
}
如您所见,我只能运行一个特定的成员,因此该方法不可移植,并且不能用于任何类或成员。
我知道我可以std::thread
轻松使用,但我正在开发一个不应该在其中使用任何 C++ 运行时的项目,所以我正在为new
/ delete
、线程、文件 I/O 等创建包装器。否则,我总是使用std::thread
它极好的。在这个项目中,我只需要使用 Win32 API。