C ++类:创建Thread +指向函数= Access的指针的对象

时间:2011-09-20 18:51:24

标签: c++ multithreading winapi

我对这个奇怪的异常感到非常惊讶。

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:访问冲突。

我需要聪明的建议!

2 个答案:

答案 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 

...代替?