March 2020

Gtk 修改GtkLabel、GtkEntry等的文本颜色,添加下划线,更改字体大小等相关属性

代码如下,将Widget传进函数即可,之后相关属性会相应改变.

详情见注释

也可以进一步封装,根据widget类型,自动调整逻辑,同时适应Entry和Label等的属性设置:

Continue reading...

C语言sleep不起作用

原因如下:

sleep() causes the calling thread to sleep either until the number of real-time seconds specified in seconds have elapsed or
until a signal arrives which is not ignored.

sleep有两种情况会被打破,一是时间已经到了,二是有信号来临

所以sleep提前终止肯定是被什么信号中断的,检查一下再做个应对措施即可。

 

RETURN VALUE
Zero if the requested time has elapsed, or the number of seconds left to sleep, if the call was interrupted by a signal han‐
dler. ( 如果定时时间已经过了,sleep返回0,如果sleep被中断,则返回剩余定时时间 )

 

根据sleep的返回值,可以用如下方法实现:

 

 

Continue reading...

记录一次奇怪的段错误经历

背景

GTK编程,在函数内部定义了一个结构体,作为指针传递给其他函数,在其他函数内部调用结构体内部成员变量,发现有一个成员变量总是为空,另外一个不会。

 

原因

定义结构体的位置在回调函数内部,回调函数运行完成后,结构体所在内存即被回收。

然而有时候在一定时间内回收内存里的数据没有发生改变,所以有些结构体的成员变量还是能够正常获取。

但是在执行其他指令的时候,原结构体部分成员变量的内存会被重用,造成内部数据改变,再去调用的时候,得到的就是完全随机的数据,如果把它当做指针使用,它指向的内存是未知的,未被申请的,再去操作这段内存就会发生段错误。

 

解决办法:

将结构体定义成 static 类型,让他在程序的整个生命周期内有效,不会被回收。

Continue reading...