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

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

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

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

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

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

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


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

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

Спасибо, конечно. Вы подошли несколько иначе, однако, в Вашем примере загрузка такая, что даже указатель мыши тормозит и медленно ездит по экрану. Никогда такого не видел!!! У меня P4 1.8 (Northwood), но я думаю что и i7 980 тоже прийдется не сладко. Куда же он расходует столько ресурсов???
Я нигде не увидел у Вас таймера. У Вас потоковое видео? Кроме того, не создавая окно, следуя Вашему примеру, мне сложно будет решить проблему "каскада" (т.е. в окне формы Вы будете видеть эту же форму, в окне которой будет она же и так до бесконечности).
Я влепил таймер в Ваш пример. Извините если что не так, ибо собрал на коленках только для демонстрации. Во вложении после первого нажатия кнопки стандартно, при перемещении мыши, будет тормозить, а при повторном нажатии уже будет работать нормально (killtimer не ставил за ненадобностью). Но даже так, загрузка процессора 100%!
Бенедикт, огромное спасибо за mousehook - попробую реализовать у себя. Надеюсь это не он так грузит проц. Может тогда это решит проблему.
...
Рейтинг: 0 / 0
07.06.2011, 17:55
    #37299301
Changeless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему API тормозит?
Коллеги, Бенедикт - не могу заставить нормально работать перехват событий мыши WH_MOUSE_LL (при этом WH_MOUSE - работает без проблем). При включении WH_MOUSE_LL появляются страшные тормоза на форме. Посмотрите на пример во вложении, если кликнуть по форме и зажать ЛКМ, начинает страшно тормозить отрисовка, при этом никаких событий на перехват нет! В чем тут может быть проблема?
...
Рейтинг: 0 / 0
10.06.2011, 14:13
    #37304256
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему API тормозит?
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
10.06.2011, 14:32
    #37304301
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему API тормозит?
Дополнение.
Слабую машинку этот код тоже нагрузит, но эта нагрузка уже более правильная "идеологически", так как, во-первых, убрана тяжёлая обработка из хука, во-вторых, обновление сделано через WM_PAINT, который обрабатывается системой особым образом: когда в очереди нет других сообщений, и слиянием нескольких WM_PAINT (с объединением регионов обновления). Слияние на слабой машине должно выражаться в том, что счётчик Posted растёт быстрее счётчика Processed при интенсивном дёргании мышкой.
...
Рейтинг: 0 / 0
10.06.2011, 16:42
    #37304599
Changeless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему API тормозит?
БенедиктВставьте таймер.
Я тогда так и сделал (как временное решение). Ибо времени и так много потратил, а хороших решений не нашел.
БенедиктЭкран снимается в битмап в памяти, битмап загружается в элемент управления 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
10.06.2011, 18:54
    #37304811
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему API тормозит?
Changeless,

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

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


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

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

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

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

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

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


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