![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать количество потоков работающих в данный момент времени [D6, XP]
image © (2006-11-10 01:53:00)При написании многопотокового сканера сети, столкнулся с такой проблеммой. Программа создает 255 потоков, которые производят пинг (использую библиотеку компонентов ics - Ping). За 2-3 сек выводит IP-адреса найденных ПК, Timeout-ы и имена ПК, но результаты нестабильные, создается впечатление что потоки мешают друг другу. Нестабильность проявляется в том, что количество найденных ПК колеблется, и чем слабее ПК, тем больше разница. Я думаю что необходимо проконтролировать количество одновременно запущенных потоков, т.е. ограничить их количество например до 16-32, но незнаю как это сделать. Подскажите пожалуйста как создать счетчик запущенных процессов
Джо (2006-11-10 03:16:00) [41]> [9] Ketmar © (10.11.06 03:13)
> всё б тебе классами делать...
А мне — нравится! ;-p
Ketmar (2006-11-10 03:13:00) [42]>[7] Джо(c) 10-Nov-2006, 03:11
>Ну, так создай специальный класс-менеджер потоков.
всё б тебе классами делать... %-) я вот в DarkEyeProxy безо всяких классов обошёлся -- и ничего. %-)
Ketmar (2006-11-10 03:12:00) [43]обалдеть. спрячь. а лучше сожги.
а) на кой фиг определять имя в отдельном потоке, если пинг уже закончен? можно тот же самый использовать;
б) понятно, что в цикле. как это мешает иметь счётчик?
Джо (2006-11-10 03:11:00) [44]> [6] image (10.11.06 03:05)
Ну, так создай специальный класс-менеджер потоков. Пускай он их и создает и считает, при необходимости откладывая создание следующего. В чем проблема-то?
image (2006-11-10 03:05:00) [45]>пардон, нафига тебе счётчик процессов? считай потоки. ты создаёшь -- ты >и считай. с Inc() и Dec() знаком?
Дело в том, что потоки у меня создаются в цикле, вводишь диапазон адресов и пуск, а я хочу сделать так, чтобы можно было контролировать количество создаваемых потоков. Создал 16 потоков ждешь. Как только один поток из 16 отработал, тут же создаешь следующий.
И там у меня еще если ПК найден, то тут же создается поток, который определяет имя ПК. Получается если найдено 255 ПК то создаются 255 потоков определяющих их имена. 500 потоков многовато.
Ketmar (2006-11-10 02:56:00) [46]>[4] MikePetrichenko(c) 10-Nov-2006, 02:48
>Я его даже добью:
"голосы за кадром: убыв, убыв!" (ц) Л.П.
>P.S. Только не спрашивай откуда это и почему именно так.
не буду. мне и без пояснений уже страшно. %-)
MikePetrichenko (2006-11-10 02:48:00) [47]
> не пугай человека. %-)
Хай привыкает.
Я его даже добью:
Semaphore := CreateSemaphore(nil, 4, 4, nil);
for Loop := 0 to FDevices.Count - 1 do
with FTask do
Threads.Add(TSendThread.Create(Path, FDevices[Loop], Message.Files, Settings.vCard.Get, Settings.vCard.Put, vCardFileName, Semaphore, FTask.Message.ID));
while Threads.Count > 0 do begin
TThread(Threads[0]).WaitFor;
Threads.Delete(0);
end;
CloseHandle(Semaphore);
И в потоке по завершению:
ReleaseSemaphore(FSemaphore, 1, nil);
P.S. Только не спрашивай откуда это и почему именно так. Долго буду объяснять.
Ketmar (2006-11-10 02:41:00) [48]>[2] MikePetrichenko(c) 10-Nov-2006, 02:38
>Пользуй семафор
не пугай человека. %-)
MikePetrichenko (2006-11-10 02:38:00) [49]
> ограничить их количество например до 16-32
Пользуй семафор
Ketmar (2006-11-10 02:31:00) [50]пардон, нафига тебе счётчик процессов? считай потоки. ты создаёшь -- ты и считай. с Inc() и Dec() знаком?