Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Хочу создать новый поток... не получается

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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?если ты создаешь поток методом какого либо класса, для того, чтобы получить доступ к методам этого класса из потока...
Попробуй... я сам так сейчас делаю, работаю с сокетами и портами... Очень удобно. Wink))
Счастливо.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Ilya
Гость





СообщениеДобавлено: Ср Фев 19 2003 12:10    Заголовок сообщения: Кое-чего не понимаю... Ответить с цитатой

К сожалению, я нахожусь в том "программистком возрасте", когда слове стэк вызывает некоторый страх.
Посоветуйте!!! Книжку какую или статью, чтобы это исправить. Лучше (дешевле) было бы, если бы она была в электроном виде.

И ещё один момент непонятный есть: указатель - это адрес, когда говорим "указатель на функцию", адрес чего имеем ввиду?
Вернуться к началу
Ilya
Гость





СообщениеДобавлено: Ср Фев 19 2003 12:10    Заголовок сообщения: Кое-чего не понимаю... Ответить с цитатой

К сожалению, я нахожусь в том "программистком возрасте", когда слове стэк вызывает некоторый страх.
Посоветуйте!!! Книжку какую или статью, чтобы это исправить. Лучше (дешевле) было бы, если бы она была в электроном виде.

И ещё один момент непонятный есть: указатель - это адрес, когда говорим "указатель на функцию", адрес чего имеем ввиду?
Вернуться к началу
Adil
Гость





СообщениеДобавлено: Ср Фев 19 2003 12:28    Заголовок сообщения: Re: Кое-чего не понимаю... Ответить с цитатой

Ох, книжка про стэк? И не знаю даже. Может книжка об ассемблере...
Вообще, стэк это специально отведенная область памяти для временного хранения данных, работающая по принципу F(irst)I(nput)L(ast)O(utput) - первым сунули, последним вытащили. Очень часто используется при передаче/возврате аргументов в/из функцию - в языках верхнего уровня (ех. Си) это делается "автоматом" - компилятор сам добавляет необходимые команды процессору.

Функция - это код (набор команд процессору), который, как и данные, располагается где-то в памати машины. Начало этого блока памяти и есть адрес функции. Когда ты вызываешь функцию, ты, грубо говоря, говоришь процессору: "начать выполнения кода, который лежит по определенного адреса, а именно адреса этой функции". Сишный вызов функции добавляет к этому еще и команды "покласть в стек значения аргументов, если они есть" и, главное, "покласть в стэк адрес кода, куда надо возвратиться после выполнения функции" (грубо говоря, следующий после вызова этой функции оператор). При выходе из функции этот адрес вытаскивается из стека и выполнение продолжается с него.

Вот, вкратце.

Удачи.
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...