Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Ilya Гость
|
Добавлено: Вт Фев 18 2003 15:27 Заголовок сообщения: Хочу создать новый поток... не получается |
|
|
Помощь требуется... Я только начиная программировать и впервые в жизни пытаюсь создать новый поток в своём процессе. Я хочу использовать функцию _beginthreadex (Visual C++), и меня вводит в ступор её третий аргумент, где должен указываться адрес функции потока: unsigned (__stdcall *start_address )( void *), всё время натыкаюсь на то, что "cannot convert parametr 3 to ...". Естественно! Я же вставляю туда указатель неверного типа. Но откуда мне знать что такое __stdcall* и что означает (void*) в конце этой строчки (скопированной из msdn).
Помогите пожалуйста!!! _stdcall*? (void*)? |
|
Вернуться к началу |
|
|
Adil Гость
|
Добавлено: Вт Фев 18 2003 16:36 Заголовок сообщения: Re: Хочу создать новый поток... не получается |
|
|
unsigned (__stdcall *start_address )( void *)
указатель на функцию, объявленную так: unsigned __stdcall MyThreadFunc(void *arglist);
arglist будет тем, что ты положишь при вызове _beginthreadex в 4-й параметр, если не надо, то клади NULL.
__stdcall* мухи отдельно, котлеты отдельно: *относиться к start_address - указывает, что объявлении указателья на функцию, а не прототип функции.
__stdcall - стандартное WinAPI-шное соглашение о вызове (навскидку точно не помню, кажется все аргументы - в стеке, очищает стек вызываемая функция, ну и декорация имени - подчеркивание спереди и собака с аргументами сзади).
Удачи. |
|
Вернуться к началу |
|
|
Ilya Гость
|
Добавлено: Вт Фев 18 2003 21:05 Заголовок сообщения: Re: Хочу создать новый поток... не получается |
|
|
Спасибо Adil! Правильно я понял, что в строчке unsigned (__stdcall *start_address )( void *), (void *) показывает, что в объявлении функции обязательно должен быть void * указатель в качестве аргумента? И, если да, то обязательно ли указывать на тип аргумента функиии, когда мы ссылаемся на неё через указатель? |
|
Вернуться к началу |
|
|
Adil Гость
|
Добавлено: Ср Фев 19 2003 10:42 Заголовок сообщения: Re: Хочу создать новый поток... не получается |
|
|
>>Спасибо Adil! >> Правильно я понял, что в строчке unsigned (__stdcall *start_address )( void *), (void *) показывает, что в объявлении функции обязательно должен быть void * указатель в качестве аргумента? Да, именно это он и показывает. >>И, если да, то обязательно ли указывать на тип аргумента функиии, когда мы ссылаемся на неё через указатель? Желательно. Иначе могут возникнуть проблемы. Например функция объявлена как void __stdcall Func(void* ptr); а указатель, как void (__stdcall *ptrFunc)();
присваиваем (т.к. типы разные, то придется использовать прямое приведение типов): ptrFunc=(void (__stdcall *)())Func; вызываем: ptrFunc(); и в этом вызове функция возмет со стека значение аргумента ptr? а мы туда его не клали - если стек пуст, то будет stack underflow error, а если не пуст, то мы его собъем (или нет, зависит от типа вызова), да еще если Func импользует этот указатель - то куда она по нему обратиться - ой-йо!
Удачи. |
|
Вернуться к началу |
|
|
Astral
Зарегистрирован: 19.02.2003 Сообщения: 4 Откуда: Санкт-Петербург
|
Добавлено: Ср Фев 19 2003 11:15 Заголовок сообщения: Re: Хочу создать новый поток... не получается |
|
|
Указывать тип в параметре обязательно. Именно по той самой причине, которую ты сам указал. А этот указатель ты можешь использовать для передачи адреса какой либо другой функции, или this?если ты создаешь поток методом какого либо класса, для того, чтобы получить доступ к методам этого класса из потока... Попробуй... я сам так сейчас делаю, работаю с сокетами и портами... Очень удобно. )) Счастливо. |
|
Вернуться к началу |
|
|
Ilya Гость
|
Добавлено: Ср Фев 19 2003 12:10 Заголовок сообщения: Кое-чего не понимаю... |
|
|
К сожалению, я нахожусь в том "программистком возрасте", когда слове стэк вызывает некоторый страх. Посоветуйте!!! Книжку какую или статью, чтобы это исправить. Лучше (дешевле) было бы, если бы она была в электроном виде.
И ещё один момент непонятный есть: указатель - это адрес, когда говорим "указатель на функцию", адрес чего имеем ввиду? |
|
Вернуться к началу |
|
|
Ilya Гость
|
Добавлено: Ср Фев 19 2003 12:10 Заголовок сообщения: Кое-чего не понимаю... |
|
|
К сожалению, я нахожусь в том "программистком возрасте", когда слове стэк вызывает некоторый страх. Посоветуйте!!! Книжку какую или статью, чтобы это исправить. Лучше (дешевле) было бы, если бы она была в электроном виде.
И ещё один момент непонятный есть: указатель - это адрес, когда говорим "указатель на функцию", адрес чего имеем ввиду? |
|
Вернуться к началу |
|
|
Adil Гость
|
Добавлено: Ср Фев 19 2003 12:28 Заголовок сообщения: Re: Кое-чего не понимаю... |
|
|
Ох, книжка про стэк? И не знаю даже. Может книжка об ассемблере... Вообще, стэк это специально отведенная область памяти для временного хранения данных, работающая по принципу F(irst)I(nput)L(ast)O(utput) - первым сунули, последним вытащили. Очень часто используется при передаче/возврате аргументов в/из функцию - в языках верхнего уровня (ех. Си) это делается "автоматом" - компилятор сам добавляет необходимые команды процессору.
Функция - это код (набор команд процессору), который, как и данные, располагается где-то в памати машины. Начало этого блока памяти и есть адрес функции. Когда ты вызываешь функцию, ты, грубо говоря, говоришь процессору: "начать выполнения кода, который лежит по определенного адреса, а именно адреса этой функции". Сишный вызов функции добавляет к этому еще и команды "покласть в стек значения аргументов, если они есть" и, главное, "покласть в стэк адрес кода, куда надо возвратиться после выполнения функции" (грубо говоря, следующий после вызова этой функции оператор). При выходе из функции этот адрес вытаскивается из стека и выполнение продолжается с него.
Вот, вкратце.
Удачи. |
|
Вернуться к началу |
|
|
|