|
#1
|
|||
|
|||
Работа с потоками
Суть такая, все знают "Сетевое окружение" в 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, то потоков будет много +прогоняться будет по тайменгу. Опыта с потоками нет, в гугле не забанен, но ответа найти не могу Посоветуйте как быть. |
#2
|
|||
|
|||
Ну, такое написать... полное непонимания принципа потокостроения...
1. findShare должна быть в потоке. С формой должна общаться через Synchronize. 2. execute потока должно обрабатывать сообщение о прерывании потока. Фактически, если код FindShare внести в поток, то он и будет методом Execute. Внутри цикла тогда надо обрабатывать Terminated (которое свойство). 3. Организация многих потоков. Тут есть 2 варианта. Если потоков предполагается отностительно не много (ну до 20-30), то можно просто создавать их и "бросать" - сами помрут по выполнению. Если хочется иметь возможность прервать выполнение, но потоков все-равно не очень много, то придется мудрить со списком указателей на потоки и синхронизацией между ними. Если потоков получается слишком много, то придется делать очередь заданий и пул потоков (ограниченный). |
#3
|
||||
|
||||
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |