метод класса = функция потока
От: Аноним  
Дата: 06.10.05 07:26
Оценка:
Возможно ли использовать в качестве рабочей функции потока метод класса:

unsigned __stdcall MyClass::StreamFunction(void* p)
{
// ...
return 0;
}

MyClass::MyClass()
{
// ...
unsigned nIdStream = 0;
HANDLE handleStream = (HANDLE) _beginthreadex(NULL, 0, MyClass::StreamFunction, this, 0, &nIdStream);

return;
}

компилятор на это ругается:
С2664: cannot convert parameter 3 from 'unsigned int(void*)' to 'unsigned int(__stdcall*)(void*)'

буду благодарен за совет...
Возможно ли использовать в качестве рабочей функции потока метод класса:

unsigned __stdcall MyCclass::StreamFunction(void* p)
{
// ...
return 0;
}

MyCclass::MyCclass()
{
// ...
unsigned nIdStream = 0;
HANDLE handleStream = (HANDLE) _beginthreadex(NULL, 0, MyCclass::StreamFunction, this, 0, &nIdStream);

return;
}

компилятор на это ругается:
С2664: cannot convert parameter 3 from 'unsigned int(void*)' to 'unsigned int(__stdcall*)(void*)'

буду благодарен за совет...
Re: метод класса = функция потока
От: Silent Bob  
Дата: 06.10.05 07:33
Оценка:
Здравствуйте, Аноним, Вы писали:

Объяви его как static
Re: метод класса = функция потока
От: gid_vvp  
Дата: 06.10.05 07:33
Оценка:
пользуйтесь поиском
beginthread
Автор: _synapse_
Дата: 04.10.05
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: метод класса = функция потока
От: VladKurmaz Украина http://tis-method.org/
Дата: 06.10.05 07:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Возможно ли использовать в качестве рабочей функции потока метод класса:


А>unsigned __stdcall MyClass::StreamFunction(void* p)

А>{
А>// ...
А> return 0;
А>}

А>MyClass::MyClass()

А>{
А>// ...
А> unsigned nIdStream = 0;
А> HANDLE handleStream = (HANDLE) _beginthreadex(NULL, 0, MyClass::StreamFunction, this, 0, &nIdStream);

А> return;

А>}

А>компилятор на это ругается:

А>С2664: cannot convert parameter 3 from 'unsigned int(void*)' to 'unsigned int(__stdcall*)(void*)'

А>буду благодарен за совет...

В объявлении функции в классе укажи static.
Re: метод класса = функция потока
От: PVA  
Дата: 06.10.05 07:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Возможно ли использовать в качестве рабочей функции потока метод класса:

Возможно, через обертку.
Используйте статическую функцию класса, которая будет вызывать уже необходимую функцию внутри конкретного класса.
...
private:
    static DWORD WINAPI ThreadFunc__(LPVOID self);
...
newbie
Re: метод класса = функция потока
От: Батончик Украина  
Дата: 06.10.05 07:36
Оценка:
Здравствуйте, Аноним, Вы писали:

Для того чтобы метод класса мог быть функцией потока, данный метод должен быть объявлен как
static
Re: метод класса = функция потока
От: Erop Россия  
Дата: 06.10.05 07:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Возможно ли использовать в качестве рабочей функции потока метод класса?


Можно, но есть две проблемы.

1) Функция потока должна быть статической, с аргументом, а вовсе и не методом без аргументов. Но это различие ведь чисто формальное и можно просто перенаправлять вызов через статический метод. Типа в beginthread или анологичную функцию передаёшь адрес статического метода и this, в качестве аргумента, ну а в методе, как-то проверяешь, что аргумент таки this, приводишь его и зовёшь уже нужный, нестатический.

2) Надо как-то передать объект, метод которого выполняется на другой нити, во владение этой нити, ну или как-то синхронизовать владение, чтоб ожна нить не разрушила объект слишком рано, пока вторая ещё им пользуется.
Решается обычными методами.

Но точно ли тебе такое счастье надо заводить на ровном месте?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: метод класса = функция потока
От: Аноним  
Дата: 06.10.05 07:41
Оценка:
Спасибо
Re[2]: метод класса = функция потока
От: Аноним  
Дата: 06.10.05 07:46
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Аноним, Вы писали:


А>>Возможно ли использовать в качестве рабочей функции потока метод класса?


E>Можно, но есть две проблемы.


E>1) Функция потока должна быть статической, с аргументом, а вовсе и не методом без аргументов. Но это различие ведь чисто формальное и можно просто перенаправлять вызов через статический метод. Типа в beginthread или анологичную функцию передаёшь адрес статического метода и this, в качестве аргумента, ну а в методе, как-то проверяешь, что аргумент таки this, приводишь его и зовёшь уже нужный, нестатический.


E>2) Надо как-то передать объект, метод которого выполняется на другой нити, во владение этой нити, ну или как-то синхронизовать владение, чтоб ожна нить не разрушила объект слишком рано, пока вторая ещё им пользуется.

E>Решается обычными методами.

E>Но точно ли тебе такое счастье надо заводить на ровном месте?


По всей видимости — не надо. Наверно, лучше функцию потока сделать простой функцией, но объявить объявить ее со статической обл. видимости в соответствующем файле
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.