Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.01;
Скачать: CL | DM;

Вниз

Вопрос по потокам с использование функции 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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.032 c
9-1081717014
Werwolf
2004-04-12 00:56
2004.08.01
Продолжение темы "Пиратов бесконечности"


6-1086254122
t100
2004-06-03 13:15
2004.08.01
Прием почты.


14-1089734627
Серый вильк
2004-07-13 20:03
2004.08.01
Я рад


14-1089960179
Nikon777777
2004-07-16 10:42
2004.08.01
Реально ли написать программку?


1-1089880048
Ш-К
2004-07-15 12:27
2004.08.01
Как отключить warning?