2010-07-06 4 views
0

У меня есть функция в моем классе, которая создает поток и дает ему аргументы для вызова функции, которая является частью этого класса, но так как поток procs должен быть статическим, я не могу получить доступ к каким-либо членам класса. Как это можно сделать, не используя кучу статических членов в файле cpp, чтобы временно манипулировать данными, это кажется медленным.Функции класса доступа от другого ада?

Вот пример того, что я имею в виду:

в 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

Я не использую boost – jmasterx

+0

О, хорошо, я просто передаю структуру, тогда, когда 1 из ее членов является указателем на себя – jmasterx

+0

, да, это может быть решением, если вы действительно против использования форсирования. Обратите внимание, однако, что эти вещи теперь являются частью нового стандарта C++ 0x, поддерживаемого основными компиляторами, поэтому его использование не является экзотическим. Они находятся в другом пространстве имен: std вместо повышения – jdehaan

0

Я хотел бы предложить вам сделать дружный класс с методом static для этой цели. Он выглядит намного чище. Например: -

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

Теперь подружитесь вышеупомянутый класс в главном классе ...

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

Это позволит вам установить friend-function как thread-function и доступ к классу для каждого экземпляра в каждом потоке. Обязательно синхронизируйте свой доступ к данным, видимым в потоках.