gtk多线程更新界面

原文地址: http://my.oschina.net/eatapple/blog/89847

以前一直困扰在gtk中使用多线程更新界面的问题,今天终于解决。在写下解决方法,以备后查。

    这里以textview中动态显示socket更新数据为例。首先建立socket,然后使用g_idle_add函数添加读取socket函数。在该函数中更新textview中的数据,并且返回一个正值(或者false,用以让gtk循环执行该函数,如果不返回或者返回true则在执行一次后或者返回true后gtk不再执行该函数)。在该函数中利用select解决socket的堵塞问题即可。利用shutdown关闭socket,在idle函数中通过select和recv的函数返回值可以检测socket是否关闭。可以选择在关闭的时候通过g_idle_remove_by_data取消该函数的执行,或者在idle函数中检测socket关闭后返回true。

callback.c

01 #include "callback.h"
02 #include "asterisk.h"
03  
04 void on_connect_clicked(GtkToolItem *button,gpointer data)
05 {
06         if(asterisk_in()!=-1)
07         {
08                 gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(button),GTK_STOCK_DISCONNECT);
09                 g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_disconnect_clicked),data);
10                 g_idle_add((GSourceFunc)asterisk_refresh_ui,data);
11         }
12 }
13  
14 void on_disconnect_clicked(GtkToolItem *button,gpointer data)
15 {
16         if(asterisk_out()==0)
17         {
18                 GtkTextBuffer *buffer;
19  
20                 gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(button),GTK_STOCK_CONNECT);
21                 g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_connect_clicked),data);
22                 g_idle_remove_by_data(data);
23                 buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(data));
24                 gtk_text_buffer_set_text(buffer,"",-1);
25         }
26 }
asterisk.c
01 #include "asterisk.h"
02  
03 int sockfd;
04  
05 int asterisk_in()
06 {
07     struct sockaddr_in addr;
08     char buffer[1024];
09  
10     bzero(&addr,sizeof(addr));
11     addr.sin_family=AF_INET;
12     addr.sin_port=htons(5038);
13     addr.sin_addr.s_addr=inet_addr("127.0.0.1");
14  
15     if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
16     {
17         perror("create socket");
18         return -1;
19     }
20     if(connect(sockfd,(struct sockaddr *)&addr,sizeof(addr))==-1)
21     {
22         perror("connect to socket");
23         return -1;
24     }
25     sprintf(buffer,"Action: login\r\nUsername: ami\r\nSecret: ami\r\n\r\n");
26     if(send(sockfd,buffer,strlen(buffer),0)!=strlen(buffer))
27         return -1;
28      
29     return sockfd;
30 }
31  
32 int asterisk_out()
33 {
34     close(sockfd);
35     shutdown(sockfd,2);
36  
37     return 0;
38 }
39  
40 int asterisk_refresh_ui(GtkWidget *textview)
41 {
42     char content[BUFSIZ];
43     fd_set fd;
44     struct timeval stime={0,0};
45     GtkTextBuffer *buffer;
46     GtkTextIter end;
47  
48     FD_ZERO(&fd);
49     FD_SET(sockfd,&fd);
50     if(select(sockfd+1,&fd,NULL,NULL,&stime)>0 && FD_ISSET(sockfd,&fd))
51     {
52         bzero(content,sizeof(content));
53         recv(sockfd,content,sizeof(content),0);
54         buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
55         gtk_text_buffer_get_end_iter(buffer,&end);
56         gtk_text_buffer_insert(buffer,&end,content,-1);
57     }
58  
59     return 1;
60 }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Windows平台上的GTK是用于创建图形用户界面(GUI)的一种工具包。它是一种跨平台的工具包,可以在多种操作系统上运行,包括Windows,Linux和Mac OS X。GTK与GNOME桌面环境密切相关,它为GNOME提供了默认的用户界面工具包。如果你想在Windows平台上使用GTK,你需要下载和安装GTK的Windows版本,然后使用你喜欢的编程语言和开发工具编写和构建你的应用程序。 ### 回答2: Windows GTK是一种桌面应用程序开发工具包,它提供了一套用于创建跨平台图形用户界面(GUI)的编程接口。GTK是一种开源工具包,最初是为Unix-like系统设计的,但随后也被移植到了Windows平台上。 使用Windows GTK,开发者可以使用C、C++、Python等编程语言来创建各种不同类型的应用程序,如文件管理器、文本编辑器、音乐播放器等。GTK提供了丰富的控件库,包括按钮、文本框、下拉菜单等,开发者可以利用这些控件来构建用户界面。 Windows GTK还提供了许多有用的功能和特性,例如图形绘制、事件处理、多线程支持等。开发者可以使用GTK的API来实现自己的业务逻辑,同时也可以利用GTK的插件系统来扩展应用程序的功能。 相比于其他图形用户界面工具包,Windows GTK具有一些独特的优势。首先,它是一个跨平台工具包,开发者可以在不同的操作系统上运行相同的代码。其次,Windows GTK具有良好的可定制性,开发者可以根据自己的需求来修改和扩展GTK的功能。此外,GTK还拥有一个庞大的开源社区,开发者可以从中获取各种资源和支持。 总之,Windows GTK是一个功能强大的桌面应用程序开发工具包,它可以帮助开发者快速构建出高质量的跨平台应用程序。无论是初学者还是有经验的开发者,都可以通过使用GTK来简化开发过程,提高工作效率。 ### 回答3: Windows GTK是指适用于Windows操作系统的GTK(GIMP Toolkit)开发环境。GTK是一种开源的跨平台图形用户界面库,最初为GNU Image Manipulation Program(GIMP)设计,后来逐渐发展成为一个通用的GUI工具包。 Windows GTK提供了一系列可以在Windows系统上进行GUI应用程序开发的工具和库。通过使用Windows GTK,开发者可以使用C、C++、Python等编程语言创建具有各种功能和特性的Windows GUI应用程序。GTK提供了丰富的API和控件,包括按钮、文本框、滑块、菜单等,开发者可以根据自己的需求选择合适的控件进行界面设计。 在使用Windows GTK开发应用程序时,开发者还可以使用Glade这样的可视化界面设计工具来简化界面布局和控件配置的过程。Glade可以将界面设计与代码分离,使得开发者更加专注于应用程序的业务逻辑的实现。 Windows GTK作为跨平台的GUI工具包,除了在Windows系统上可以进行开发外,还可以在其他操作系统上使用相同的代码进行开发,如Linux和macOS。因此,使用Windows GTK可以实现在不同平台上开发一致的GUI应用程序,并且减少了开发和维护的工作量。 总之,Windows GTK是一个适用于Windows操作系统的开发环境,提供了一系列工具和库,可以用于创建功能丰富的GUI应用程序。通过使用Windows GTK,开发者可以方便地进行界面设计和控件配置,并实现跨平台的应用程序开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值