Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> lpfnwndproc, очередь, или потоки? 
:(
    Опции темы
lollollollol
Дата 14.9.2014, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Создаётся окно на апи

Код

procedure CreateWindowUP;
var
  wc: TWndClassEx;
begin
  wc.cbSize := SizeOf(TWndClassEx);                                             // заполнение стpуктуpы wc
  wc.style := CS_VREDRAW or CS_HREDRAW;                                         //стиль (комбинация стилей) окна
  wc.lpfnWndProc := @WindowProcLogin;                                           //адрес оконной процедуры
  wc.cbClsExtra := 0;                                                           // выделенная память
  wc.cbWndExtra := 0;                                                           // выделенная память
  wc.hInstance := HInstance;                                                    // указатель на экземпляр программы
  wc.hIcon := LoadIcon(0, IDI_APPLICATION);                                     //указатель на пиктограмму окна
  wc.hCursor := LoadCursor(0, IDC_ARROW);                                       //курсор окна
  wc.hbrBackground := COLOR_WINDOW + 1;                                         //кисть, закрашивающая окно
  wc.lpszMenuName := nil;                                                       //имя меню класса окна
  wc.lpszClassName := '111';                                                       //имя класса окна
  RegisterClassEx(wc);
  MainWnd := CreateWindowEx(0,wc.lpszClassName,wc.lpszClassName,WS_OVERLAPPED or WS_SYSMENU or WS_MINIMIZEBOX,-100,Integer(CW_USEDEFAULT),100,100,0,0,HInstance,nil);
  ShowWindow(MainWnd, SW_SHOWNORMAL);                                           //отобpазить наше окно на десктопе
  UpdateWindow(MainWnd);                                                        // обновить клиентскую область
  while (GetMessage(Msg, 0,0,0)=True) do begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end;


обратите внимание на строку
Код

  wc.lpfnWndProc := @WindowProcLogin;                                           //адрес оконной процедуры




вопрос:

Как я понимаю, когда окну ОС отправляет собщение, его обрабатывает функция WindowProcLogin. Верно?

Если я не ошибаюсь, следующий вопрос - 
Когда в окно отправляется, допустим 10 сообщений, но оно ещё не обработало первое, как будет вести себя программа?

1. Подождёт обработки первого, потом обработает остальные в порядке очереди (если так, то какой максимальный размер очереди?)
2. Обработка каждого сообщения будет выполняться сразу, как оно приходит.
Т.е. получается выделяет по потоку на сообщение?

Например отправляет 10 сообщений, каждое из которых обрабатывается по 10 секунд. 
Программа отработает за 

1. 100 секунд (по очереди)
2. 10 секунд (запустит по 10 потоков)

?





спасибо

PM MAIL   Вверх
kami
Дата 14.9.2014, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



1 - правильно. Оконная процедура вызывается в контексте потока, создавшего окно. Этим, кстати, можно пользоваться для гарантированного выполнения кода в нужном потоке.
Посему - сообщения будут накапливаться и выполняться в порядке очереди.
А вот как организована очередь - отдельная тема. Куда в очередь встанет сообщение зависит от того, как оно послано (SendMessage и PostMessage), от типа сообщения (например, емнип, WM_TIMER имеет очень низкий приоритет и его спокойно "отодвигают" в конец очереди).
PM MAIL WWW   Вверх
lollollollol
Дата 17.9.2014, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



понял, а какой размер очереди может быть максимально?
сколько сообщений в очереди могут стоять?
PM MAIL   Вверх
kami
Дата 17.9.2014, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(lollollollol @  17.9.2014,  20:22 Найти цитируемый пост)
а какой размер очереди может быть максимально?

10000 by default
При этом не надо забывать, что немалая часть сообщений приходит вне очереди (nonqueued messages, а некоторые сообщения всегда откладываются в конец очереди и даже "складываются" друг с другом (WM_PAINT)

Добавлено через 3 минуты и 19 секунд
Подозреваю, что часть операций, которые занимают по 10 секунд, надо вынести в отдельный поток.
Наверное, лучше бы обрисовать конкретную задачу, если это не академический интерес.

Это сообщение отредактировал(а) kami - 17.9.2014, 21:09
PM MAIL WWW   Вверх
lollollollol
Дата 22.9.2014, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



спасибо.

задачу выполнил, очередь не больше 1000 сообщений в пиковые моменты. вынес работу в отдельный поток
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.