|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Доработал немного код и столкнулся со следующей проблемой: во-первых падает производительность (частота кадров) при использовании SetLayeredWindowAttributes, а во-вторых появились странные подергивания. Проблема заключается в том, что если сразу после открытия базы (см. вложение) запустить форму Window и активно поездить указателем мыши по экрану, появляются зависания окна до 10 сек. Но, если после открытия базы не запуская форму, открыть редактор VBA, то форма будет работать нормально и никаких зависаний не будет! В чем дело? Почему только после запуска редактора VBA форма отрабатывает без зависаний? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 19:58 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Посмотрел через Spy++ - форма, в момент зависания, перестает посылать новые координаты курсора. Возможно это глюки Акса. В момент открытия редактора VBA происходит какое-то копирование памяти и несколько обновлений - возможно именно поэтому форма начинает работать нормально. Вынес все функции модуля в отдельный класс для перехвата через WithEvents всех событий формы, это не помогло т.к. форма при подвисании все также перестает посылать координаты курсора. Пробовал компилировать проэкт и создавал mde - не помогло. Повысил приоритет процесса MSAccess до "Реального времени" - зависания остались, но не более 2х секунд по времени т.е. эффект есть, но результат все равно не достигнут. В итоге: Подскажите как через WinAPI перехватить событие MouseMove? (Только не через GetCursorPos и сравнение с пред. значением по таймеру, а именно событие движения мыши) Если и это не поможет, то я просто незнаю уже куда копать. Бенедикт, может быть Вы сможете помочь? P.S. А чем черевато гонять проэкт на приоритете "Реального времени"? (с точки зрения стабильности) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 17:26 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Changeless, попробовал представленный образец на Access 2010. Никаких зависаний и в помине. Попробовал также и на А2003. Полет нормальный, зависаний нет. Похоже, что проблема в вашем ПК. В винде, офисе или аксе бог его знает. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 18:59 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Changeless, ну вот, вы сломали мне комп. Я тоже поводил мышкой в вашей программе, там всё дёргалось и зависало, а теперь в любой программе вожу курсором, всё прыгает, в браузере окна наезжают друг на друга. Перезагрузился, не помогло. Шутка. При открытии вашего проекта при движении мышки действительно в окне как-то странно себя ведёт прямоугольная область (артефакты). Но зависания нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 19:54 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
А, понял, вы приложение типа "Лупа" написали. Ну тогда и артефактов нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 19:55 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
CoolMindНо зависания нет. Для того, что бы нагрузить программу нужно сделать 10-20 кругов мышкой по периметру монитора. Вобщем неважно где, главное активно поводить. Должна появиться ситуация когда мышкой Вы водите, а изображение в форме не меняется. В этот момент программа подвисает и далее работает уже с постоянными подвисаниями. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 20:22 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
ChangelessCoolMindНо зависания нет. Для того, что бы нагрузить программу нужно сделать 10-20 кругов мышкой по периметру монитора. Вобщем неважно где, главное активно поводить. Должна появиться ситуация когда мышкой Вы водите, а изображение в форме не меняется. В этот момент программа подвисает и далее работает уже с постоянными подвисаниями. а можете сказать, для накуа это надо? (сори, а вдрух и мну пригодится) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 20:25 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
ой..., Точняк, недокументированная фича, чтобы юзерш пугать! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 20:42 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
ой... а можете сказать, для накуа это надо? (сори, а вдрух и мну пригодится) Зачем нужна экранная лупа? Да понимаете, на одной форме есть фотография голого шефа, вот бухгалтерши хотят рассмотреть "детали". Ну а если серьезно, то в форме выводится изображение, а всплывающая лупа его немного, для читабельности, увеличивает. Этого вполне достаточно, но когда активно поводишь мышкой форма начинает подвисать. В этом-то вся и проблема. Попробовал на другом компе с той же версией Office - результат тот же, попробовал на третьем (более слабом) торможений нет! В чем же проблема??? Самое главное, что после запуска редактора VBA торможений нет вообще нигде. P.S. Товарищи, не засоряйте тему, я все еще жду толковых предложений. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 21:07 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Changeless, видимо, придётся звать на помощь Бенедикта... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 21:26 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Changeless, попробовал пример - на XP у меня не тормозит вообще, а на Viste - ваще жесть...глюки конкретные так не надо тут обижать Visty ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 21:34 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
По просьбе автора, топик почищен. И я с ним согласен ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 23:46 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Changeless, посмотрите это. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2011, 03:12 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Бенедикт, Спасибо, конечно. Вы подошли несколько иначе, однако, в Вашем примере загрузка такая, что даже указатель мыши тормозит и медленно ездит по экрану. Никогда такого не видел!!! У меня P4 1.8 (Northwood), но я думаю что и i7 980 тоже прийдется не сладко. Куда же он расходует столько ресурсов??? Я нигде не увидел у Вас таймера. У Вас потоковое видео? Кроме того, не создавая окно, следуя Вашему примеру, мне сложно будет решить проблему "каскада" (т.е. в окне формы Вы будете видеть эту же форму, в окне которой будет она же и так до бесконечности). Я влепил таймер в Ваш пример. Извините если что не так, ибо собрал на коленках только для демонстрации. Во вложении после первого нажатия кнопки стандартно, при перемещении мыши, будет тормозить, а при повторном нажатии уже будет работать нормально (killtimer не ставил за ненадобностью). Но даже так, загрузка процессора 100%! Бенедикт, огромное спасибо за mousehook - попробую реализовать у себя. Надеюсь это не он так грузит проц. Может тогда это решит проблему. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2011, 14:32 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Коллеги, Бенедикт - не могу заставить нормально работать перехват событий мыши WH_MOUSE_LL (при этом WH_MOUSE - работает без проблем). При включении WH_MOUSE_LL появляются страшные тормоза на форме. Посмотрите на пример во вложении, если кликнуть по форме и зажать ЛКМ, начинает страшно тормозить отрисовка, при этом никаких событий на перехват нет! В чем тут может быть проблема? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2011, 17:55 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
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) мыши, по-видимому, изменяют стандартный цикл обработки сообщений. Это приводит к проблемам и с таймером, и с хуком. В качестве простого-грубого выхода можно предложить принудительное снятие захвата. См. приложение. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 14:13 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Дополнение. Слабую машинку этот код тоже нагрузит, но эта нагрузка уже более правильная "идеологически", так как, во-первых, убрана тяжёлая обработка из хука, во-вторых, обновление сделано через WM_PAINT, который обрабатывается системой особым образом: когда в очереди нет других сообщений, и слиянием нескольких WM_PAINT (с объединением регионов обновления). Слияние на слабой машине должно выражаться в том, что счётчик Posted растёт быстрее счётчика Processed при интенсивном дёргании мышкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 14:32 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
БенедиктВставьте таймер. Я тогда так и сделал (как временное решение). Ибо времени и так много потратил, а хороших решений не нашел. БенедиктЭкран снимается в битмап в памяти, битмап загружается в элемент управления Image через его свойство PictureData. Как часто? У меня раз в 50миллисекунд. БенедиктА как надо? (После выходных покажу на примере Вашего кода.) Сделайте окно поменьше (как у меня). Добавьте для Вашей формы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Бенедикт, Все что Вы описали я проходил: и таймер, и загрузку проца и снятие хука, но даже в Вашем последнем примере, все равно, при нажатии ЛКМ и перемещении мыши происходит задержка на 1сек - это заметно меньше, но в моем случае недопустимо. Дело не в процессоре или "суматошном дёргании мышкой", а в том, что при определенных событиях я наблюдаю зависания: для таймера - это дергание мышкой, для хука - это перемещение мыши с зажатой ЛКМ. Вот если бы этих задержек небыло - небыло бы и проблемы (кроме рывков на MoveWindow, что возможно решаемо через метод Move - нужно попробовать). Но это все лирика. Если кратко, то проблемы всего две - это MoveWindow с рывками и задерка при нажатии ЛКМ в хуке мыши. Если Вы покажите мне как решить эти две проблемы, остальное в Вашем примере я допишу сам и будем считать, что мы снова победили Access :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 16:42 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Changeless, Пока просто вопросы. Нажатие ЛКМ - это штатная операция, т. е. предполагается, что пользователь её должен сделать, или это тестирование на случай, а вдруг он это сделает? Вы не drag and drop операцию, случаем, хотите реализовать? Надо ли отслеживать движение мыши за пределами окон данного процесса (точнее, потока)? Могут ли в процессе работы открываться/закрываться формы? >Как часто? У меня раз в 50миллисекунд. В первом примере - при каждом вызове процедуры хука. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 18:54 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Бенедикт, Да нет, drag and drop реализуется через API как стиль окна которое принимает перетаскиваемые файлы... все намного проще. Как я уже писал, в форме выводится изображение, а всплывающая лупа его немного, для читабельности, увеличивает, чего вполне достаточно. Но, либо лупа подвисает, либо дергается изображение (см. пред пост). Представленная выше экранная лупа могла бы устроить пользователей, но она не устраивает меня потому, что я сравниваю ее с экранной лупой от MS, которую они встраивают в драйвера своих мышей. 1) Нажатие ЛКМ - это обязательная операция - так пользователь рисует линию на изображении; 2) За пределами процесса MSAccess и даже потока - нет (даже мысли не приходят, как можно отфильтровать сообщения мыши в пределах потока?). Правда, в базе несколько форм в которых используется экранная лупа (есстественно поочередно). 3) В процессе работы с экранной лупой не могут открываться\закрываться формы. БенедиктВ первом примере - при каждом вызове процедуры хука. И я так сделал, выкладывал пример 7го числа, но при нажатии ЛКМ... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 21:11 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Бенедикт, Доработал эту лупу до "полноценной" копии MS, но сильно томозит отрисовка. Это происходит вот по этой причине: Код: plaintext 1.
- Двойную буферизацию при отрисовке, в виде стиля WS_EX_COMPOSITED, принимать отказывается. - Возможно торможений не будет, если передвигать форму через UpdateLayeredWindow, но у меня двигать этой функцией не получается (возможно неправильно описал - там много мест для ошибок). Посмотрите вложение, может у кого-нибудь будут идеи? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2011, 20:22 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Changeless, да, можно посмотреть этот вариант, ЕМНИП, был на RSDN пример с анимацией, основанный на этом. По поводу более традиционных подходов возникла идея двигать не окно, а регион отсечения окна. Но краевые эффекты всё равно есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2011, 12:26 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Changeless, "Слоёное" окно перемещается действительно красивее, без лишних "эффектов". ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2011, 14:01 |
|
Почему API тормозит?
|
|||
---|---|---|---|
#18+
Бенедикт, Класс, высший пилотаж!!! Доработал Ваш предыдущий вариант на выходных (см.вложение). Ваша идея очень хорошая, единственное что не получилось - создать черную рамку вокруг лупы (что-то вроде границ окна). Я потом понял почему, но возвращаться уже не стал. Вероятно, проще просто нарисовать прямоугольник и двигать его вместе с областью увеличения. И спасибо, за новый вариант. Попробую "поковырять". ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2011, 16:29 |
|
|
start [/forum/topic.php?fid=45&msg=37290143&tid=1626609]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
others: | 256ms |
total: | 413ms |
0 / 0 |