Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.12.2009, 07:51
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
Вопрос Потоки... Потоки... Очень Много Потоков...

Многопоточность... Это уже все понятно... В интернете куча примеров... Сам реализовывал такие программы... Находил что новое понимал... А вот сдесь столкнулся с реальной проблемой... И так...
Есть приложение которое должно выполнить цикл и создать ну например ~ 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  
Старый 31.12.2009, 13:24
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

На каждый поток ОС создает свой хэндл, а их количество намного меньше виртуальной памяти.
К тому же при переключении на другие потоки сохраняются регистры и состояние процессора ( не в файл же подкачки ).
Интересно при таком количестве потоков система сможет еще чтонибуть делать кроме переключения между ними?
Вот пару ссылок
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
Ответить с цитированием
  #3  
Старый 31.12.2009, 17:52
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

Че то, как то не верю я... Что количество потоков зависит от максимального количества хэндлов... Тогда как быть с сервером Apache например?!! Неужели максимальное количество подключившихся клиентов равна ~2000??? Или я че то непонимаю???
Ответить с цитированием
  #4  
Старый 31.12.2009, 19:04
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от Romix
Че то, как то не верю я... Что количество потоков зависит от максимального количества хэндлов... Тогда как быть с сервером Apache например?!! Неужели максимальное количество подключившихся клиентов равна ~2000??? Или я че то непонимаю???
Это уже совсем другая история. Подробно не скажу. Но все зависит и от времени обработки одного запроса ( постоянное соединение не поддерживается в таких случаях ), создается пул потоков, в каждом потоке очередь обслуживания запросов, далее механизм перенаправления на менее загруженный сервер ( посмотрите, что написано на однокласниках вместо www - каждая комбинация свой сервер и не уверен что один ). Лучше эту инфу погуглить, поискать.
Ответить с цитированием
  #5  
Старый 31.12.2009, 19:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

По некоторым экспериментам несколько раз назад, уже при 500 потоках комп начинает жутко тормозить и эффективность падает до нуля. Если правильно помню MSDN, то Microsoft не рекомендует делать больше 50 потоков в одном придожении.
Ответить с цитированием
  #6  
Старый 02.01.2010, 04:42
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

Как найду решение, сразу же сообщу... А пока буду искать... Спасибо Вам, за то что направили Меня...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:29.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter