Суть такая, все знают "Сетевое окружение" в Windows, пишу нечто похоже. "Вытаскивать" пути к общим папкам решил потоками.
Немного кода:
Процедура "ищет" на компе "HostName" папки с общим доступом и выводит их в Memo:
Код:
procedure TForm1.FindShare(HostName:String);
var hNetEnum: THandle;
NetContainerToOpen: NETRESOURCE;
ResourceBuffer: array[1..2000] of TNetResource;
i,ResourceBuf,entriesToGet: DWORD;
begin
NetContainerToOpen.dwScope:=RESOURCE_GLOBALNET;
NetContainerToOpen.dwType:=RESOURCETYPE_ANY;
NetContainerToOpen.lpLocalName:=nil;
NetContainerToOpen.lpRemoteName:= PChar('\\'+HostName);
NetContainerToOpen.lpProvider:=nil;
WNetOpenEnum (RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_CONNECTABLE or REsOURCEUSAGE_CONTAINER,
@NetContainerToOpen, hNetEnum);
Form1.Memo1.Lines.Add(HostName);
while TRUE do
begin
ResourceBuf:= sizeof(ResourceBuffer);
EntriesToGet:= 2000;
if (NO_ERROR <> WNetEnumResource(hNetEnum, EntriesToGet,
@ResourceBuffer,ResourceBuf)) then
begin
WNetCloseEnum(hNetEnum);
exit;
end;
for i:=1 to EntriesToGet do
Form1.Memo1.Lines.Add(string(ResourceBuffer[i].lpRemoteName));
end;
end;
По щелчку на кнопке в цикле создаю потоки:
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var i:byte;
begin
for i := 0 to 13 do
Begin
MyThread:=TMyThread.Create('192.168.0.'+IntToStr(i));
MyThread.FreeOnTerminate := True;
MyThread.Priority:=tpLower;
End;
end;
Сам поток:
Код:
procedure TMyThread.Execute;
begin
while not Terminated do
begin
Form1.FindShare(HostName);
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
end;
end;
Вроде всё нужное мне выводится, но остаётся вопрос с потоками, не пойму завершается поток (или как назвать). В мониторе ресурсов после нажатия на кнопку вижу, что потоки создались, но после выведения ими инфы они так и остаются.
Думаю понятно, что если прогонять весь диапазон ip, то потоков будет много +прогоняться будет по тайменгу.
Опыта с потоками нет, в гугле не забанен, но ответа найти не могу
Посоветуйте как быть.