Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по потокам с использование функции GetHostByAddr   Найти похожие ветки 

 
Senti   (2004-05-28 21:49) [0]

Пишу программу, которая по определенному списку IP опеределяет имя хоста.
Делаю через потоки (т.е. проверка 1 IP в соотв потоке).
Странно, но при запуске, программа подвисает. Точнее работает но с подвисанием, этого при использованеи потоков быть не должно... В чем может быть траблы...
Вот код

// Запускаем потоки....
for i:=0 to ls.Count-1 do
begin
Application.ProcessMessages;

with THSThread.Create(True) do
  begin   Application.ProcessMessages;
   host := ls.Strings[i];
   Resume;
  end;
end;

// текст файла потока

function IPAddrToName(IPAddr: string): string;
var
 SockAddrIn: TSockAddrIn;
 HostEnt: PHostEnt;
 WSAData: TWSAData;
begin
 WSAStartup($101, WSAData);
 SockAddrIn.sin_addr.s_addr:=inet_addr(PChar(IPAddr));
 HostEnt:= GetHostByAddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
 if HostEnt<>nil then
 begin
   Result:=StrPas(Hostent^.h_name)
 end
 else
 begin
   Result:="";
 end;
end;

procedure THSThread.Execute;
begin
Synchronize(UpdateCaption);
end;

procedure THSThread.UpdateCaption;
var i: Integer;
    s,nhs : string;
begin
if fl = 1 then
nhs:=ls.Strings[pcount-1]
else nhs:=host;
s:=IPAddrToName(nhs);
Form1.re.Lines.Add(nhs);
if s <> "" then
for i:=0 to Form1.lv.Items.Count-1 do
if Form1.lv.Items.Item[i].SubItems[0] = nhs
 then Form1.lv.Items.Item[i].SubItems[2]:=s;
pcount:=pcount-1;
if fl = 1 then
Form1.pc.Caption:="Потоков "+ IntToStr(Pcount);

end;


Если я убираю Synhronize тогда программа не подвисает, но зацикливается на 1 IP адреса, т.е. во всех потоках проверяется 1 IP.

Никак не могу разобраться что делать...
Помогите чем смогите =)


 
Verg ©   (2004-05-28 22:13) [1]

WSAStartup надо делать один раз - при старте приложения, а не в каждом вызове IPAddrToName.
Synchronize заставляет выполнить главный поток указанный в ее параметрах метод. Т.о. достигается синхронизация с главным потоком, т.е. безконфликтный доступ к потоконебезопасным объектам VCL. Если помещать весь Execute потока в метод Synchronize, то весь смысл многопоточности теряется напроч, т.к. всю работу за все доп.потоки будет делать главный по-очереди.

procedure THSThread.Execute;
begin
 HostName := IPAddrToName(Host); // полезная работа
 Synchronize(UpdateCaption); // отображение рультатов
end;

procedure THSThread.UpdateCaption;
begin
  // Отображение Результатов HostName и др.
end;


 
Senti   (2004-05-28 22:19) [2]

Спасибо.. а как луше реализовать потоки ?


 
Rouse_ ©   (2004-05-29 01:06) [3]

Исключительно удивлен спокойной реакцией Андрея на данный код...

По потокам:
http://www.delphimaster.ru/articles/panov/index.html


 
Senti   (2004-05-31 11:24) [4]

Спасибо, все понял :о)



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.058 c
14-1089777472
inew
2004-07-14 07:57
2004.08.01
Как по MAC-адресу узнать какую-либо информацию о компьтере


14-1089718920
Nick-From
2004-07-13 15:42
2004.08.01
Какие проги есть, чтобы делать печати


1-1090014902
DeOptric2
2004-07-17 01:55
2004.08.01
Цвет


14-1089915556
Rouse_
2004-07-15 22:19
2004.08.01
Опрос...


14-1089830378
GeX
2004-07-14 22:39
2004.08.01
DLL with ASM + Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский