当前位置:  技术问答>linux和unix

GTK drawingarea 影响UI速度问题

    来源: 互联网  发布时间:2016-06-02

    本文导语:  Dear All:    本人开发Linux嵌入式视频播放软件,遇到一个问题。描述如下    软件分两个window:viewwin(包含drawingarea控件),controlwin(可以隐含)。    现象是,在播放流媒体的时候,click viewwin,controlwin会弹出。但是,...

Dear All:
   本人开发Linux嵌入式视频播放软件,遇到一个问题。描述如下
   软件分两个window:viewwin(包含drawingarea控件),controlwin(可以隐含)。
   现象是,在播放流媒体的时候,click viewwin,controlwin会弹出。但是,有的时候弹出会很慢。感觉UI 在不停的刷新控件上的图片。只有在播放A/V的时候会发生,如果播放audio就不会有慢得现象。

   问题:这种现象是怎么回事?

   on_drawingarea_expose_event代码如下。

   gboolean
on_drawingarea_expose_event            (GtkWidget       *widget,
                                        GdkEventExpose  *event,
                                        gpointer         user_data)
{
    //g_print("[on_drawingarea_expose_event]-----------------------------------------n");
    GtkWidget *drawing = GTK_WIDGET (user_data);
stx_dtvGstPipe *dtvGst = 
(stx_dtvGstPipe *) g_object_get_qdata (G_OBJECT (widget), g_dtvGstQrk);
stx_windStates *winSta = (stx_windStates *) g_object_get_qdata (G_OBJECT (g_winList->mainWin), g_winStaQrk);
GQuark pixBufQrk;
stx_logoPixbuf *logos;
static gint imgIdx = 0;
GstXOverlay *xoverlay = NULL;
gulong xwin_id = 0;
Gstvmixif *pIface=NULL;
GstvmixifClass *ifclass=NULL;
//    gint    x, y;        

  g_printf ("on_drawingarea_expose_eventnn");
         if (dtvGst) 
    {
if (GST_IS_ELEMENT (dtvGst->vsink) && GST_IS_X_OVERLAY (dtvGst->vsink)) 
        {
xoverlay = GST_X_OVERLAY (dtvGst->vsink);
xwin_id = GDK_WINDOW_XWINDOW (drawing->window);
if (xoverlay) {
                          
    gst_object_ref (xoverlay);
    
if (xwin_id) {
                            gst_x_overlay_set_xwindow_id (xoverlay, xwin_id);
                             }
                        else 
                            DBGDVB (printf ("xwin_id is NULLn"));
              DBGDVB (g_printf ("finish setting xoverlay"));
            }
}
    }

 
    gdk_draw_rectangle (drawing->window, drawing->style->black_gc, TRUE, 0, 0,
drawing->allocation.width, drawing->allocation.height);

pixBufQrk = g_quark_from_string ("logoPixbuf");
logos = g_object_get_qdata (G_OBJECT (g_winList->mainWin), pixBufQrk);

    if (winSta->logoMode == PLAYING) 
    {
DBGDVB (printf ("nPlaying.........n"));

_ImgIdx = 0; // reset the image index for no signal condition
     

if (xoverlay) {
if (firstoverlay) gst_x_overlay_expose (xoverlay);  // Modified by Thomas Lin, 2008-12-01, set at first time to skip showing the image
            firstoverlay = FALSE;
}

}
   

    if (xoverlay) 
    {
gst_object_unref (xoverlay);
}

DBGDVB (printf ("BYE BYE ....."));

   return FALSE;
}

|
你启动软件的时候先把那个控制窗口隐藏起来,不要临时新建,然后再显示。
如果视频在播放的话,你没必要处理expose的,因为每帧都会重新显示
再者我处理这种情况,我会使用一个单独的线程更新UI,不过要注意用
gdk_threads_enter同步

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 关于gtk的目录问题,我的目录是 gtk-2.0/gtk/gtk.h ??
  • Redhat linux9.0 下Gtk+编程的#include <gtk/gtk.h>问题
  • 【重要】gtk+ 编译gtk+的问题,不同于一般gtk的搭建--1000分,问题解决了,开号给分,决不食言!大家都来看看
  • gtk 和 gtk+ 有什么区别?
  • centos5.4中安装gtk时,yum库最新版是gtk2.10,如何更新yum库安装gtk2.12
  • 我使用GTK+2.0写界面程序时,怎么找不到gtk.h文件?
  • java开源软件 iis7站长之家
  • gtk for win 和 gtk for linux 下的程序问题?
  • GTK窗口前端显示及GTK窗口闪烁
  • 用GTK开发的程序如何在没有GTK动态连接库的Linux里运行?
  • 【GTK】GTK中有没有这个widget?
  • 我想学习GTK+2.0,请问如何准备GTK编程环境???
  • [GTK] gtk最小化问题与恢复问题
  • 【gtk+】初学gtk+,请教一个问题
  • 【gtk】关于gtk布局问题
  • 本人刚学gtk编程,留下油箱,欢迎喜欢gtk编程的朋友和我交流啊!!!!
  • 大家好,想知道gtk与gtk+有什么区别?
  • 关于GTK中gtk_widget_hide()的问题
  • gtk编程问题,如何在一个线程中向gtk控件发送一个expose_event消息
  • gtk中如何获取gtk_text_view中的输入内容?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3