Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.10.2016, 18:00
AbNoR AbNoR вне форума
Прохожий
 
Регистрация: 13.10.2016
Сообщения: 1
Версия Delphi: Delphi XE4
Репутация: 10
Вопрос Работа с потоками

Суть такая, все знают "Сетевое окружение" в 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  
Старый 13.10.2016, 19:18
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,051
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, такое написать... полное непонимания принципа потокостроения...
1. findShare должна быть в потоке. С формой должна общаться через Synchronize.
2. execute потока должно обрабатывать сообщение о прерывании потока. Фактически, если код FindShare внести в поток, то он и будет методом Execute. Внутри цикла тогда надо обрабатывать Terminated (которое свойство).
3. Организация многих потоков. Тут есть 2 варианта. Если потоков предполагается отностительно не много (ну до 20-30), то можно просто создавать их и "бросать" - сами помрут по выполнению. Если хочется иметь возможность прервать выполнение, но потоков все-равно не очень много, то придется мудрить со списком указателей на потоки и синхронизацией между ними. Если потоков получается слишком много, то придется делать очередь заданий и пул потоков (ограниченный).
Ответить с цитированием
  #3  
Старый 14.10.2016, 07:42
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

http://stackoverflow.com/questions/3...ith-parameters
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter