Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Вниз

Работа в потоке   Найти похожие ветки 

 
Stalker01 ©   (2005-07-11 12:25) [0]

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


 
Kolan ©   (2005-07-11 12:30) [1]

Ну делай не каждый раз или Sleep.


 
evvcom ©   (2005-07-11 12:43) [2]


> в отдельном потоке непрерывно выполнять некоторую операцию
> (перерисовка надписи на экране)

Перерисовкой экрана должен заниматься основной поток, иначе глюков не оберешься. А что надпись так часто изменяется? И что такое "надпись"?


 
Eraser ©   (2005-07-11 12:46) [3]

evvcom ©   (11.07.05 12:43) [2]
Перерисовкой экрана должен заниматься основной поток


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


 
Stalker01 ©   (2005-07-11 12:57) [4]

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


 
evvcom ©   (2005-07-11 13:08) [5]


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

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


 
Stalker01 ©   (2005-07-11 13:09) [6]

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


 
Stalker01 ©   (2005-07-11 13:12) [7]

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


 
Kolan ©   (2005-07-11 13:21) [8]

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

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


 
Fay ©   (2005-07-11 13:32) [9]

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


 
Kolan ©   (2005-07-11 13:40) [10]


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

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


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

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

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


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

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

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

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


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

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

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


 
Fay ©   (2005-07-11 13:56) [14]

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


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

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

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

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


 
Alexander Panov ©   (2005-07-11 14:27) [16]

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

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

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


 
Fay ©   (2005-07-11 14:30) [17]

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


 
Alexander Panov ©   (2005-07-11 14:33) [18]

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


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


 
Stalker01 ©   (2005-07-11 14:51) [19]

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

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

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


 
Eraser ©   (2005-07-11 17:32) [20]

Stalker01 ©

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

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


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


 
Alex Konshin ©   (2005-07-11 22:23) [21]

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


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

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


 
Defunct ©   (2005-07-12 01:25) [23]

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

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

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.049 c
9-1113155896
Green_Templar
2005-04-10 21:58
2005.07.31
текст


4-1117694720
prisoner849
2005-06-02 10:45
2005.07.31
TaskBar


3-1118750598
__oleg
2005-06-14 16:03
2005.07.31
Починка БД Firebird


3-1119370238
Lordalexander
2005-06-21 20:10
2005.07.31
Неизвестный формат базы


14-1120553020
DelphiN!
2005-07-05 12:43
2005.07.31
Web FTP Client





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский