Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2011, 14:22   #11
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

в гугле по ним инфы рускоязычной не нашел... может кто-нибудь знает хорошие статьи по IOCP? Спасибо.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 05.09.2011, 14:30   #12
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

http://www.ozon.ru/context/detail/id/124189/
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 05.09.2011, 15:11   #13
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

спасибо, посмотрим
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 03.12.2011, 21:06   #14
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Ап.
Может кому пригодится информация, как можно увеличить число одновременно запущенных потоков в 32-разрядной ОС:

1. Сделать копии модулей Classes.pas и SyncObjs.pas в отдельную папку (модули должны лежать в одной папке).

2. В Classes.pas заменить конструктор класса TThread на следующий код:
Код:
constructor Create(CreateSuspended: Boolean; const AThrSize: Word = 1024); overload;
...
constructor TThread.Create(CreateSuspended: Boolean; const AThrSize: Word = 1024);
{$IFDEF POSIX}
var
  ErrCode: Integer;
{$ENDIF}
begin
  inherited Create;
  FSuspended := CreateSuspended and not FExternalThread;
  FCreateSuspended := CreateSuspended and not FExternalThread;
  if not FExternalThread then
  begin
{$IFDEF MSWINDOWS}
    if AThrSize = 1024 then
      FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID)
    else
      FHandle := BeginThread(nil, AThrSize*1024, @ThreadProc, Pointer(Self), CREATE_SUSPENDED or $10000, FThreadID);
    if FHandle = 0 then
      raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]);
{$ENDIF}
{$IFDEF POSIX}
{$IFDEF LINUX}
    sem_init(FCreateSuspendedSem, False, 0);
{$ELSE}
    MPCreateEvent(FCreateSuspendedEvent);
{$ENDIF}
    ErrCode := BeginThread(nil, @ThreadProc, Pointer(Self), FThreadID);
    if ErrCode <> 0 then
      raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(ErrCode)]);
{$ENDIF}
  end else
  begin
{$IFDEF MSWINDOWS}
    FHandle := Windows.GetCurrentThread;
{$ENDIF}
    FThreadId := GetCurrentThreadId;
  end;
end;
3. В своих программах явно указывать модифицированный модуль Classes.pas в секции uses проектного dpr-файла.

Если в ваших программах вызвать конструктор потока без второго параметра (это размер стека потока в кб), то работает встроенный конструктор, который по умолчанию резервирует стек в 1мб + 256кб на дополнительные данные (зависит от версии Windows). Например, если создать поток, вызвав такой конструктор:
Код:
  MyThr:=TThread.Create(False,128);
то максимальное число потоков возрастет с обычных 1500-2000 до 5000-7000 для вашего приложения.

Это весьма специфичный фикс, но бывают случаи, когда подобные решения имеют смысл.
Сразу предвижу вопрос по поводу падения производительности. Отвечу так: делал тестовую программу, в которой 6000 потоков, каждый из которых раз в 55 мс выполнял несложные арифметические операции. Загрузка ЦП варьировалась 0-1%. Процессор - ноутбучный Athlon X2 2100 MHz.
Буду рад, если кому-то это будет полезно.
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 03.12.2011 в 21:09.
3D Hunter вне форума Ответить с цитированием
Старый 03.12.2011, 21:47   #15
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

для винды вродебы 60 потоков это уже критично.
Человек_Борща вне форума Ответить с цитированием
Старый 05.12.2011, 23:44   #16
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

для Win2003/2008 Server и Win7 4000 потоков на ура работают.
Если было бы критично, то процесс System со своей сотней потоков убивал бы систему регулярно)
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 05.12.2011, 23:49   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

все равно это не значит что можно расходовать ресурсы системы на пропалую.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.12.2011, 23:24   #18
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

да понятно.... но это ж прикольно =)
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 09.12.2011, 23:54   #19
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
для винды вродебы 60 потоков это уже критично.
в стандартной Win XP SP3 один только процесс system имеет ~100 потоков, плюс один из пяти svchost тоже примерно 80.
Цитата:
Код:
   if AThrSize = 1024 then
      FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID)
    else
      FHandle := BeginThread(nil, AThrSize*1024, @ThreadProc, Pointer(Self), CREATE_SUSPENDED or $10000, FThreadID);
а можно просто использовать API функцию CreateThread и не извращаться
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии

Последний раз редактировалось haruhi; 10.12.2011 в 00:08.
haruhi вне форума Ответить с цитированием
Старый 10.12.2011, 00:17   #20
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вообще насчет потоков, не забывайте про активность потоков.
в system может и 100 их, но не все 100 же активны.
и так с остальными.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
масив. максимальное число viknik Помощь студентам 2 14.03.2011 12:23
Максимальное число из n колличества переменных Красильников Илья Паскаль, Turbo Pascal, PascalABC.NET 2 18.02.2011 15:42
Максимальное число Tattoo-master Паскаль, Turbo Pascal, PascalABC.NET 1 18.02.2011 12:15
Найти максимальное число в последовательности vladoscom93 Паскаль, Turbo Pascal, PascalABC.NET 11 14.12.2010 21:43
Максимальное число LOVELY Помощь студентам 2 12.02.2010 01:21