Господа,
извиняюсь за тупость, но почему в отдельный поток можно кидать только статическую функцию-член класса. До конца не понимаю (может из-за недосыпания).
Здравствуйте, ethan hunt, Вы писали:
EH>Господа, EH>извиняюсь за тупость, но почему в отдельный поток можно кидать только статическую функцию-член класса. До конца не понимаю (может из-за недосыпания).
наверно потому что такую функцию можно запустить по ажресу не имея самого объекта под рукой
EH>Господа, EH>извиняюсь за тупость, но почему в отдельный поток можно кидать только статическую функцию-член класса. До конца не понимаю (может из-за недосыпания).
Не совсем понятен вопрос. Если ты хочешь использовать функцию член в качестве потока, то она действительно должна быть static т.к. static функции не имееют this пойнтера.
ethan hunt wrote:
> Господа, > извиняюсь за тупость, но почему в отдельный поток можно кидать только статическую функцию-член класса. До конца не понимаю (может из-за недосыпания).
Потому, что статическая функция-член имеет такой же тип, как и обычная ф-ция (в отличее от нестатической фун-ции-члена). В win32 и POSIX ф-ция создания потока принимает указатель именно на обычную ф-цию. Но это вовсе не значит, что ты не можешь направить поток в ф-цию-член, просто для этого тебе придется использовать переходник, который будет перенаправлять поток в функцию-член:
struct some
{
DWORD f() { return 0; }
};
int main()
{
some s;
// в качестве параметра (lpParam) передаем указатель на объект, чтобы переходник направил поток именно в этот объект
CreateThread(0, 0, thread_to_member_thunk<some, &some::f>, &s, 0, 0);
}
Здравствуйте, MaximE, Вы писали:
ME>Потому, что статическая функция-член имеет такой же тип, как и обычная ф-ция (в отличее от нестатической фун-ции-члена). В win32 и POSIX ф-ция создания потока принимает указатель именно на обычную ф-цию. Но это вовсе не значит, что ты не можешь направить поток в ф-цию-член, просто для этого тебе придется использовать переходник, который будет перенаправлять поток в функцию-член:
ME>
ME>struct some
ME>{
ME> DWORD f() { return 0; }
ME>};
ME>int main()
ME>{
ME> some s;
ME> // в качестве параметра (lpParam) передаем указатель на объект, чтобы переходник направил поток именно в этот объект
ME> CreateThread(0, 0, thread_to_member_thunk<some, &some::f>, &s, 0, 0);
ME>}
ME>
Попробывал скомпилять данный пример в VS6sp6
E:\Projects\test\test.cpp(31) : error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'
None of the functions with this name in scope match the target type
[]
> Попробывал скомпилять данный пример в VS6sp6 > > E:\Projects\test\test.cpp(31) : error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)' > None of the functions with this name in scope match the target type > > Где грабли?
ME>struct some
ME>{
ME> DWORD f() { return 0; }
ME>};
ME>int main()
ME>{
ME> some s;
ME> // в качестве параметра (lpParam) передаем указатель на объект, чтобы переходник направил поток именно в этот объект
ME> CreateThread(0, 0, thread_to_member_thunk<some, &some::f>, &s, 0, 0);
ME>}
ME>
Классная идея! Уже воплощаю ее в своей обертке.
Однако, боюсь оказаться занудой, но помойму смысла в директиве inline нет, т.к. функция передается в винду по указателю. (или я туплю?)
Salex100 wrote:
> Однако, боюсь оказаться занудой, но помойму смысла в директиве inline нет, т.к. функция передается в винду по указателю. (или я туплю?)
Действительно, вызов никогда не будет заинлайнен. inline — для того, чтобы можно было положить этот шаблон ф-ции в хедер и не было multiple symbol definition linker error.
Здравствуйте, MaximE, Вы писали:
ME>Salex100 wrote:
>> Однако, боюсь оказаться занудой, но помойму смысла в директиве inline нет, т.к. функция передается в винду по указателю. (или я туплю?)
ME>Действительно, вызов никогда не будет заинлайнен. inline — для того, чтобы можно было положить этот шаблон ф-ции в хедер и не было multiple symbol definition linker error.
ME>-- ME>Maxim Yegorushkin
Боюсь, что для шаблонной функции никогда не будет multiple definition [3.2/5]
Вадим Никулин wrote:
>>> Однако, боюсь оказаться занудой, но помойму смысла в директиве inline нет, т.к. функция передается в винду по указателю. (или я туплю?) > > ME>Действительно, вызов никогда не будет заинлайнен. inline — для того, чтобы можно было положить этот шаблон ф-ции в хедер и не было multiple symbol definition linker error.
> Боюсь, что для шаблонной функции никогда не будет multiple definition [3.2/5]
Да, точно, ты прав.
Но если ты полностью заспециализируешь шаблон ф-ции в хедере, то все-таки получишь multiple definition error, т.к. полные специализации ф-ций — это не шаблоны, а определения ф-ций. Поэтому, чтобы всегда быть на безопасной стороне, я автоматом пишу inline для function template.
-- Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 delta
Re: Поток и функция-член класса
От:
Аноним
Дата:
08.06.07 18:53
Оценка:
А как можно через _beginthread запустить не статический член сласса?
Здравствуйте, <Аноним>, Вы писали:
А>А как можно через _beginthread запустить не статический член сласса? А>очень срочно нужно, приведите пожалуйста пример.