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

GTK多线程编程

    来源: 互联网  发布时间:2016-05-10

    本文导语:  谁有GTK多线程编程比较经典的例子 覆盖GTK多线程大多数知识的那种例子 画面效果不要求 主要是逻辑方面 谢谢~ | g_thread_init(0); gdk_threads_init(); gtk_init(&argc,&argv); /**  * time_update_thread:  *...

谁有GTK多线程编程比较经典的例子 覆盖GTK多线程大多数知识的那种例子 画面效果不要求 主要是逻辑方面 谢谢~

|
g_thread_init(0);
gdk_threads_init();
gtk_init(&argc,&argv);


/**
 * time_update_thread:
 * 这个线程用来显示系统当前的时间,
 * 显示格式为 2008-02-24 16:53:00 
 */

//获取系统时间
//FIXME:fmt-字符化时间的格式,返回字符型的时间
//get_time("%Y-%m-%d %H:%M:%S");//"%F %An%T"
static const char* get_time(const char *fmt)
{
time_t tmt;
struct tm *tm;
static char text[32];

tmt = time(NULL);
tm = localtime(&tmt);

if(fmt == NULL)//默认的时间格式
fmt = "%Y-%m-%d %H:%M:%S";

strftime(text,sizeof(text),fmt,tm);

return text;
}

static void time_update_thread_func(void)
{
//time_t tmt;
//struct tm *tm;
//char text[32];

const char *text;

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);

while(1){
//tmt = time(NULL);
//tm = localtime(&tmt);
//strftime(text,sizeof(text),"%Y-%m-%d %H:%M:%S",tm);//"%F %An%T"

text = get_time("%Y-%m-%d %H:%M:%S");

gdk_threads_enter();
gtk_label_set_text(GTK_LABEL(wbus->time),text);
gdk_threads_leave();

sleep(1);
}

return ;
}





void xxxxxx_do_frame_sync(struct frame_t *frame)
{
gdk_threads_enter();
wbuscanner_do_frame(frame);
gdk_display_flush(gdk_display_get_default()); //刷新显示
gdk_threads_leave();
}


|
如果调用次数多的话,gdk_threads_add_idle的效率要慢很多

|
多线程操作UI记得要用gdk_threads_enter,leave来同步, gdk_threads_add_idle增加一个临时运行资源,这个是主线程调用的,并没有创建线程,有些界面操作可以由它来负责

static gboolean idle_update_mach_status(struct reply_t *reply)
{
__update_mach_status(reply);
return FALSE;
}

void wbuscanner_reply_handler(struct reply_t *reply)
{
gdk_threads_add_idle((GSourceFunc)idle_update_mach_status,(gpointer)reply);
}



GTK中的线程能用到的也就这些了,其他的都是pthread的了,比较容易出错的都是同步问题

|
gtk+的多线程编程不在于滥用gdk_thread_enter()/leave(),在于使用g_idle_add.

网上各种文章都强烈建议,所有对于GUI的操作都在一个线程内完成,其他可能导致阻塞的工作在另外一个线程中。

所以
gdk_threads_enter();
gtk_label_set_text(GTK_LABEL(wbus->time),text);
gdk_threads_leave(); 
这样的代码应该替换为:
g_idle_add(on_finish, wbus);//子线程中。

gboolean on_finish(gpointer wbus)
{
  gtk_label_set_text(GTK_LABEL(wbus->time),text);
  return FALSE;
}

参考:
http://gnomerocksmyworld.blogspot.com/2006/05/getting-off-my-lazy-arse.html

    
 
 

您可能感兴趣的文章:

  • gtk编程问题,如何在一个线程中向gtk控件发送一个expose_event消息
  • 线程函数里不能调用消息对话框吗?(GTK界面)
  • 关于gtk多线程界面的问题
  • 一个线程函数如何取得GTK界面的所有控件指针?
  • GTK使用空闲处理函数解决线程同步时出现的一个诡异现象
  • gtk中如何让另一个线程向GUI线程发送自定义消息?
  • 本人刚学gtk编程,留下油箱,欢迎喜欢gtk编程的朋友和我交流啊!!!!
  • Redhat linux9.0 下Gtk+编程的#include <gtk/gtk.h>问题
  • 我想学习GTK+2.0,请问如何准备GTK编程环境???
  • gtk编程中关于gtk_widget_show函数的问题
  • 请教linux下的编程的选择:我听说有gtk+gnome的编程,也有kde里的 什么编程,到底应该选择哪个呢?好象一个是技术好一点,一个是市场占有
  • gtk编程的报错了
  • GTK 界面编程有问题,求解
  • GTK编程问题
  • GTK+编程用什么函数实现窗口的最大化最小化控制?
  • 请推荐一本GTK+编程书籍
  • 一个关于gtk编程问题?
  • gtk编程问题2?
  • gtk编程如何改变创建窗口的大小?
  • 请问各位大虾,用gtk编程如何让图片缩放,旋转?
  • X Window编程Qt,GTK哪个比较好
  • linux下的gtk编程
  • 请问GTK下编程,如何将一个图片设计成一个按钮?谢谢!
  • gtk编程求助:程序里打开了一个子窗口,如何等子窗口关闭后再继续往下执行?
  • 在windows下用Gtk编程,如何配置
  • gtk编程中的警告错误啊,怎么解决啊?????
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 关于gtk的目录问题,我的目录是 gtk-2.0/gtk/gtk.h ??
  • 【重要】gtk+ 编译gtk+的问题,不同于一般gtk的搭建--1000分,问题解决了,开号给分,决不食言!大家都来看看
  • gtk 和 gtk+ 有什么区别?
  • centos5.4中安装gtk时,yum库最新版是gtk2.10,如何更新yum库安装gtk2.12
  • 我使用GTK+2.0写界面程序时,怎么找不到gtk.h文件?
  • GTK+ gtk_tree问题
  • gtk for win 和 gtk for linux 下的程序问题?
  • GTK窗口前端显示及GTK窗口闪烁
  • 用GTK开发的程序如何在没有GTK动态连接库的Linux里运行?
  • 【GTK】GTK中有没有这个widget?
  • [GTK] gtk最小化问题与恢复问题
  • 【gtk+】初学gtk+,请教一个问题
  • 【gtk】关于gtk布局问题
  • 大家好,想知道gtk与gtk+有什么区别?
  • 关于GTK中gtk_widget_hide()的问题
  • gtk中如何获取gtk_text_view中的输入内容?
  • GTK+中类似gtk_hbox_new这样的给构件分配内存的函数 为什么不用手动释放?
  • 请问:gtk有哪些信息啊,delete_event是不是个信息啊,哪有gtk信息的资料啊,帮助上有吗?
  • 新手问题:gtk+-2.0.0.tar.gz和gtk+-2.0.0.tar.bz2这两个文件是什么关系啊?
  • 高分请教,如何能够使GTK能够在gtk生成的窗口里面放一个其它程序的窗口?


  • 站内导航:


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

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

    浙ICP备11055608号-3