Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Размер стека потока


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.

А что тебя так заботит этот вопрос ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо