Як дізнатися кількість потоків працюючих в даний момент часу
пардон, нафіга тобі лічильник процесів? вважай потоки. ти створюєш - ти і вважай. з 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 додатків?
А мій поміщений, в загальному ви самі здогадалися.
А чого гадати, ви влаштували особисту переписку / перепалку