Главная страница
    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.033 c
14-1089906817
CHES
2004-07-15 19:53
2004.08.01
Ваше отношение к советской попсе


14-1089970421
ghg
2004-07-16 13:33
2004.08.01
где инфа про компонент TShellTreeView


3-1087995153
Ata133
2004-06-23 16:52
2004.08.01
Проверка записи на уникальность


4-1087309565
Keen
2004-06-15 18:26
2004.08.01
WinAPI для USB


1-1090392773
denmin
2004-07-21 10:52
2004.08.01
Как узнать на каком Label кликнули мышью?





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