2011-09-20 132 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