Форум: "Сети";
Текущий архив: 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