Як дізнатися кількість потоків працюючих в даний момент часу

Як дізнатися кількість потоків працюючих в даний момент часу

пардон, нафіга тобі лічильник процесів? вважай потоки. ти створюєш - ти і вважай. з Inc () і Dec () знаком?


> Обмежити їх кількість # XA0; наприклад до 16-32

користуйтеся семафор


»Не лякай людини. % -)

Хай звикає.
Я його навіть доб'ю:

Semaphore: = CreateSemaphore (nil, 4, 4, nil);

for Loop: = 0 to FDevices.Count - 1 do
# XA0; with FTask do
# XA0; # XA0; Threads.Add (TSendThread.Create (Path, FDevices [Loop], Message.Files, Settings.vCard.Get, Settings.vCard.Put, vCardFileName, Semaphore, FTask.Message.ID));

# XA0; while Threads.Count> 0 do begin
# XA0; # XA0; TThread (Threads [0]). WaitFor;
# XA0; # XA0; Threads.Delete (0);
# XA0; end;

І в потоці по завершенню:


ReleaseSemaphore (FSemaphore, 1, nil);

P.S. Тільки не питай звідки це і чому саме так. Довго буду пояснювати.

> P.S. Тільки не питай звідки це і чому саме так.
Не буду. мені і без пояснень уже страшно. % -)

> Пардон, нафіга тобі лічильник процесів? вважай потоки. ти створюєш - ти> і вважай. з Inc () і Dec () знаком?

> [6] image # XA0; (10.11.06 03:05)

Ну, так створи спеціальний клас-менеджер потоків. Нехай він їх і створює і вважає, при необхідності відкладаючи створення наступного. У чому проблема-то?

Очманіти. заховай. а краще спали.
а) на кой фіг визначати ім'я в окремому потоці, якщо пінг вже закінчено? можна той же самий використовувати;
б) зрозуміло, що в циклі. як це заважає мати лічильник?

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

# XA0; Проблема в тому, що я тільки недавно почав розбиратися з цими потоками, і поки не знаю як це зробити. Якщо можете подскжіте або дайте ссилочку де можна почитати як його створити цей менеджер потоків.

Джо, давай ти. ти порадив - ти і пояснює. % -)

> Якщо можете подскжіте або дайте ссилочку де можна почитати
> Як його створити цей менеджер потоків.

Це просто абстрактне поняття.
Сенс в тому, що при створенні потоку збільшуєш лічильник на 1. При знищенні, відповідно, на 1 зменшуєш. І все. Клас тут тільки для того, щоб ці маніпуляції зібрати в одному чіткому іменованому місці коду, він зовсім не обов'язковий і суть не в ньому.

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

а) Так дійсно
б) Я ж кажу що тільки почав вчитися роботі з потоками, тому і прошу допомоги, якщо можна хоча б натяк на те як його зробити цей лічильник

> Якщо можна хоча б натяк на те як його зробити цей лічильник

Лічильник - це змінна цілочисельного типу. Збільшити значення лічильника можна процедурою Inc або оператором +. Зменшити - оператором - або процедурою Dec. У чому ж проблема, власне?

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

перед завершенням потоку оно повинен лічильник зменшити.

Усе. для чорнової реалізації досить.

> Сенс в тому, що при створенні потоку збільшуєш лічильник на 1. При> знищення, відповідно, на 1 зменшуєш. І все. Клас тут тільки> для того, щоб ці маніпуляції зібрати в одному чіткому іменованому> місці коду, він зовсім не обов'язковий і суть не в ньому.

Добре, зі створенням зрозуміло, але тоді як дізнатися що кількість потоків зменшилася? Наскільки я розумію що вони виконуються кожен в своєму віртуальному просторі пам'яті і знати один про одного нічого не знають. Як дізнатися що якийсь потік завершився? Є якась процедура або функція?

> Наскільки я розумію що вони виконуються кожен в своєму віртуальному
> Просторі пам'яті і знати один про одного нічого не знають.

У класу TThread є подія OnTerminate.

> У класу TThread є подія OnTerminate

А як його виловити це OnTerminate

Блін, ось кістяк. Розвивай на свій розсуд.

# XA0; TThreadClass = class of TThread;

# XA0; TThreadManager = class
# XA0; private
# XA0; # XA0; FMaxThreads: Integer;
# XA0; # XA0; FThreadsCount: Integer;
# XA0; # XA0; procedure OnThreadTerminate (Sender: TObject);
# XA0; public
# XA0; # XA0; // в конструкторі задаємо дозволене у одночасно

# XA0; # XA0; // живуть потоків
# XA0; # XA0; constructor Create (AMaxThreads: Integer); reintroduce;
# XA0; # XA0; // створює потік зазначеного класу,
# XA0; # XA0; // якщо їх кількість перевищує допустимий, чекає, поки воно зменшиться
# XA0; # XA0; procedure CreateThread (AThreadClass: TThreadClass);
# XA0; end;

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

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

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

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

Не думав, що проти ночі доведеться такий жах писати.

> Не думав, що проти ночі доведеться такий жах писати.

Спасибі всім, а Джо Велике спасибі!


> Джо Велике Спасибі

Хау! Відтепер Джо отримав ім'я "Джо Велике Спасибі"! З новим хрещенням, Серьога. -) Плем'я имедж тебе не забуде. -)

Так, навіть у самому першому питанні переплутав запитав - "Підкажіть будь ласка як створити лічильник запущених процесів", здається недоперечітался

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

Як то дивно, потоки і невміння створити найелементарніший лічильник, гримаси освіти.

Природно не потрібні, це не Інді, а ICS яка спочатку не вимагає ніяких потоків, вони там шкідливі. Це асинхронні event driven компоненти - один головний потік і обробники подій, запустив і продовжуй працювати, буде подія # XA0; - отримаєш управління.

> Як то дивно, потоки і невміння створити найелементарніший лічильник,> гримаси освіти.

Хлопці, прошу не штовхати ногами, адже # XA0; я зайшов на форум для початківців! Нічого поганого в тому що люди прагнуть до знань немає. # XA0; А на рахунок лічильника (менеджера потоків) можу сказати, що найстрашнішим виявилося слово МЕНЕДЖЕР :-). Після прочитання коду (ще раз спасибі Джо), у всьому розібрався.


> Підозрюю, що і потоки ті самі тобі не потрібні - ф-ції
> Для роботи з протоколом ICMP реалізують і асинхронний варіант
> Використання.

Я теж підозрюю що за допомогою ICMP було б набагато краще, але ні де не зустрічав хорошого опису компонентів інді. В інеті багато прикладів, але там так - покладіть на форму TLabel, TMemo, TButton і скопіюйте ось цей шматок кода.Все.Программа готова. Навіть іноді і працює. А чого він там инициализирует перед використанням компонента - жодного рядка. Хочеться розібратися як це працює, а не тупо копіювати шматки коду.

+-1 це не рівень початківця, це нижче.

image # XA0; (10.11.06 19:50) [33]
З Інді теж саме - покладіть на форму компонент і наберіть даний код, якщо він взагалі потрібен.

З рештою, з розібратися простіше - все це в початкових кодах, розбирайся по саме немогу, раз таке бажання є і сили є розбиратися, ми то тут навіщо, у тебе все на твоєму комп'ютері.


> While FThreadsCount> = FMaxThreads do
> # XA0; # XA0; Application.ProcessMessages;

Завжди дивувався, як народ люіт глобальні змінні і жерти час процесора :)
Чим вам семафори не догодили? Або дядечко Біллі їх для своєї розваги придумав.

Ну
> + -1 це не рівень початківця, це нижче.

Ну зроби ті тоді форум для "Початківці починати намагатися розібратися в програмуванні на Дельфі" :-)


> Ну зроби ті тоді форум для "Початківці починати намагатися
> Розібратися в програмуванні на Дельфі ":-)

Дик вже була пропозиція - "Надмозгі".
Голосуємо! Хто за?


> Або навіть ще ближче - до коду з [4], який, як видно,
> Узятий з робочого проекту. Та тільки там йому не місце.

З АБСОЛЮТНО робітника.
І чому ж йому там не місце. Або у вас настільки равітія телепатичні здібності, що ви можете бачити ВЕСЬ код, звідки виламаний даний шматок і передбачити, що ж там все-таки робиться і чому зроблено саме так?

Хоча б тому, що блок try..finally сумно відсутня, а місць, в яких може статися exception - досить.


> Хоча б тому, що блок try..finally сумно відсутня,
> # XA0; а місць, в яких може статися exception - досить

Та НУ! Я раніше не вірив в телепатію.
Ні. Звичайно try..finally у мене відсутня. Зате є try. except. (Дивно, чи не правдалі).
Та й ще. Повірте, помилок там 100% не відбудеться, крім як потік не створиться, що ДУЖЕ МАЛО ЙМОВІРНО.

Так що - тренуємо телепатор далі.

P.S. Ніколи не робіть висновки про содердімом програми (коду) по його ДУЖЕ маленькому шматку.

То чи не приводь маленький шматок коду, приводь достатній.

Ну, а мій код був написаний і # XA0; поміщений для демонстрації того, що я "обізвав" менеджером і що є "лічильник" бо на словах це пояснити зневірився. І судити по ньому про мою любов до "глобальних змінних" - не менше смішно.


> Ну, а мій код був написаний і # XA0; поміщений для демонстрації того,
> # XA0; що я "обізвав" менеджером і що є "лічильник" бо на
> Словах це пояснити зневірився. І судити по ньому про мою любов
> До "глобальних змінних" - не менше смішно.

Дослівно написано:

> Завжди дивувався, як народ люіт глобальні змінні і
> Жерти час процесора

Причому на цьому форумі (і не тільки на жтом) це завжди видається новачкам як правильний і хороший стиль програмування контролю ресурсів. Мені просто лінь зараз всі подібні поради вигрібати. Але їх не мало.

Однак, це не є правильний і хороший стиль. Це є відсутність бажання напружитися і почитати документацію.

В догонку.
Ні в якому разі не хочу стверджувати, що мій код є правильний і хороший стиль програмування. На смак і колір.
АЛЕ! Якщо є свідомо вірне рішення, рекомендоване до використання виробником ОС, то немає підстав його не використовувати, а винаходити велосипед. Не думаю, що програмісти Microsoft дурніші за нас з вами.

P.S. якщо

> Ну, щодо любові до глобальних змінних - це до дядечка
> Борланд
,
то не бачу приводу наслідувати таку дурість без обґрунтованих причин використання глобальних змінних, так як це тягнеться з дуже давніх часів. Або Borland у нас став стандортом написання Windows додатків?

А мій поміщений, в загальному ви самі здогадалися.

А чого гадати, ви влаштували особисту переписку / перепалку

Схожі статті