GTK中使用多线程

GTK搭建数采程序的多线程解决方法 http://stackoverflow.com/questions/8826523/gtk-main-and-unix-sockets 在stackoverflow上 阅读详情

刚开始学习GTK编程,中间遇到很多问题,将解决方法记录下来,

希望多多交流

1。添加多线程支持库,先make clean 清除;再将将configure.in文件中的

PKG_CHECK_MODULES(GTK,gtk+-2.0   gdk-2.0,  , exit)改为

PKG_CHECK_MODULES(GTK,gtk+-2.0   gdk-2.0  gthread-2.0 ,  , exit)

2.或者使用手动编译,命令如下

gcc -o thread thread.c `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`

3.示例代码

#include <gtk/gtk.h> 
static GtkWidget *fixed; 
static GtkWidget *button1; 
static GtkWidget *button2; 
void our_thread1(GtkWidget *button) 
{ 
 gint x,y,towards; 
 x=40; 
 y=40; 
 towards=1; 
 for (;;) 
 { 
     g_usleep(4); 
  gdk_threads_enter(); 
  gtk_fixed_move(GTK_FIXED(fixed),button,x,y); 
  switch(towards) 
  { 
  case 1: 
   x=x+10; 
   if (x==250) towards=2; 
   break; 
  case 2: 
   y=y+10; 
   if (y==250) towards=3; 
   break; 
  case 3: 
   x=x-10; 
   if (x==40) towards=4; 
   break; 
  case 4: 
   y=y-10; 
   if (y==40) towards=5; 
  } 
  gdk_threads_leave(); 
 } 
} 

void our_thread2(GtkWidget *button) 
{ 
 gint i,j,forward; 
 i=40; 
 j=40; 
 forward=1; 
 for (;;) 
 { 
  g_usleep(1); 
  gdk_threads_enter(); 
  gtk_fixed_move(GTK_FIXED(fixed),button,i,j); 
  switch(forward) 
  { 
  case 1: 
   i=i+10; 
   if (i==290) forward=2; 
   break; 
  case 2: 
   j=j+10; 
   if (j==250) forward=3; 
   break; 
  case 3: 
   i=i-10; 
   if (i==40) forward=4; 
   break; 
  case 4: 
   j=j-10; 
   if (j==40) forward=5; 
  } 
  gdk_threads_leave(); 
 } 
} 
void on_begin(GtkWidget* button,gpointer data) 
{ 
 gtk_widget_set_sensitive(button,FALSE); 
 g_thread_create(our_thread1,button1,FALSE,NULL); 
 g_thread_create(our_thread2,button2,FALSE,NULL); 
} 

int main(int argc,char* argv[]) 
{ 
 GtkWidget *window,*view; 
 GtkWidget *vbox,*button,*label; 
 if (!g_thread_supported()) 
  g_thread_init(NULL); 
 gdk_threads_init();

 gtk_init(&argc,&argv); 
 window=gtk_window_new(GTK_WINDOW_TOPLEVEL); 
 gtk_window_set_title(GTK_WINDOW(window),"thread apllication"); 
 g_signal_connect(G_OBJECT(window),"delete_event", 
  G_CALLBACK(gtk_main_quit),NULL); 
 gtk_container_set_border_width(GTK_CONTAINER(window),10); 
 vbox=gtk_vbox_new(FALSE,0); 
 gtk_container_add(GTK_CONTAINER(window),vbox); 
 label=gtk_label_new("Notice! Button is moving"); 
 gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); 
 view=gtk_viewport_new(NULL,NULL); 
 gtk_box_pack_start(GTK_BOX(vbox),view,FALSE,FALSE,0); 
 fixed=gtk_fixed_new(); 
 gtk_widget_set_usize(fixed,330,330); 
 gtk_container_add(GTK_CONTAINER(view),fixed); 
 button1=gtk_button_new_with_label("1"); 
 button2=gtk_button_new_with_label("2"); 
 gtk_fixed_put(GTK_FIXED(fixed),button1,10,10); 
 gtk_fixed_put(GTK_FIXED(fixed),button2,40,40); 
 
 button=gtk_button_new_with_label("Start"); 
 gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,5); 
 g_signal_connect(G_OBJECT(button),"clicked", 
  G_CALLBACK(on_begin),NULL); 
 gtk_widget_show_all(window); 
 gdk_threads_enter(); 
 gtk_main(); 
 gdk_threads_leave(); 
 return FALSE; 
} 
//编译选项如下: 
//gcc -o thread thread.c `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`
gtk4+gdb线程观察-线程卡牢为哪般 这个程序我看是2023年上传的,用的是gtk2,在我的机器上死活跑不起来,界面直接死掉退出。假期出去几天,10.6开始在家休息两天,这两天仔细研究了这个程序,终于将gtk2迁移改造为gtk4,可以在我的ubuntu 上运行了。不过有个缺点,就是界面不能换行,加了\n就运行异常,估计还是没有学好gtk4。这也不影响使用GDB调试这个多线程程序,让我们开始结合这个slock.cpp(我缩短了文件名称)来操练gdb多线程调试吧。lsof -p 30133 --列出打开的文件描述符。可以通过lsof来获取。 阅读详情

相关推荐

Linux平台下C语言与GTK聊天程序开发实战

在信息技术飞速发展的今天,即时通讯已成为我们生活中不可或缺的一部分。Linux系统作为服务器和专业开发者的首选,构建一个基础的聊天程序不仅能让我们理解底层通信原理,还能够为后续开发复杂应用打下坚实的基础。本文将从零开始,详细介绍如何在Linux环境下开发一个具备基本功能的聊天程序。C语言作为一种高级编程语言,自1972年由Dennis Ritchie在AT&T的贝尔实验室开发以来,一直是编程界的宠儿。在Linux环境下,C语言的使用尤为突出,原因在于Linux内核就是用C语言编写的。

weixin_32252929的博客 569

GTK+ 多线程

GTK+ 多线程操作 操作 UI 元素时,早期一般都是使用gdk_thread_enter() / gdk_thread_leave() 来进行线程间同步。 但是 GTK+ 3.6 开始,不建议使用该函数对。仔细考虑下,似乎有些道理。频繁的调用 gdk_thread_enter() / gdk_thread_leave()确实影响 GTK+ 的性能,并且容易出现莫名的错误。但是,如何...

weixin_33928137的博客 367

Linux 中GTK+编程技术研究及其应用

Linux 环境下大部分图形用户界面程序采用GTK+加以实现。介绍了用GTK+开发应用程序的基本思想 和方法,叙述了基于GTK+和Glade 的界面布局方式和信号捕捉的实现。在对GTK+编程技术研究的基础上,结合多线 程和套接字编程技术,实现了一个简单的网络聊天室程序。

对于gtk多线程编程的一些思考以及实践归纳系列(1)

写一个gtk的界面很久了,因为慢慢的在改良我的软件,所以也开始发现一些棘手的问题,当然,我这边指的问题只是gtk线程方面的问题,或者说如何才能执行一个界面以外的任务而使得界面不卡死,这样的任务包括多种多样,我这边有一些完成的方式,还有一些还没实现的,请大家听我一一道来。 首先我给大家列举几个gtk中最常见的这方面的函数: g_timeout_add,g_timeout_add_seconds ......

FlayHigherGT的博客 4084

11种图像清晰度评价函数附MATLAB代码

博主的第一篇博客! 本科毕业论文是“基于图像处理的自动对焦技术研究”,对焦过程中的一个重要阶段是图像清晰度评价,博主自己用MATLAB实现了4类清晰度评价函数:基于图像梯度的清晰度评价函数、频域评价函数、信息熵评价函数、统计学评价函数,总计11种。博主之前没有用过MATLAB,完全是本科论文需要,没办法对着别人的代...

kungfu_rabbit的博客 5万+

Dify 从入门到精通:第一篇 - 基础介绍与快速上手

Dify是一个开源的低代码平台,旨在简化大型语言模型(LLM)应用的开发流程。本文作为"Dify从入门到精通"系列的首篇,全面介绍了Dify的核心概念、安装步骤和基本使用方法。文章首先解析了Dify的多模型支持、低代码开发等特点,然后详细讲解了基于Docker的安装配置过程,包括系统要求、环境变量设置等。通过创建一个邮件助手应用的实际示例,展示了Dify的可视化工作流设计功能。最后简要介绍了高级特性和最佳实践,为后续深入学习奠定基础。本文为开发者提供了从零开始使用Dify构建AI应用的完

IT深耕十余载,大道之简 1147

二十五、Gtk4-多线程分析

首先回顾一下GLib,GObject,GIO,Gtk的不同,因为下面会涉及到这些概念里面的函数。所有这些都是由Gnome项目开发的库,一般都用于Gnome环境相关的应用程序。

Creationyang的博客 1529

spyglass之功耗分析

用于功耗分析的软件除了ptpx外,spyglass也可以。ptpx的功耗分析是基于netlist(网表)进行的,一般用于分析综合后的pre功耗和P&R后的post功耗,但这已经是项目进行到比较后期了,如果后期发现功耗数据与我们目标功耗相差较大,则意味着需要功耗优化,这时有可能会将项目计划节点延迟。如果在前期designer可以获得设计模块的功耗数据,可提早优化功耗,spyglass则为designer提供了一个很好的手段去评估功耗,从而提前优化功耗。

u011974971的博客 9195

GTK线程的简单使用与线程中更新图形界面

GTK线程的简单使用与线程中更新图形界面   1)线程的简单使用,通过一个简单例子来说明(能运行)   编译命令:gcc   `pkg-config gtk+-2.0 --cflags --libs gthread-2.0` -std=gnu99  -o thread  thread.c注意要加上gthread-2.0     #include &lt;gtk/gtk.h&gt; ...

EyeT Hexleo 824

数学向量空间的对偶空间解析

对偶空间是线性代数的"进阶语法",它不仅深化了我们对向量空间的理解,还为解决实际问题提供了强大工具。用生活类比解释对偶空间的核心概念,打破"抽象数学"的壁垒;建立对偶空间与原向量空间的直观联系,揭示"对偶"的本质;通过数学推导和代码实现,让读者掌握对偶空间的基本运算;展示对偶空间在科学和工程中的应用,体现其理论价值。范围:本文从有限维实向量空间入手(便于理解),逐步扩展到对偶基、双对偶空间,最后简要提及无限维空间的特殊性。

AI天才研究院 879

数控系统(CNC)系列:Fanuc 31i-B_(5).基本操作与编程

Fanuc 31i-B 系统使用 G 代码和 M 代码进行编程。G 代码主要用于控制机床的运动,M 代码用于控制辅助功能,如冷却液开关、主轴启动等。G 代码:用于指定机床的运动方式。例如,G00 用于快速定位,G01 用于直线插补,G02 用于顺时针圆弧插补,G03 用于逆时针圆弧插补。M 代码:用于控制机床的辅助功能。例如,M03 用于启动主轴顺时针旋转,M05 用于停止主轴,M08 用于开启冷却液,M09 用于关闭冷却液。

2401_87715305的博客 1766

gtk多线程控制暂停和继续.(HAI)

import threading import time import os event = threading.Event() def walk(path): event.wait() try: if os.path.isdir(path): for file in os.listdir(path): file_path = os.path.join(path, fil

strom_long的专栏 887

22、常见加密哈希算法及安全机制解析

本文详细解析了多种常见加密哈希算法,包括SHA系列、RIPEMD、Tiger、HAVAL、Whirlpool等,涵盖其工作原理、安全性与性能对比。同时探讨了哈希攻击方式如预映像攻击和彩虹表,并介绍了盐、MAC、HMAC等防御机制。结合密码存储、消息完整性验证及区块链应用案例,分析了不同场景下的算法选择建议,并展望了哈希算法在创新、融合与标准化方面的未来发展趋势。

seed的博客 391

GTK多线程界面更新(续)

原文地址:http://my.oschina.net/eatapple/blog/97180 上一篇《GTK多线程更新界面》中,我提到可以通过使用空闲函数来替代多线程处理GTK。随着对GTK的了解,发现这样并不是所有情况都合适。      第一,如果使用空闲函数来处理socket程序,可能会造成数据接收不及时,特别是针对一些对数据及时性要求很高的程序。因为空闲函数只会在用户不对界面进行操作的时

yazhouren的专栏 1418

斑鬣狗优化算法(SHO)详解:从生物原理到代码实战

斑鬣狗优化算法(SHO)是一种新型元启发式优化算法,灵感来源于斑鬣狗的群体狩猎行为。该算法通过模拟斑鬣狗的包围猎物、协同狩猎和攻击猎物等生物行为,将优化问题转化为智能搜索过程。SHO算法包含探索与开发两个阶段,通过数学模型实现群体协作和自适应平衡,具有参数简单、收敛快等优势。文章系统介绍了SHO的生物基础、数学模型、实现方法(包括MATLAB和Python代码)、改进策略以及在函数优化、路径规划等领域的应用案例,最后讨论了算法的优势、局限性和未来研究方向。

qq_42212808的博客 237

UWB:FiRa Consortium UCI Generic Technical Specification v1.1.0(1)- UCI架构和通用数据包头

如果大家学习过WiFi的SPEC,比如从我的资源里面下载 IEEE 802.11-2007,应该很容易发现,FiRa的spec定义实在是太差了。有现成的好例子不学,非得自己来一套,搞一堆新的名词,其实都是一个意思。比如GID,OID等,而且GID、OID是最先出现的,但是对应表格 还得去附件的最后一项去找。 FiRa是UWB联盟,希望跟WIFi联盟学习一下,把UWB做大做强,而不是自成一派,自命不凡。

Ankie资深技术项目经理 2434

linux gtk_timeout_add用法,如何在GTK中每隔一段时间自动触发一个回调函数?

该楼层疑似违规已被系统折叠隐藏此楼查看此楼其实应该用多线程#include #include #include static char buffer[256];static gbooleanon_expose_event(GtkWidget *widget,GdkEventExpose *event,gpointer data){cairo_t *cr;cr = gdk_cairo_create...

weixin_29576039的博客 460

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

gtk 多线程

#include typedef struct _Ourarg Ourarg;struct _Ourarg { GtkWidget *fixed; GtkWidget *image; gint right; gint left;};void image_go(Ourarg *arg){ gint x, y, toward; x = y = arg->le

1070

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

PyGTK 多线程

当PyGTK升级到2.4之后,不知是我的错误还是PyGTK的bug,很多与多线程有关的调用都发生了错误。这两天,我花了很多时间来修改coralftp中关于线程的问题,现在总结一下。     PyGTK是可以支持多线程的,在多线程程序的头部,必须有一个gtk.threads_init()调用,否则程序会运行地出奇地慢并伴随各种错误。     PyGTK 多线程的编程一般有两种模型,一种是通过gt

crazy_fire 1031

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

gtk多线程更新界面

原文地址:http://my.oschina.net/eatapple/blog/89847 以前一直困扰在gtk中使用多线程更新界面的问题,今天终于解决。在写下解决方法,以备后查。     这里以textview中动态显示socket更新数据为例。首先建立socket,然后使用g_idle_add函数添加读取socket函数。在该函数中更新textview中的数据,并且返回一个正值(

yazhouren的专栏 2071

gtk定时器的使用

定时器可以周期性执行任务

m0_60352504的博客 828

GTK 多线程例子

 GTK线程的简单使用与线程中更新图形界面   1)线程的简单使用,通过一个简单例子来说明(能运行)   编译命令: gcc   `pkg-config gtk+-2.0 --cflags --libs gthread-2.0` -std=gnu99  -o thread  thread.c 注意要加上gthread-2.0     C代码   #in

大步朝前 5468

gthread使用注意

1、初始化gthread      if (!g_thread_supported ()) //如果gthread没有被初始化             g_thread_init (NULL);  //进行初始化      gdk_threads_init ();        //初始化GDK多线程,这样可以在多线程中使用成对的gdk_threads_enter()和gdk_thre

Just Programming Myself (c_spark) 9191
上一篇: c++中的delete和delete[]
下一篇: 老鼠爱大米
大漠银狐
博客等级 码龄25年 6粉丝 31原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值