![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| welt |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 21.5.2005 Где: UnderGround Репутация: нет Всего: нет |
Столкнулся с такой проблемой.
Как-то заметил, что откомпилированная программа жрет много памяти. Зашел в процессы (у меня через TaskInfo) и вот, что увидел на закладке Thread: Thread Stack:: Symbol: user32 ! PeekMessageA() + 0xa5 a + 16A3 a + 16F6 a + 2466 По разным адресам(или смещениям? например 0xa5,0x95,..) все время появляется и исчезает PeekMessageA и еще какая-то процедура. причем загрузка процессора до 80%. Посмотрел, например, для блокнота. Там(в стеке) висит TranslateMEssage. И не меняется. Программа, которую компилирую, использует модуль WinCrt. В этом модуле прорисовка окна происходит как-то не совсем понятно. Всем изветно, что создавать окно нужно примено так(последовательность): Заполнение структуры WinClass (типа TWndClass); RegisterClass(WinClass); Handle := CreateWindowEx(0, 'Class', 'Form', WS_OVERLAPPEDWINDOW or WS_VISIBLE, ....); while(GetMessage(Msg, Handle, 0, 0)) do begin TranslateMessage(Msg); //прием сообщений DispatchMessage(Msg); //удаление сообщений из очереди end; Но в модуле WinCrt это сделано иначе(см. листинг1). Там создание окна происходит в отдельной процедуре InitWinCrt, а обработка сообщений в другой процедуре (KeyPressed). Причем не через GetMessage, а через PeekMessage. Поэтому-о я и думаю, что PeekMessage, который вск время воявляется в стеке в диспетчере процессов это и есть тот, что крутится в цикле в процедуре ReadKey. Далее я создаю программу (листинг2). И в этой программе мне нужно сделать, чтобы программа ожидала от пользователя нажатие клавиши, что я и делаю(CH:=READKEY;). Но при запуске, сразу видно, чо загрузка процессора очень большая. Вот теперь и возникает вопрос: можно ли как-то оптимизировать программу (точнее модуль wincrt) так, чтобы использовать минимум ресурсов и не загружать так сильно процессор? Возможно(как один из вариантов) даже использовать вместо readkey что-то другое(альтернативную процедуру), только я не знаю что. бУду рад советам. Модуль и программу прикрепляю.
Присоединённый файл ( Кол-во скачиваний: 4 )
CRT.rar 32,50 Kb |
||||
|
|||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
WaitMessage?
-------------------- Обижено школьников: 8 |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |