![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать количество потоков работающих в данный момент времени [D6, XP]
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]>Ну, так создай специальный класс-менеджер потоков. Пускай он их и >создает и считает, при необходимости откладывая создание следующего. В >чем проблема-то?
Проблема в том, что я только недавно начал разбираться с этими потоками, и пока не знаю как это сделать. Если можете подскжите или дайте ссылочку где можно почитать как его создать этот менеджер потоков.