2010-07-06 112 views
0

我有一個函數在我的類中創建一個線程並給它的參數來調用該類的一部分的函數,但由於線程過程必須是靜態的,我無法訪問任何類的成員。如何在不使用cpp文件中的一堆靜態成員來暫時給數據進行操作的情況下做到這一點,這看起來很慢。從另一個thead訪問類功能?

繼承人我的意思的例子:

在CPP文件:

void myclass::SetNumber(int number) 
{ 
    numberfromclass = number; 
} 

void ThreadProc(void *arg) 
{ 

    //Can't do this 
    myclass::SetNumber((int)arg); 
} 

我不能這樣做,因爲SetNumber必須是靜態的,但我例如我的課很多,所以這將無法工作。

我該怎麼辦?

感謝

回答

1

通常你指定的MyClass對象的地址作爲arg類型丟在裏面ThreadProc的。但是,如果傳遞int參數,你會被阻塞。

void ThreadProc(void *arg) 
{ 
    myclass* obj = reinterpret_cast<myclass*>(arg); 
    //Can't do this 
    obj->SetNumber(???); 
} 

正如你所說,這可能不僅有點慢,但它也混亂了代碼。我建議使用boost::bind作爲參數綁定,並以獨立於操作系統的方式創建線程(至少對於您自己的源代碼),您可以使用boost::thread。那麼你的線程不需要靜態方法。

現在在的C++ 0x標準,這裏small tutorial

+0

我沒有使用提升 – jmasterx 2010-07-06 19:20:14

+0

哦,好吧,我只是傳遞一個結構,然後其中的1個成員是自我指針 – jmasterx 2010-07-06 19:30:03

+0

是的,如果你真的反對提升使用率,那可能是一個解決方案。但是請注意,這些東西現在是主要編譯器支持的新的C++ 0x標準的一部分,所以使用它並不奇特。他們在不同的命名空間思想:std而不是boost – jdehaan 2010-07-06 19:34:44

0

我會建議你做一個友好的類用於此目的的static方法。它看起來更乾淨。例如: -

class FriendClass 
{ 
public: 
    static void staticPublicFunc(void*); 
}; 

現在交好上述類主類...

class MyClass 
{ 
    friend void FriendClass::staticPublicFunc(void*); 
}; 

這應該讓你設置friend-functionthread-function和訪問每個線程每個實例類。確保同步您對跨線程​​可見數據的訪問。