Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > NetMessageBufferSend и зависание


Автор: Лис 19.9.2005, 15:16
Доброго времени суток. Написал программу, которая использует NetMessageBufferSend для передаи сообщений. Столкнулся с проблемой, что в том случае, если IP адрес введен несуществующий, то программа зависает. Я так понимаю, ждет ответа получателя. Подскажите, пожалуйста, можно ли как-то поставить лимит на время ожидания ответа.

Автор: p0s0l 20.9.2005, 01:16
Можно попробовать в поток сунуть:
Код
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;

Автор: Лис 20.9.2005, 11:37
Спасибо за ответ. Вот что у меня получилось:

Код

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 здесь ни при чем. Ее можно всю закомментировать - та же ошибка.

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

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

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

Автор: Лис 21.9.2005, 11:35
У меня была такая идея, но хотел попробовать с потоками разобраться. Спасибо за помощь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)