![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потоки
Res © (2007-12-05 16:15:00)Здравствуйте! Подскажите пожалуйста как узнать количество запущенных потоков?
KSergey (2007-12-06 14:35:00) [1]> Rouse_ © (05.12.07 20:35) [22]
> > А что есть "живые потоки" в вашем понимании?
>
> Естественно есть, раз могут быть "мертвые" :)
Я имел в виду уточнить у автора что такое в его понимании "живые потоки". А то мало ли...
Впрочем, ему это все, очевидно, уже не интересно.
Dennis I. Komarov (2007-12-06 10:09:00) [2]> [21] KSergey © (05.12.07 19:06)
Розыча и Сергея М не успели туда добавить :)
Rouse_ (2007-12-05 20:35:00) [3]
> А что есть "живые потоки" в вашем понимании?
Естественно есть, раз могут быть "мертвые" :)
К примеру если смотреть в ХР (в отличие от 2000) то (начиная с оффсета в TEB fs:[124] - где лежит указатель на CurrentThread) ситуация будет выглядеть так: fs:[124] -> ThreadsProcess -> ThreadListHead будет хранить данные по всем потокам приложения выполнявшимся в течении его жизни, у них просто будет выставленно State = Terminated. Это мертвые потоки :) А живые - это те которые живые, даже если и засуспенженны :)
Вот здесь вторая глава очень интересная :)
http://www.wasm.ru/print.php?article=packers2#2
KSergey (2007-12-05 19:06:00) [4]А вообще занятно наблюдать интеллигентную беседу, простите, голубых :)
KSergey (2007-12-05 19:05:00) [5]А что есть "живые потоки" в вашем понимании?
Это к автору.
Rouse_ (2007-12-05 18:03:00) [6]
> мне необходимо узнать кол-во живых из запущенных
В смысле, засуспенден или нет?
Palladin (2007-12-05 16:47:00) [7]АФАИК, наоборот, критические секции как раз и используют их для своего внутреннего счетчика...
Джо (2007-12-05 16:41:00) [8]Хотя, скорее всего, там крит. секции используются внутри, так что иногда может и лучше это делать «руками».
Джо (2007-12-05 16:39:00) [9]Кстати, сижу щас смотрю Remarks по этим функциям. Ограничения интересные там. Лично я никогда проблем с ними не огребал, но на будущее подумаю, не использовать ли взамен InterlockedIncrementAcquire & InterlockedIncrementRelease.
Palladin (2007-12-05 16:36:00) [10]И у Рихтера тоже, насколько я помню, обсуждалось, надо глянуть...
Сергей М. (2007-12-05 16:33:00) [11]
> DrPass © (05.12.07 16:32) [12]
> здесь конфликт просто невозможен
Возможен.
Это неоднократно обсуждалось в форуме.
Сергей М. (2007-12-05 16:32:00) [12]
> Изменять ThreadCount
После модификации ThreadCount поток еще жив, игнорирование этого факта м.б. критично в ряде случаев.
DrPass (2007-12-05 16:32:00) [13]
> Юрий Зотов © (05.12.07 16:28) [7]
> Поправка:
>
> Изменять ThreadCount надо через Synchronize.
Зачем? Это ж атомарная операция, здесь конфликт просто невозможен
Юрий Зотов (2007-12-05 16:30:00) [14]> Джо © (05.12.07 16:28) [8]
Точно. Забыл о них.
Palladin (2007-12-05 16:30:00) [15]
> Юрий Зотов © (05.12.07 16:28) [7]
а можно и через InterlockedDecrement и Increment :)
res (2007-12-05 16:29:00) [16]Мне нужно если живых 0, то form1.Timer1.Enabled:=True;
Джо (2007-12-05 16:28:00) [17]> [5] Юрий Зотов © (05.12.07 16:26)
InterlockedIncrement
InterlockedDecrement.
Юрий Зотов (2007-12-05 16:28:00) [18]Поправка:
Изменять ThreadCount надо через Synchronize.
Сергей М. (2007-12-05 16:27:00) [19]Ну, предположим, ты сделал перекличку "живых".
Что дальше ? Какова цель прведения этой "переклички" (или, если угодно, ревизии) ?
Юрий Зотов (2007-12-05 16:26:00) [20]> res (05.12.07 16:22) [4]
var
ThreadCount: integer = 0;
procedure TMyThread.Execute;
begin
Inc(ThreadCount);
try
....
finallly
Dec(ThreadCount);
end
end;