|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Потоки... Потоки... Очень Много Потоков...
Многопоточность... Это уже все понятно... В интернете куча примеров... Сам реализовывал такие программы... Находил что новое понимал... А вот сдесь столкнулся с реальной проблемой... И так...
Есть приложение которое должно выполнить цикл и создать ну например ~ 10000 потоков которые будут че то делать... Вот примерный пример кода: Код:
type TT = class(TThread) private URLRW: String; PSRW: String; PPRW: Integer; protected procedure Execute; Override; public property URL: String read URLRW write URLRW; property PS: String read PSRW write PSRW; property PP: Integer read PPRW write PPRW; end; procedure TT.Execute; begin Sleep(99999); end; procedure TMainForm.Button1Click(Sender: TObject); var T: TT; I: Integer; begin for I:=0 to 10000 do begin T:=TT.Create(True); T.FreeOnTerminate:=True; T.OnTerminate:=DoneTerminate; T.Resume; MainForm.Caption:=IntToStr(I); Application.ProcessMessages; end; end; В данном примере, поток создается и "СПИТ"... Создание идет до ~2000 потока хорошо а потом вылетает ошибка "Thread creation error: Недостаточно памяти для обработки команды"... Где то слышал что под поток Windows выделяет определенное количество памяти... Так вот... Если это так... Можно ли изменить это??? Например выделить больше памяти... Или меньше... Ну не верю я просто что 2Гб оперативной и 2Гб виртуальной памяти не хватает для 3000 потоков... Можно подсчитать... 4000Мб / 2000Потоков = 2Мб на пустой поток... Но если верить "диспетчеру задач"... То на 2010 созданных потоков, расходуется 21Мб оперативной и 51Мб виртуальной памяти... Так как же все таки изменить размеры памяти выделяемой для потока??? Или как создать например 20000 потоков??? Уверен "железо" позволяет... Буду рад Любым Мыслям... Заранее огромное спасибо... |
#2
|
||||
|
||||
На каждый поток ОС создает свой хэндл, а их количество намного меньше виртуальной памяти.
К тому же при переключении на другие потоки сохраняются регистры и состояние процессора ( не в файл же подкачки ). Интересно при таком количестве потоков система сможет еще чтонибуть делать кроме переключения между ними? Вот пару ссылок http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx |
#3
|
|||
|
|||
Че то, как то не верю я... Что количество потоков зависит от максимального количества хэндлов... Тогда как быть с сервером Apache например?!! Неужели максимальное количество подключившихся клиентов равна ~2000??? Или я че то непонимаю???
|
#4
|
||||
|
||||
Цитата:
|
#5
|
|||
|
|||
По некоторым экспериментам несколько раз назад, уже при 500 потоках комп начинает жутко тормозить и эффективность падает до нуля. Если правильно помню MSDN, то Microsoft не рекомендует делать больше 50 потоков в одном придожении.
|
#6
|
|||
|
|||
Как найду решение, сразу же сообщу... А пока буду искать... Спасибо Вам, за то что направили Меня...
|