Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Как купить рекламу на форуме


Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 20000 рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2011, 22:50   #1
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
Печаль Многопоточность

Доброго времени суток! Осваиваю потоки. При работе с некоторыми функциями из потока прога пишет еррор из разряда "отказано в доступе". Я не знаю уже, что надо ей, помогите, плз...

Код:
program threads;

uses windows, classes, dialogs, sysutils, winsock;

//функция вычисления ипа по имени хоста
function GetIPAddress(Name:String): string;
var
 *p : PHostEnt;
begin
 *p := GetHostByName(PChar(Name));
 *Result := inet_ntoa(PInAddr(p.h_addr_list^)^);
end;

//тело нашего потока
procedure ThreadFunc;
var i:integer;
begin
//showmessage('test'); - отказано в доступе
//GetIPAddress('mail.ru'); - примерно тоже самое
endthread(0); // выходим из потока.
end;

var tid1,tid2,id:longword;
begin
tid1:=beginthread(nil,0,Addr(ThreadFunc),nil,0,id); //запускаем функцию ThreadFunc в потоке
//tid2:=beginthread(nil,0,Addr(ThreadFunc),nil,0,id); //в tid2 присваиваем Идентификатор потока, который пригодится позже.
end.
Это весь код. Две подряд закомментированные строчки и есть те функции, вызвав из потока которые прога начинает сбоить. ШоуМессадж мне нафиг не нужен, но хотелось бы понять, что не так я сделал или где что не объявил. Спасибо, буду рад помощи :unsure:
WennY вне форума Ответить с цитированием
Старый 22.04.2011, 22:54   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

а вы почитайте какой прототип должна иметь функция потока.
кстати, а разве Addr есть?
вроде ж всегда @ было взятием адреса.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.04.2011, 22:57   #3
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
кстати, а разве Addr есть?
Ну а то =) Можете сами попробовать, код вполне рабочий
WennY вне форума Ответить с цитированием
Старый 22.04.2011, 23:02   #4
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
какой прототип должна иметь функция потока
Каюсь... но ничего не могу внятного нарыть в хухле
WennY вне форума Ответить с цитированием
Старый 22.04.2011, 23:07   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

1)прототип функции потока таков:
Код:
function ThreadFunc(data:pointer):integer;stdcall;
2)главный поток то не забывайте, он завершает приложение(изза этого тоже вылетает)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 22.04.2011 в 23:19.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.04.2011, 23:10   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
ничего не могу внятного нарыть в хухле
Надо же быть настолько бестолочью, чтобы где-то что-то там "рыть" в каком-то "хухле", в то время как прототип функции лежит ПРЯМО ПЕРЕД НОСОМ - в СТАНДАРТНОМ юните Classes..

Гы)
mss вне форума Ответить с цитированием
Старый 22.04.2011, 23:13   #7
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
изза этого и вылетает, ибо идет попытка возврата в никуда
Ну это ты ересь несешь)

Соглашение - дифолтное, то бишь pascal fastcall.
Значит параметр data передается через регистр.
Ибо он единственный.
А по соглашению pascal fastcall три (или менее) первых параметра, если оные имеются, могут быть переданы (по значению или по ссылке) через РОН eax, edx и ecx. Все прочее хозяйство, если оно имеется, будет передано через стек ВНЕ зависимости от соглашения.

Последний раз редактировалось mss; 22.04.2011 в 23:24.
mss вне форума Ответить с цитированием
Старый 22.04.2011, 23:18   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

ну да, чето перепутал малость.
исправил пост.
хотя изза этого вылетать тоже может.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.04.2011, 23:29   #9
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
//showmessage('test'); - отказано в доступе
//GetIPAddress('mail.ru'); - примерно тоже самое
endthread(0); // выходим из потока.
За ШоуМесседж и за ЭндТред - пожизненный эцих с гвоздями.
За ГетАйПиЭддрэсс - понятия не имею что это за шняга. Но возможно ее и следует ковырять на предмет кривости.

Все остальное оставшееся никак не может уронить ЭТОТ тред.
mss вне форума Ответить с цитированием
Старый 22.04.2011, 23:35   #10
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
За ШоуМесседж
Я его юзаю на стадии тестов, в основном проекте если чо и надо выводить, то стараюсь делать это на winapi.

Цитата:
Сообщение от mss Посмотреть сообщение
ГетАйПиЭддрэсс - возможно ее и следует ковырять на предмет кривости.
Да собсно вот она:
Код:
function GetIPAddress(Name:String): string;
var
  p : PHostEnt;
begin
  p := GetHostByName(PChar(Name));
  Result := inet_ntoa(PInAddr(p.h_addr_list^)^);
end;
Гвоздь программы - строка inet_ntoa(PInAddr(p.h_addr_list^)^) . На неё указывает компилер после вылета

Цитата:
Сообщение от mss Посмотреть сообщение
Все остальное оставшееся никак не может уронить ЭТОТ тред.
А оно и не роняет =)
WennY вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность и с++ Koshmarovsky Visual C++ 13 06.09.2010 19:39
многопоточность DeDoK Общие вопросы Delphi 6 01.08.2010 01:14
Многопоточность kroŧ Общие вопросы Delphi 5 21.06.2010 09:47
Многопоточность JakSon Общие вопросы Delphi 10 27.12.2009 02:19
Многопоточность. newmister Общие вопросы Delphi 9 24.07.2009 11:54


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS