Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать количество потоков работающих в данный момент времени [D6, XP]


Страницы:   1 2 3

image ©   (2006-11-10 01:53:00) 

При написании многопотокового сканера сети, столкнулся с такой проблеммой. Программа создает 255 потоков, которые производят пинг (использую библиотеку компонентов ics - Ping). За 2-3 сек выводит IP-адреса найденных ПК, Timeout-ы и имена ПК, но результаты нестабильные, создается впечатление что потоки мешают друг другу.     Нестабильность проявляется в том, что количество найденных ПК колеблется, и чем слабее ПК, тем больше разница.  Я думаю что необходимо проконтролировать количество одновременно запущенных потоков, т.е. ограничить их количество  например до 16-32, но незнаю как это сделать. Подскажите пожалуйста как создать счетчик запущенных процессов


MetalFan   (2006-11-10 09:06:00) [21]

про потоки вроде неплохая статейка
http://forum.vingrad.ru/topic-60076.html


Anatoly Podgoretsky   (2006-11-10 08:45:00) [22]

> Сергей М.  (10.11.2006 08:35:27)  [27]

Естественно не нужны, это не Инди, а ICS которая изначально не требует никаких потоков, они там вредны. Это асинхронные event driven компоненты - один главный поток и обработчики событий, запустил и продолжай работать, будет событие  - получишь управление.


Anatoly Podgoretsky   (2006-11-10 08:42:00) [23]

> Ketmar  (10.11.2006 04:14:25)  [25]

Как то странно, потоки и неумение создать элементарнейший счетчик, гримасы образования.


Сергей М.   (2006-11-10 08:35:00) [24]


> image   (10.11.06 04:31) [26]


Подозреваю, что и потоки те самые тебе не нужны - ф-ции для работы с протоколом ICMP реализуют и асинхронный вариант использования.


image   (2006-11-10 04:31:00) [25]

Да, даже в самом первом вопросе перепутал спросил - "Подскажите пожалуйста как создать счетчик запущенных процессов ", кажется недоперечитался


Ketmar   (2006-11-10 04:14:00) [26]

>[17] image 10-Nov-2006, 03:40
>они выполняются каждый в своем виртуальном пространстве
неверно понимаешь. путаешь их с процессами.


image   (2006-11-10 04:09:00) [27]

Шутники однако :-)))


Джо   (2006-11-10 04:07:00) [28]

> [22] Германн ©   (10.11.06 04:04)
> Хау! Отныне Джо получил имя "Джо Большое Спасибо"! С новым
> крещением, Серёга. :-) Племя имеджа тебя не забудет. :-)

Еду в Папу-Новую Гвинею! :D


Германн   (2006-11-10 04:04:00) [29]


> Джо Большое Спасибо

Хау! Отныне Джо получил имя "Джо Большое Спасибо"! С новым крещением, Серёга. :-) Племя имеджа тебя не забудет. :-)


image   (2006-11-10 03:53:00) [30]

>Не думал, что на ночь глядя придется такой ужас писать.

Спасибо всем, а Джо Большое Спасибо!


Джо   (2006-11-10 03:50:00) [31]

Блин, вот костяк. Развивай на свое усмотрение.

type

 TThreadClass = class of TThread;

 TThreadManager = class
 private
   FMaxThreads: Integer;
   FThreadsCount: Integer;
   procedure OnThreadTerminate (Sender: TObject);
 public
   // в конструкторе задаем допустимое кол-во одновременно
   // живущих потоков
   constructor Create (AMaxThreads: Integer); reintroduce;
   // создает поток указанного класса,
   // если их кол-во превышает допустимое, ждет, пока оно уменьшится
   procedure CreateThread (AThreadClass: TThreadClass);
 end;

implementation
uses Forms;

{ TThreadManager }

constructor TThreadManager.Create(AMaxThreads: Integer);
begin
 inherited Create();
 FMaxThreads := AMaxThreads;
 FThreadsCount := 0;
end;

procedure TThreadManager.CreateThread(AThreadClass: TThreadClass);
var
 ANewThread: TThread;
begin
 while FThreadsCount >= FMaxThreads do
   Application.ProcessMessages;

 InterlockedIncrement(FThreadsCount);
 ANewThread := AThreadClass.Create(True);
 ANewThread.OnTerminate := OnThreadTerminate;
 ANewThread.Resume;
end;

procedure TThreadManager.OnThreadTerminate (Sender: TObject);
begin
 InterlockedDecrement(FThreadsCount)
end;

Не думал, что на ночь глядя придется такой ужас писать.


image   (2006-11-10 03:50:00) [32]

>У класса TThread есть событие OnTerminate

А как его выловить это OnTerminate


Джо   (2006-11-10 03:47:00) [33]

> Насколько я понимаю что они выполняются каждый в своем виртуальном
> пространстве памяти и знать друг о друге ничего не знают.

У класса TThread есть событие OnTerminate.


image   (2006-11-10 03:40:00) [34]

>Смысл в том, что при создании потока увеличиваешь счетчик на 1. При >уничтожении, соответственно, на 1 уменьшаешь. И все. Класс тут только >для того, чтобы эти манипуляции собрать в одном четком именованном >месте кода, он вовсе не обязателен и суть не в нем.

Хорошо, с созданием понятно, но тогда как узнать что количество потоков уменьшилось? Насколько я понимаю что они выполняются каждый в своем виртуальном пространстве памяти и знать друг о друге ничего не знают. Как узнать что какой то поток завершился? Есть какая то процедура или функция?


Ketmar   (2006-11-10 03:37:00) [35]

а как делаются счётчики? путём объявления переменной с типом, например, Integer. а потом -- Inc() и Dec(). а точнее -- InterlockedIncrement() и InterlockedDecrement(), чтобы совсем уж безопасно было.

логично, что перед созданием нового потока надо проверить значение счётчика, и если возможно, то: счётчик увеличить; поток создать.
если невозможно -- ждать, пока станет возможно.

перед завершением потока оный должен счётчик уменьшить.

всё. для черновой реализации достаточно.


Джо   (2006-11-10 03:36:00) [36]

> если можно хотябы намек на то как его сделать этот счетчик

Счетчик — это переменная целочисленного типа. Увеличить значение счетчика можно процедурой Inc или оператором +. Уменьшить — оператором - или процедурой Dec. В чем же проблема, собственно?


image   (2006-11-10 03:33:00) [37]

<обалдеть. спрячь. а лучше сожги.
<а) на кой фиг определять имя в отдельном потоке, если пинг уже <закончен? можно тот же самый использовать;
<б) понятно, что в цикле. как это мешает иметь счётчик?

а) Да действительно
б) Я же говорю что только начал учиться работе с потоками, поэтому и прошу помощи, если можно хотябы намек на то как его сделать этот счетчик


Джо   (2006-11-10 03:25:00) [38]

> Если можете подскжите или дайте ссылочку где можно почитать
> как его создать этот менеджер потоков.

Это просто абстрактное понятие.
Смысл в том, что при создании потока увеличиваешь счетчик на 1. При уничтожении, соответственно, на 1 уменьшаешь. И все. Класс тут только для того, чтобы эти манипуляции собрать в одном четком именованном месте кода, он вовсе не обязателен и суть не в нем.


Ketmar   (2006-11-10 03:24:00) [39]

Джо, давай ты. ты посоветовал -- ты и поясняй. %-)


image   (2006-11-10 03:18:00) [40]

>Ну, так создай специальный класс-менеджер потоков. Пускай он их и >создает и считает, при необходимости откладывая создание следующего. В >чем проблема-то?

 Проблема в том, что я только недавно начал разбираться с этими потоками, и пока не знаю как это сделать. Если можете подскжите или дайте ссылочку где можно почитать как его создать этот менеджер потоков.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо