Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> NetMessageBufferSend и зависание, Несуществующий IP приводит к зависанию 
:(
    Опции темы
Лис
Дата 19.9.2005, 15:16 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Доброго времени суток. Написал программу, которая использует NetMessageBufferSend для передаи сообщений. Столкнулся с проблемой, что в том случае, если IP адрес введен несуществующий, то программа зависает. Я так понимаю, ждет ответа получателя. Подскажите, пожалуйста, можно ли как-то поставить лимит на время ожидания ответа.
  Вверх
p0s0l
Дата 20.9.2005, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 1
Всего: 112



Можно попробовать в поток сунуть:
Код
procedure NetSend(p : pointer); stdcall;
begin
  NetMessageBufferSend(...);
end;

...
var h : THandle;
begin
  h := CreateThread(nil, 0, @NetSend, nil, 0, nil);
  if WaitForSingleObject(h, 5000) = WAIT_TIMEOUT then TerminateThread(h, 0);
  CloseHandle(h);
end;



--------------------
С уважением, г-н Посол.
PM   Вверх
Лис
Дата 20.9.2005, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.9.2005

Репутация: нет
Всего: нет



Спасибо за ответ. Вот что у меня получилось:

Код

procedure TForm1.SendMessageThreat;

function NetSend(p: pointer): DWORD; stdcall;
var
  IP,
  msg: string;
begin
 IP := Edit1.Text;
 msg := Edit2.Text;
 Result := NetMessageBufferSend(nil, PWideChar(WideString(IP)), nil, PWideChar(WideString(msg)), Length(msg)*2);
end;

var
  h : THandle;
  crd: cardinal;
begin
  h := BeginThread(nil, 0, @NetSend, nil, 0, crd);
  if WaitForSingleObject(h, 5000) = WAIT_TIMEOUT then TerminateThread(h, 0);
  CloseHandle(h);
end;

Программа вываливается в EAccessViolation на строке 10. Никак не могу понять, почему.
Полхоже, NetSend здесь ни при чем. Ее можно всю закомментировать - та же ошибка.

Это сообщение отредактировал(а) Лис - 20.9.2005, 11:51
PM MAIL   Вверх
p0s0l
Дата 20.9.2005, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 1
Всего: 112



Если взаимодействуешь с VCL, то надо использовать TThread и метод Synchronize, либо в конструктор потока передавать нужные данные...

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

Поэтому лучше всего перед посылкой сообщения проверить существование этого IP-адреса, пропинговать, смотри соседнюю тему...


--------------------
С уважением, г-н Посол.
PM   Вверх
Лис
Дата 21.9.2005, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.9.2005

Репутация: нет
Всего: нет



У меня была такая идея, но хотел попробовать с потоками разобраться. Спасибо за помощь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0867 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.