Главная страница
    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
Время: 1.393 c
1-1090144000
dr Tr0jan
2004-07-18 13:46
2004.08.01
Регулярные выражения


14-1089867119
Мазут Береговой
2004-07-15 08:51
2004.08.01
Целуйтесь, господа, целуйтесь... или жиром натирайтесь...


14-1089426184
Aldor_
2004-07-10 06:23
2004.08.01
В заголовках Windows.pas нет некоторых функций


4-1087916842
NOX
2004-06-22 19:07
2004.08.01
как вытащить иконку из exe-файла?


4-1087740038
Kluyg
2004-06-20 18:00
2004.08.01
Путь к папке Temp.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский