GTK+ 构件刷新问题

GTK响应事件使用的是信号处理函数,信号处理函数不返回主函数,构件就是不刷新。所以在一个信号处理函数里连续改变一个构件的显示,只能看到最后一种情况。

把下面的代码放在需要刷新的地方即可

while(gtk_events_pending()){ 

             gtk_main_iteration();         

}         

sleep(1);  

 

--------------------------------------------------------------------------

 

如果是计算密集型的程序,我想,应该有两个进程或线程,一个负责屏幕刷新与鼠标与健盘事件响应,另一个做很占资源的事,两者之间用进程间通信或其它方式通信。

--------------------------------------------------------------------

 

GTK,怎么弄非阻塞信号?

一般我们会这样连接一个signel去callback
g_signal_connect (GTK_OBJECT (button), "clicked",G_CALLBACK (myfun), NULL);
问题是callback的时候,整个窗口处于阻塞状态,在myfun没有return以前,你无法去点窗口里面其他按扭

我先解决的是,在点按钮以后,allback子程序,这里窗口还能继续操作
当然不能用fork,因为子程序执行过程中还要改变窗口里面的一些显示内容

 

-----------

 

建议你看看GTK Main Event Loop和Glib Main loop的文档,这个不搞清楚根本做不了实际的项目.
常用的方法是用一个main_loop做非阻塞的循环,然后再timeout_add来调用callback;或者:

while (gtk_events_pending())
gtk_main_iteration();

------------

 

Thread:

http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq20.006.htp

虽然是Python,道理是一样的。

---------------

 

所以 gtk+ 有专门的保护 thread 的 API,基本上所有的GUI都有这个问题,不论Windows, gtk+ 还是 qt,没有上锁是不能同时操作图形界面的。

如果上了锁还有问题,那就是程序库的编程错误了,gtk+ 的windows 上的线程似乎问题还不少,*nix 上看到的错误报告现在很少,错误是可以修正的。不过不论怎么样,都不建议在多线程里交叉呼叫图形界面。最好用一个线程管理所有图形界面,其他的线程做非图形界面的工作。

gtk+的线程保护锁主要是给懒人用的,但是懒人用多线程,不管是不是图形界面的,问题都会多。

------------------------------------------------------------------------------------------

 

gtk有更快的图像刷新方法吗 ?

 

我用gtk来实现了一个图片的过渡效果,每一帧画面处理完后调用gtk_widget_queue_draw_area来引发expose_event事件,然后在expose_event事件的回调函数中绘制图像,在pc上效果还可以接收,可是在嵌入式机器里面反应巨慢,我测试了一下,在我引发信号到进入到expose_event回调函数里要几百毫秒的时间,这显然是太慢了(希望能在10毫秒以内),gtk的机制如此没办法,不知道除了这样做还没有更实时的绘制方法,即我每帧的画面处理完后能立即显示出来,知道的朋友还望不吝赐教,小弟感激不尽!
------------------
直接用个线程不就可以了,搞个信号量,然后让这个线程等待信号量,图片处理的时候会占用信号量,而绘制线程就等待信号量,取得信号量后直接gdk_draw_rgb_image就可以了。
draw图片的时候要前后加上 gdk_threads_enter(),gdk_threads_leave()
------------------
多谢二楼的回复!按你的意思那就是调用gtk_window_draw_rgb()就立即可以显示了吗,不需要等到触发expose_event事件到了就行了,如果这样的话就好办了,我每帧处理完直接调它就行了,不用设置无效区了,那就真是太理想了,不过你这函数根本就不存在还是你打错了呀,但我看到的一些代码都是要设置无效区的

===》三楼:我的就是gtk+dfb的,感觉移植后控件和内存都耗的巨大,可能优化的不够,现在速度和内存占用都不理想

--------------------

我试了一下,你说的的确是可以的,我调用gdk_draw_rgb_image()后是可以立即画出来,不过是在pc上,我pc的gtk是2.10,但是嵌入式中画不出来,可能gtk+dfb中没有支持到这个函数,郁闷了
--------------------
又测试了一下,我原来在expose-event回调函数里面用gdk_draw_pixbuf()画的,现在直接在每一帧处理完了调用它也可以画出来的,和gdk_draw_rgb_image()效果一样,现在的问题是在pc上这两个函数调用都可以刷新画面,可是在gtk+dfb构架的嵌入式机器上就都画不出来,除非每一帧处理完设置无效区域,然后在expose-event回调函数中调他们,难道gtk+dfb的构架就只能在expose-event的回调函数中来画图吗
-------------------
考虑下gtk_widget_send_expose直接进入重绘
---------------
GTK机制如此,导致各种方法都不能有效加速画面的刷新速度,我现在的做法是在gdk-directfb层面增加一个接口,重新编译库,使我在gtk程序中可以调用该接口取得gdk的图像渲染所使用的dfb的surface,然后我在动画效果时的代码实际上是一段dfb程序,将图像直接渲染到该surface上,跳过了gdk的那些东东,我试了一下初步取得成功,并且不影响gtk窗口的事件处理,全屏从上到下依次画隔行直线速度还不错,继续改进一下看看图片显示速度怎么样,我弄成功的话将方法写出来大家一起讨论讨论。
 
----------------------------------------------------------------------------------------------
Textview 显示问题 ?
在textview中动态显示信息的函数,可是只能在命令行显示正确数据,textview中滚动条一直往下走,但未显示任何数据,请大家多多指教!
void insert_text1()
{
GtkWidget *text1;
GtkTextBuffer * buffer1;
GtkTextIter start,end;
gchar * escape, * text;

text1=lookup_widget(window,"text1");
escape=g_strescape(buffer,NULL);//buffer为一全局变量,每次函数调用前已初始化好
text=g_strconcat(escape,"/n",NULL);
buffer1=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text1));
gtk_text_buffer_get_end_iter(buffer1,&end);
while (gtk_events_pending ())     
            gtk_main_iteration ();                  
gtk_text_buffer_insert(buffer1,&end,text,-1);
printf("%s/n",text);//在命令行能正确显示数据输出
g_free(escape);
g_free(text);
return;
}
-------------------
把textview的回调函数去掉就好了
 
 
 
---------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值