Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа в потоке [D7, Win2k]


Страницы:   1 2

Stalker01 ©   (2005-07-11 12:25:00) 

Необходимо в отдельном потоке непрерывно выполнять некоторую операцию (перерисовка надписи на экране), если делать это в бесконечном цикле while true, то на это выделяеться слишком много ресурсов, все остальные приложения тормозят. Подскажите решение. Заранее спасибо.


Defunct   (2005-07-12 01:25:00) [1]

> Stalker01
идеальный вариант был бы такой:
на системном уровне отлавливать обращения к I/O space видеокарты, отслеживать попытку перетирания региона с надписью, не выводить эти данные в видеобуфер, а направлять их в в промежуточный буфер. В промежуточном буфере накладывать надпись и копировать его в регион видеобуфера. Драйвера некоторых видеокарт позволяют такое делать (например nview к nvidia fx/nx демонстрирует такую возможность - прозрачность окон). Тогда точно не будет никаких мерцаний, все остальное (imho) - от лукавого (даже отлов WM_PAINT тоже приведет к мерцанию). Т.е. клоню к надстройке для драйвера видяшки либо к использованию готовых надстроек драйверов.

Хотя, разумеется, все зависит от суммы которую вы планируете получить за программу ;>

> Alex Konshin ©   (11.07.05 22:23) [21]
> выводить уже готовую картинку вместе с фоном.
Именно, иначе от мерцания никак не избавиться.


Alex Konshin   (2005-07-11 22:32:00) [2]

Вообще-то да, если кто-то часто затирает нашу надпись, то тогда конечно от мерцания не избавиться.
Я имел в виду избавится от мерцания при изменении записи, например, при бегущей строке.


Alex Konshin   (2005-07-11 22:23:00) [3]

Как я уже сказал, от мерцания можно избавится, если не стирать-писать, а писать поверх, и такое можно сделать, если выводить уже готовую картинку вместе с фоном.


Eraser   (2005-07-11 17:32:00) [4]

Stalker01 ©

Задача понятна. Давно проверенный вариант - перерисовывать по таймеру. Проц НЕ грузит. От мерцания при частой смене картинки не куда не денешься.

Юрий Зотов ©
Навскидку напрашиватеся такое решение. Получаем хэндл окна десктопа и определяем его поток. На этот поток вешаем хук, отлавливающий WM_PAINT. При отлове вызываем GetUpdateRect и проверяем, попадает ли наша надпись в область перерисовки. Если да - обновляем надпись.


Эт конечно идеальный вариант, но как назло обычно это "затирание" надписи происходит в игре например, где естесственно никаких WM_PAINT не генерируется при перерисовки окна.


Stalker01   (2005-07-11 14:51:00) [5]

2Alex Konshin
Когда изменяються данные мы знаем, проблема в том, что неизвестно когда надо перерисовывать надпись, т.е. когда она "затерта" другим приложением.

2Alexander Panov
По возможности необходимо перерисовывать сразу после изменения окна, чтобы не было мерцания. По таймеру делал, но при этом все равно присутствует мерцание плюс наблюдаються тормоза.

2 Юрий Зотов ©, Alexander Panov ©
С хуком идею понял, спасибо, попытаюсь реализовать...


Alexander Panov   (2005-07-11 14:33:00) [6]

Fay ©   (11.07.05 14:30) [17]
Лишняя работа - это перерисовка постоянно перекрытого окна, перерисовка ни разу не перекрытого окна.


Я умаю, ты понял - имеется ввиду лишщняя работа по программированию. А железяка она и есть железяка - пусть работает.
К тому же при выводе надписи и так происходит всего лишь перерисовка региона - на системном уровне.


Fay   (2005-07-11 14:30:00) [7]

2 Alexander Panov ©   (11.07.05 14:27) [16]
Лишняя работа - это перерисовка постоянно перекрытого окна, перерисовка ни разу не перекрытого окна.


Alexander Panov   (2005-07-11 14:27:00) [8]

Юрий Зотов ©   (11.07.05 14:05) [15]
Fay ©   (11.07.05 13:56) [14]

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

В первом случае и во втором случае самое красивое решение с хуком на отрисовку Desktop, но во втором случае достаточно отрисовывать по таймеру, и не заниматься лишней работой.


Юрий Зотов   (2005-07-11 14:05:00) [9]

> Alex Konshin ©   (11.07.05 13:52) [13]
> это наши данные и мы знаем, когда они изменились.

В [4]: "вывод текста на canvas десктопа функцией textout".

Я что-то не так понял?


Fay   (2005-07-11 13:56:00) [10]

2 Alex Konshin ©   (11.07.05 13:52) [13]
Мы не знаем, надо ли перерисовать неизменившиеся данные.


Alex Konshin   (2005-07-11 13:52:00) [11]

Юрий Зотов ©   (11.07.05 13:47) [12]
> Сообщения о перерисовке региона
Навскидку напрашиватеся такое решение. Получаем хэндл окна десктопа и определяем его поток. На этот поток вешаем хук, отлавливающий WM_PAINT. При отлове вызываем GetUpdateRect и проверяем, попадает ли наша надпись в область перерисовки. Если да - обновляем надпись.

Тебе не кажется, что это реактивное решение не самое простое, я бы сказал, из пушки по воробьям? И сделать можно гораздо проще просто потому, что это наши данные и мы знаем, когда они изменились.


Юрий Зотов   (2005-07-11 13:47:00) [12]

> рисовать должен главный поток.
Если перерисовка осуществляется без использования VCL - любой.

> приоритет потока понизить
Чтобы он перестал вовремя перерисовывать?

> Сообщения о перерисовке региона
Навскидку напрашиватеся такое решение. Получаем хэндл окна десктопа и определяем его поток. На этот поток вешаем хук, отлавливающий WM_PAINT. При отлове вызываем GetUpdateRect и проверяем, попадает ли наша надпись в область перерисовки. Если да - обновляем надпись.


Alex Konshin   (2005-07-11 13:41:00) [13]

Перерисовывай по таймеру в главном потоке.
При изменении выставляй флаг, а в обработчике таймера его проверяй, и если он стоит, то только тогда перерисовывай.
Главный поток должен запрашивать данные для перерисовки, позаботься об синхронизации (т.е. нужна критическая секция).
Чтобы не мерцало - зависит от ситуации. Нужно как-то избежать раздельного стирания и рисования. Например, нарисуй сначала в bitmap, а потом уже рисуй полученный битмап в нужном месте.

Не нужно рисовать в потоке: во-первых, это неправильно идеалогически, во-вторых, VCL не предназначена для этого, а вручную это может быть непросто.


Kolan   (2005-07-11 13:40:00) [14]


> то на это выделяеться слишком много ресурсов

Ну по идее ведь если понизить будет меньше выделятся. В это я совсем не уверен.


Fay   (2005-07-11 13:32:00) [15]

2 Kolan ©   (11.07.05 13:21) [8]
>> Может еще приоритет потока понизить...
Зачем?


Kolan   (2005-07-11 13:21:00) [16]

Я считаю что
> evvcom ©   (11.07.05 12:43) [2]

прав. рисовать должен главный поток. Попробуй посылать свое сообщение. И перерисовывай когда оно придет.
Может еще приоритет потока понизить...


Stalker01   (2005-07-11 13:12:00) [17]

2evvcom
Сообщения о перерисовке региона? А это реально? Как? Я думал максимум можно отлавливать перерисовку всего окна.


Stalker01   (2005-07-11 13:09:00) [18]

2Kolan
Спасибо, sleep частично решил проблему, но если идет частая перерисовка, то надпись сильно мерцает...


evvcom   (2005-07-11 13:08:00) [19]


> Эт почему это? Речь ведь не идёт о VCL.

Согласен. Не уточнил. Используется ли VCL? Похоже нет. В любом случае надо отлавливать либо сообщения о перерисовке данного региона, либо еще что-то, но не в тупую перерисовывать в цикле.


Stalker01   (2005-07-11 12:57:00) [20]

Надпись, это вывод текста на canvas десктопа функцией textout, надпись не меняеться, но некоторые приложения, например игры, очень часто перерисовывают десктоп и затирают мою надпись. Операция должна выполняться в фоновом режиме, поэтому использую отдельный поток...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо