我对这个奇怪的异常感到非常惊讶。
class Threads {
public:
Threads() {}
~Threads() {}
void StartThread(int (*p)()); //pointer to a function
private:
HANDLE hThread;
DWORD dwThreadID;
};
方法StartThread应该接收指向我的函数的指针(将在另一个线程中运行) 这个功能很简单。 (你可以看到它位于Threads类之外):
int MyThread()
{
return 0;
}
这是创建线程的方法:
inline void Threads::StartThread(int (*p)())
{
hThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)(*p)(),
NULL,
0,
&dwThreadID);
if (hThread == NULL)
{
return;
}
}
此处编译器获取错误:无法将参数3从“int”转换为“LPTHREAD_START_ROUTINE”。这就是为什么我做了铸造。
在main函数中,我创建了Threads类型的对象,我尝试调用方法StartThread。作为参数,我发送指向函数MyThread的指针。
Threads *thread1;
thread1 = new Threads();
thread1->StartThread(MyThread);
我认为MyThread必须从另一个线程开始。但是MyTread函数总是在主线程中运行!!!只有在MyThread结束后,另一个线程启动,然后我得到这个异常: ThreadClass.exe中0x00000000处的未处理异常:0xC0000005:访问冲突。
我需要聪明的建议!
答案 0 :(得分:2)
调用约定错误:
LPTHREAD_START_ROUTINE是一个__stdcall方法而不是__cdecl方法,请参阅此处的文档:http://msdn.microsoft.com/en-us/library/aa964928.aspx。
答案 1 :(得分:0)
看起来你实际上在这一行上调用了这个函数......
(LPTHREAD_START_ROUTINE)(*p)()
...并返回一个你正在投射的int。那是行不通的。怎么样:
(LPTHREAD_START_ROUTINE)p
...代替?