2011-09-20 128 views
0

我很惊讶奇怪的异常,我得到了。C++类:创建线程+指向函数的指针=访问冲突

class Threads { 
    public: 
     Threads() {} 
     ~Threads() {} 
     void StartThread(int (*p)()); //pointer to a function 
    private: 
     HANDLE hThread; 
     DWORD dwThreadID; 
    }; 

方法StartThread应接收指向我的函数(将在另一个线程中运行)的指针。
这个功能很简单。 (你可以看到它位于类主题外):

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 'LPTHREAD_START_ROUTINE'。那就是为什么我做了这个演员。

在主函数中,我创建了Threads类型的对象,并尝试调用方法StartThread。作为参数I发送指向函数MyThread的指针。

Threads *thread1; 
thread1 = new Threads(); 
thread1->StartThread(MyThread); 

我以为MyThread必须在另一个线程中启动。但函数MyTread总是在主线程中运行!!!只有在MyThread结束后,另一个线程才会启动,然后出现以下异常: ThreadClass.exe中0x00000000处未处理的异常:0xC0000005:访问冲突。

我需要聪明的建议!

+1

这已被问了很多次之前:http://stackoverflow.com/questions/1372967/how-to-use-createthread-for-functions-which-are-class-members http://stackoverflow.com/ question/2891926/create-thread-is-not-accepting-the-member-functon http://stackoverflow.com/questions/402992/passing-function-pointers-in-c http://stackoverflow.com/questions/ 7140042/c-functor-as-a-function-pointer http://stackoverflow.com/questions/4681581/how-do-i-call-worker-thread-in-a-same-class-c-mfc http: //stackoverflow.com/questions/4666635/run-threads-of-class-member-function-in-c仅举几例 –

回答

0

它看起来像你实际上是在呼吁这条线的功能...

(LPTHREAD_START_ROUTINE)(*p)() 

...并返回,你铸造一个int。这是行不通的。如何:

(LPTHREAD_START_ROUTINE)p 

...取而代之?

+0

它的工作原理!谢谢! :) –

+0

@Girl_Developer:只是因为它看起来像它的作品并不意味着它的确如此。函数签名全部错误 - “LPTHREAD_START_ROUTINE”接受一个LPVOID类型的参数,返回一个DWORD,并使用__stdcall调用约定。如果您的函数类型正确,则不需要也不应该使用演员表。当你的线程例程返回时,它会崩溃,因为你的调用约定是错误的,所以栈被搞乱了。 –

+0

+1以上Adam的评论;如果你在这里使用了演员,你很可能做错了。我不认为在Win32中你应该永远需要施放一个函数。一般来说,演员应该被怀疑地看待。 – BrendanMcK