LINUX.ORG.RU

как уменьшить загрузку проца???


0

0

Есть прога написанная на gtk которая периодически получает состояние некоторого устройства и выводит на екран поверх изображения етого устройства в нужных точках.

Прога работает следующим образом:

Есть фон background в GdkPixmap и текущий кадр frame тоже GdkPixmap.

так вот прога по тайм-ауту опрашивает состояние устройства после чего обновляет frame из background, после чего по frame при помоши gdk_draw_layout() пишет данные полученные с устройства.

обработчик expose_event переносит frame в GtkDrawingArea и отображает на екране.

Так вот всё ето увеличивает загрузку процессора Х-сервером на 80%, что по моему многовато.

Плиз подскажите как с етим боротся а то совсем не знаю куда копать!!!

★★★★★

Наверно нужно перерисовывать информацию не так часто и не в таких количесвах. Таймаут увеличить, все равно пользовотелю от обновления больше чем раз двадцать в секунду толку нет.

invalidate area использовать.

anonymous
()
Ответ на: комментарий от anonymous

>Наверно нужно перерисовывать информацию не так часто и не в таких количесвах. Таймаут увеличить, все равно пользовотелю от обновления больше чем раз двадцать в секунду толку нет.

Пробовал. Ничё не помогает. При изменениии таймаута от 0.5сек до 10сек загрузка проца заметно не изменилась

Зависимость загрузки проца от количества перерисовываемой инфы обнаружить не удалось

>invalidate area использовать.

А что оно такое???

anonymous
()
Ответ на: комментарий от anonymous

>expose_event напрямую что-ли вызывается?

Не понял. Сигнал я сам не посылаю и обработчик напрямую не вызываю

>Или делается gtk_widget_queue_draw?

Да ето делается

anonymous
()
Ответ на: комментарий от anonymous

А вот это уже ненормально совсем. Может, где-то в другом месте процессор грузится, не в графике все дело, нужно прогу смотреть. возможно, просто ввод-вывод неправильно огранизован.

Простейший способ - остановить ее в произвольный момент из отладчика и посмотреть, где находится она. Потом еще раз попробовать, посмотреть backtrace.

Способ навороченнее - использовать gprof.

anonymous
()
Ответ на: комментарий от anonymous

стоп, че то я читаю невнимательно. Если X-server грузит проц, то дело все-таки в графике. А обработчик expose сколько раз в секунду вызывается при таймауте в 10 секунд?

По идее, поcле обновления один раз должно быть выполнено expose и все, может быть, так как-то это дело зацикливается, и expose вызывается больше, чем нужно?

anonymous
()
Ответ на: комментарий от cvv

Результаты gprof:

Flat profile:

Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
100.00 0.07 0.07 expose_cb
0.00 0.07 0.00 8048 0.00 0.00 wget_gdk_color
0.00 0.07 0.00 8048 0.00 0.00 wmnemo_set_font
0.00 0.07 0.00 1006 0.00 0.00 w_read_lockw
0.00 0.07 0.00 1006 0.00 0.00 w_ulockw
0.00 0.07 0.00 1006 0.00 0.00 watcher_shm_dup
0.00 0.07 0.00 35 0.00 0.00 check_endptr
0.00 0.07 0.00 14 0.00 0.00 wmgroups_item_free
0.00 0.07 0.00 7 0.00 0.00 sensor_index_in_shm
0.00 0.07 0.00 7 0.00 0.00 wmgroups_item_init
0.00 0.07 0.00 7 0.00 0.00 wmgroups_item_init_by_item
0.00 0.07 0.00 2 0.00 0.00 free_wmgroups_item
0.00 0.07 0.00 2 0.00 0.00 get_cfg_value_as_str
0.00 0.07 0.00 2 0.00 0.00 try_cfg_value_as_int

.
.
.
Call graph (explanation follows)


granularity: each sample hit covers 4 byte(s) for 14.29% of 0.07 seconds

index % time self children called name
<spontaneous>
[1] 100.0 0.07 0.00 expose_cb [1]
-----------------------------------------------
0.00 0.00 8048/8048 timeout [43]
[2] 0.0 0.00 0.00 8048 wget_gdk_color [2]
-----------------------------------------------
0.00 0.00 8048/8048 timeout [43]
[3] 0.0 0.00 0.00 8048 wmnemo_set_font [3]
-----------------------------------------------
0.00 0.00 1006/1006 watcher_shm_dup [6]
[4] 0.0 0.00 0.00 1006 w_read_lockw [4]
-----------------------------------------------
0.00 0.00 1006/1006 watcher_shm_dup [6]
[5] 0.0 0.00 0.00 1006 w_ulockw [5]
-----------------------------------------------
0.00 0.00 1006/1006 timeout [43]
[6] 0.0 0.00 0.00 1006 watcher_shm_dup [6]
0.00 0.00 1006/1006 w_read_lockw [4]
0.00 0.00 1006/1006 w_ulockw [5]
-----------------------------------------------

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

А здесь я всё правильно написал???

static gint expose_cb( GtkWidget      *widget, GdkEventExpose *event )                                                                           
{                                                                                                                                                
  gdk_draw_drawable (widget->window,                                                                                                             
                     widget->style->fg_gc[GTK_WIDGET_STATE (widget)],                                                                            
                     frame,                                                                                                                     
                     event->area.x, event->area.y,                                                                                               
                     event->area.x, event->area.y,                                                                                               
                     event->area.width, event->area.height);                                                                                     
                                                                                                                                                 
  gtk_widget_queue_draw (widget);                                                                                                                
                                                                                                                                                 
  return FALSE;                                                                                                                                  
}                                                                                                                                                

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

Вот оно, не правильно, конечно.

gtk_widget_queue_draw просто вызывает expose сигнал и заставляет еще раз выполниться expose_cb. Получаем бесконечную рекурсию.

Нужно вызывать gtk_widget_queue_draw в timeout'е, после того, как frame обновился. После этого произойдет expose и выполниться expose_cb, а в самом expose_cb queue_draw делать не нужно.

Хороший пример такого приложения - в gtk-demo есть пример Pixbufs (где картинки по кругу вертятся). Там можно все посмотреть.

anonymous
()
Ответ на: комментарий от anonymous

сердечно благодарю!!! Всё работает!!! я сам почти дошёл до такого решения правда исследуя другие исходники.

cvv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.