powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Почему API тормозит?
24 сообщений из 24, страница 1 из 1
Почему API тормозит?
    #37288125
Changeless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доработал немного код и столкнулся со следующей проблемой: во-первых падает производительность (частота кадров) при использовании SetLayeredWindowAttributes, а во-вторых появились странные подергивания. Проблема заключается в том, что если сразу после открытия базы (см. вложение) запустить форму Window и активно поездить указателем мыши по экрану, появляются зависания окна до 10 сек. Но, если после открытия базы не запуская форму, открыть редактор VBA, то форма будет работать нормально и никаких зависаний не будет! В чем дело? Почему только после запуска редактора VBA форма отрабатывает без зависаний?
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37289833
Changeless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посмотрел через Spy++ - форма, в момент зависания, перестает посылать новые координаты курсора. Возможно это глюки Акса.
В момент открытия редактора VBA происходит какое-то копирование памяти и несколько обновлений - возможно именно поэтому форма начинает работать нормально.
Вынес все функции модуля в отдельный класс для перехвата через WithEvents всех событий формы, это не помогло т.к. форма при подвисании все также перестает посылать координаты курсора. Пробовал компилировать проэкт и создавал mde - не помогло.
Повысил приоритет процесса MSAccess до "Реального времени" - зависания остались, но не более 2х секунд по времени т.е. эффект есть, но результат все равно не достигнут.

В итоге:
Подскажите как через WinAPI перехватить событие MouseMove? (Только не через GetCursorPos и сравнение с пред. значением по таймеру, а именно событие движения мыши) Если и это не поможет, то я просто незнаю уже куда копать.
Бенедикт, может быть Вы сможете помочь?

P.S. А чем черевато гонять проэкт на приоритете "Реального времени"? (с точки зрения стабильности)
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37290031
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Changeless,

попробовал представленный образец на Access 2010. Никаких зависаний и в помине.
Попробовал также и на А2003. Полет нормальный, зависаний нет.

Похоже, что проблема в вашем ПК. В винде, офисе или аксе бог его знает.
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37290098
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Changeless, ну вот, вы сломали мне комп. Я тоже поводил мышкой в вашей программе, там всё дёргалось и зависало, а теперь в любой программе вожу курсором, всё прыгает, в браузере окна наезжают друг на друга. Перезагрузился, не помогло.
Шутка.
При открытии вашего проекта при движении мышки действительно в окне как-то странно себя ведёт прямоугольная область (артефакты). Но зависания нет.
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37290100
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, понял, вы приложение типа "Лупа" написали. Ну тогда и артефактов нет.
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37290143
Changeless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CoolMindНо зависания нет.
Для того, что бы нагрузить программу нужно сделать 10-20 кругов мышкой по периметру монитора. Вобщем неважно где, главное активно поводить. Должна появиться ситуация когда мышкой Вы водите, а изображение в форме не меняется. В этот момент программа подвисает и далее работает уже с постоянными подвисаниями.
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37290146
Фотография ой...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChangelessCoolMindНо зависания нет.
Для того, что бы нагрузить программу нужно сделать 10-20 кругов мышкой по периметру монитора. Вобщем неважно где, главное активно поводить. Должна появиться ситуация когда мышкой Вы водите, а изображение в форме не меняется. В этот момент программа подвисает и далее работает уже с постоянными подвисаниями.
а можете сказать, для накуа это надо? (сори, а вдрух и мну пригодится)
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37290158
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой...,
Точняк, недокументированная фича, чтобы юзерш пугать!
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37290185
Changeless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ой... а можете сказать, для накуа это надо? (сори, а вдрух и мну пригодится)
Зачем нужна экранная лупа? Да понимаете, на одной форме есть фотография голого шефа, вот бухгалтерши хотят рассмотреть "детали".
Ну а если серьезно, то в форме выводится изображение, а всплывающая лупа его немного, для читабельности, увеличивает. Этого вполне достаточно, но когда активно поводишь мышкой форма начинает подвисать. В этом-то вся и проблема.
Попробовал на другом компе с той же версией Office - результат тот же, попробовал на третьем (более слабом) торможений нет! В чем же проблема??? Самое главное, что после запуска редактора VBA торможений нет вообще нигде.

P.S. Товарищи, не засоряйте тему, я все еще жду толковых предложений.
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37290201
Фотография ой...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Changeless,

видимо, придётся звать на помощь Бенедикта...
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37290212
WRX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WRX
Гость
Changeless, попробовал пример - на XP у меня не тормозит вообще, а на Viste - ваще жесть...глюки конкретные так не надо тут обижать Visty
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37290357
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По просьбе автора, топик почищен.


И я с ним согласен
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37290437
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Changeless,

посмотрите это.
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37291428
Changeless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бенедикт,

Спасибо, конечно. Вы подошли несколько иначе, однако, в Вашем примере загрузка такая, что даже указатель мыши тормозит и медленно ездит по экрану. Никогда такого не видел!!! У меня P4 1.8 (Northwood), но я думаю что и i7 980 тоже прийдется не сладко. Куда же он расходует столько ресурсов???
Я нигде не увидел у Вас таймера. У Вас потоковое видео? Кроме того, не создавая окно, следуя Вашему примеру, мне сложно будет решить проблему "каскада" (т.е. в окне формы Вы будете видеть эту же форму, в окне которой будет она же и так до бесконечности).
Я влепил таймер в Ваш пример. Извините если что не так, ибо собрал на коленках только для демонстрации. Во вложении после первого нажатия кнопки стандартно, при перемещении мыши, будет тормозить, а при повторном нажатии уже будет работать нормально (killtimer не ставил за ненадобностью). Но даже так, загрузка процессора 100%!
Бенедикт, огромное спасибо за mousehook - попробую реализовать у себя. Надеюсь это не он так грузит проц. Может тогда это решит проблему.
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37299301
Changeless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, Бенедикт - не могу заставить нормально работать перехват событий мыши WH_MOUSE_LL (при этом WH_MOUSE - работает без проблем). При включении WH_MOUSE_LL появляются страшные тормоза на форме. Посмотрите на пример во вложении, если кликнуть по форме и зажать ЛКМ, начинает страшно тормозить отрисовка, при этом никаких событий на перехват нет! В чем тут может быть проблема?
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37304256
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChangelessВы подошли несколько иначе, однако, в Вашем примере загрузка такая, что даже указатель мыши тормозит и медленно ездит по экрану. Никогда такого не видел!!! У меня P4 1.8 (Northwood), но я думаю что и i7 980 тоже прийдется не сладко. Куда же он расходует столько ресурсов???Нашёл P4 1.8. Да, нагрузка 100%, но мышь не тормозит. На пятилетней давности C2D E6700 нагрузка в среднем 8-9%, причём при самом суматошном дёргании мышкой лишь изредка и на доли секунды множитель проца меняется с энергосберегающего на полный. Это я для статистики.
ChangelessЯ нигде не увидел у Вас таймера.Вставьте таймер. Но события таймера в Access могут перестать приходить при самых простых действиях пользователя.
ChangelessУ Вас потоковое видео?Нет. Экран снимается в битмап в памяти, битмап загружается в элемент управления Image через его свойство PictureData. Кстати, это самая тяжёлая операция. Что ж, вернёмся к копированию с экрана на экран.ChangelessКроме того, не создавая окно, следуя Вашему примеру, мне сложно будет решить проблему "каскада" (т.е. в окне формы Вы будете видеть эту же форму, в окне которой будет она же и так до бесконечности).А как надо?
ChangelessБенедикт, огромное спасибо за mousehook - попробую реализовать у себя. Надеюсь это не он так грузит проц.Грузит, и это ощутимо на слабых машинах. Кроме тогоChangelessне могу заставить нормально работать перехват событий мыши WH_MOUSE_LL (при этом WH_MOUSE - работает без проблем). При включении WH_MOUSE_LL появляются страшные тормоза на форме. Посмотрите на пример во вложении, если кликнуть по форме и зажать ЛКМ, начинает страшно тормозить отрисовка, при этом никаких событий на перехват нет! В чем тут может быть проблема?Некоторые оконные классы Access-а при захвате (capture) мыши, по-видимому, изменяют стандартный цикл обработки сообщений. Это приводит к проблемам и с таймером, и с хуком. В качестве простого-грубого выхода можно предложить принудительное снятие захвата. См. приложение.
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37304301
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополнение.
Слабую машинку этот код тоже нагрузит, но эта нагрузка уже более правильная "идеологически", так как, во-первых, убрана тяжёлая обработка из хука, во-вторых, обновление сделано через WM_PAINT, который обрабатывается системой особым образом: когда в очереди нет других сообщений, и слиянием нескольких WM_PAINT (с объединением регионов обновления). Слияние на слабой машине должно выражаться в том, что счётчик Posted растёт быстрее счётчика Processed при интенсивном дёргании мышкой.
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37304599
Changeless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
БенедиктВставьте таймер.
Я тогда так и сделал (как временное решение). Ибо времени и так много потратил, а хороших решений не нашел.
БенедиктЭкран снимается в битмап в памяти, битмап загружается в элемент управления Image через его свойство PictureData.
Как часто? У меня раз в 50миллисекунд.
БенедиктА как надо?
(После выходных покажу на примере Вашего кода.)
Сделайте окно поменьше (как у меня). Добавьте для Вашей формы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" _
(ByVal hWnd As Long, ByVal crey As Byte, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Declare Function MoveWindow Lib "user32" (ByVal hWnd As Long, ByVal X As Long, ByVal Y As Long, _
    ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long

Private Const WS_EX_TRANSPARENT = &H20&
Private Const GWL_EXSTYLE = (- 20 )
Private Const WS_EX_LAYERED = &H80000
Private Const LWA_ALPHA = &H2&

'И далее (для прозрачности и дабы пропускать мышь):
Call SetWindowLong(m_Form.hWnd, GWL_EXSTYLE, WS_EX_LAYERED Or WS_EX_TRANSPARENT)
Call SetLayeredWindowAttributes(m_Form.hWnd,  0 ,  255 , LWA_ALPHA)

'А теперь, самое главное! Усложним задачу - форма должна быть "прикреплена" к курсору т.е. перемещаться вместе с курсором.
'Я пробовал реализовать через API - MoveWindow. Проц не грузится, но форма перемещается рывками. Оставил пока так. Может у Вас получится лучше.

Бенедикт,
Все что Вы описали я проходил: и таймер, и загрузку проца и снятие хука, но даже в Вашем последнем примере, все равно, при нажатии ЛКМ и перемещении мыши происходит задержка на 1сек - это заметно меньше, но в моем случае недопустимо. Дело не в процессоре или "суматошном дёргании мышкой", а в том, что при определенных событиях я наблюдаю зависания: для таймера - это дергание мышкой, для хука - это перемещение мыши с зажатой ЛКМ. Вот если бы этих задержек небыло - небыло бы и проблемы (кроме рывков на MoveWindow, что возможно решаемо через метод Move - нужно попробовать).

Но это все лирика. Если кратко, то проблемы всего две - это MoveWindow с рывками и задерка при нажатии ЛКМ в хуке мыши. Если Вы покажите мне как решить эти две проблемы, остальное в Вашем примере я допишу сам и будем считать, что мы снова победили Access :)
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37304811
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Changeless,

Пока просто вопросы.

Нажатие ЛКМ - это штатная операция, т. е. предполагается, что пользователь её должен сделать, или это тестирование на случай, а вдруг он это сделает?
Вы не drag and drop операцию, случаем, хотите реализовать?
Надо ли отслеживать движение мыши за пределами окон данного процесса (точнее, потока)?
Могут ли в процессе работы открываться/закрываться формы?


>Как часто? У меня раз в 50миллисекунд.
В первом примере - при каждом вызове процедуры хука.
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37304935
Changeless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бенедикт,
Да нет, drag and drop реализуется через API как стиль окна которое принимает перетаскиваемые файлы... все намного проще. Как я уже писал, в форме выводится изображение, а всплывающая лупа его немного, для читабельности, увеличивает, чего вполне достаточно. Но, либо лупа подвисает, либо дергается изображение (см. пред пост). Представленная выше экранная лупа могла бы устроить пользователей, но она не устраивает меня потому, что я сравниваю ее с экранной лупой от MS, которую они встраивают в драйвера своих мышей.
1) Нажатие ЛКМ - это обязательная операция - так пользователь рисует линию на изображении;
2) За пределами процесса MSAccess и даже потока - нет (даже мысли не приходят, как можно отфильтровать сообщения мыши в пределах потока?). Правда, в базе несколько форм в которых используется экранная лупа (есстественно поочередно).
3) В процессе работы с экранной лупой не могут открываться\закрываться формы.
БенедиктВ первом примере - при каждом вызове процедуры хука.
И я так сделал, выкладывал пример 7го числа, но при нажатии ЛКМ...
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37309911
Changeless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бенедикт,

Доработал эту лупу до "полноценной" копии MS, но сильно томозит отрисовка. Это происходит вот по этой причине:
Код: plaintext
1.
Call SetLayeredWindowAttributes(m_Form.hWnd,  0 ,  255 , LWA_ALPHA)
Эта "слойка" обрабатывается программно OpenGL 1.1, а потому будет тормозить всегда. Как вариант WGL_ARB_pbuffer , но это сложно, возможно есть более простые решения:
- Двойную буферизацию при отрисовке, в виде стиля WS_EX_COMPOSITED, принимать отказывается.
- Возможно торможений не будет, если передвигать форму через UpdateLayeredWindow, но у меня двигать этой функцией не получается (возможно неправильно описал - там много мест для ошибок).
Посмотрите вложение, может у кого-нибудь будут идеи?
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37310752
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Changeless,

да, можно посмотреть этот вариант, ЕМНИП, был на RSDN пример с анимацией, основанный на этом.

По поводу более традиционных подходов возникла идея двигать не окно, а регион отсечения окна. Но краевые эффекты всё равно есть.
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37315826
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Changeless,

"Слоёное" окно перемещается действительно красивее, без лишних "эффектов".
...
Рейтинг: 0 / 0
Почему API тормозит?
    #37316223
Changeless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бенедикт,

Класс, высший пилотаж!!! Доработал Ваш предыдущий вариант на выходных (см.вложение). Ваша идея очень хорошая, единственное что не получилось - создать черную рамку вокруг лупы (что-то вроде границ окна). Я потом понял почему, но возвращаться уже не стал. Вероятно, проще просто нарисовать прямоугольник и двигать его вместе с областью увеличения.
И спасибо, за новый вариант. Попробую "поковырять".
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Почему API тормозит?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]