Главная страница
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.044 c
4-1087916842
NOX
2004-06-22 19:07
2004.08.01
как вытащить иконку из exe-файла?


1-1090401135
glGLU
2004-07-21 13:12
2004.08.01
invalid pointer operation


4-1087899963
init13
2004-06-22 14:26
2004.08.01
температура процессора, и др. термодатчиков


3-1089209563
djoni21
2004-07-07 18:12
2004.08.01
Как перекомпелировать dll под Linux


1-1089805982
NJoe
2004-07-14 15:53
2004.08.01
потоки и записи