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有更快的图像刷新方法吗 ?
draw图片的时候要前后加上 gdk_threads_enter(),gdk_threads_leave()
===》三楼:我的就是gtk+dfb的,感觉移植后控件和内存都耗的巨大,可能优化的不够,现在速度和内存占用都不理想
--------------------
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;
}