![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Размер стека потока
BSD © (2002-10-31 10:07:00)Подскажите плз как уменьшить размер стека у TThred-a, ведь по умолчанию 1Mb.
Digitman (2002-10-31 16:27:00) [1]>Сахаров Сергей
Ну это - да, не спорю.
Есть, кстати, еще один вариант.
Не самый простой, наверно, но по кр.мере - без всякой "переделки" борландовских модулей.
Скажем, можно перехватить локально (в контексте тек.процесса) импорт/экспорт kernel-ф-ции CreateThread() и подставить там , в теле ф-ции перехвата, в кач-ве параметров все, что заблагорассудится.
Сахаров Сергей (2002-10-31 16:10:00) [2]>Digitman
Тогда изменится стандартный интерфейс создания потоков на основе TThread, что не есть хорошо. Может возникнуть несовместимость с существующими классами и т.п. (если и там использовать модифицированный модуль).
Digitman (2002-10-31 15:30:00) [3]>Сахаров Сергей
Ради такой цели , коль уж модули править, достаточно всего лишь добавить в конструктор параметр, значение которого будет передано в BeginThread() в части указания о стеке.
Сахаров Сергей (2002-10-31 14:33:00) [4]Немного недописал, что нужно сделать до.
1) Для таких случаев (изменение поведения) я имею подправленную копию стандартных модулей. (Можете кинуть в меня чем-нибудь).
2) Делаю private -> protected (для доступа FNameField);
3) Нужные методы -> virtual (Create, например);
4) Декларации внутренних глобальных процедур -> в раздел interface ( в данном случае AddThread, ThreadProc);
5) Пользуюсь.
Получается не универсально, но терпимо.
Digitman (2002-10-31 13:28:00) [5]>Сахаров Сергей
Ты хоть сориентировался бы по тексту, прежде чем давать заведомо невыполнимую рекомендацию)
Это даже скомпилировано не будет.
Сахаров Сергей (2002-10-31 13:11:00) [6]Перекрыть в наследнике класса конструктор (reintroduce), скопировать туда текст из стандартного конструктора TThread, изменить второй параметр функции BeginThread с 0 на нужное число.
Работать должно.
BSD (2002-10-31 11:51:00) [7]Необходимость пересматривал. Пока ничего лучше придумать не смог.
Насчет CreateIoCompletionPort, GetQueuedCompletionStatus, PostQueuedCompletionStatus почитаем. Спасибо!
Александр Спелицин (2002-10-31 11:33:00) [8]Для вашего случая вмесно большого числа потоков подойдут порты завершения ввода-вывода. См. CreateIoCompletionPort, GetQueuedCompletionStatus, PostQueuedCompletionStatus. Правда в MSDN это толком не описано, так что рекомендую почитать Рихтера: Программирование серверных приложений для MS Windows 2000. Там это подробно описано.
Digitman (2002-10-31 11:25:00) [9].. или пересмотреть концептуально необходимость и правильность использования большого числа доп.код.потоков в процессе
BSD (2002-10-31 10:56:00) [10]Да в принципе никаких... Думал может как то уменьшить можно не делая свой TThread.
Digitman (2002-10-31 10:51:00) [11]
> так он больше 20 метров памяти и скушал
Ну и что ? да хоть 200 ! память-то аиртуальная)
Какие конкретные проблемы в связи с этим возникают ?
BSD (2002-10-31 10:43:00) [12]Да вот забацал сервис, в котором создается много потоков,
так он больше 20 метров памяти и скушал, хотя памяти сама прога использует не очень много. Как то нехорошо получается:(
Digitman (2002-10-31 10:40:00) [13]Конкретно для код.потока, управляемого классом TThread - никак. Вызов BeginThread() жестко "прошит" в конструкторе класса, а поведением конструктора ты управлять не сможешь. По кр.мере - в Д5.
А что тебя так заботит этот вопрос ?