Mint_21.3 drawing-area和goocanvas的FB笔记(三)

news2024/12/24 20:21:41

一、改变goocanvas线条自动画线时间间隔

通过系统SIGALRM信号触发,每秒画一条线对于慢温湿度等慢变信号可以应付,但对于快速信号1秒的间隔就太慢了。可以改变方式,通过另外的线程,完成要做的任务。

1. 线程的回调函数 myfunc

2. 循环运行的线程函数 threadtimer

3. 创建线程,无需等待线程结束

4. 进入主程循环

#include once "glib.bi"

'Thread callback
Function myfunc Cdecl (Byval NotUsed As Any Ptr) as guint
	Print "Main-program time = ", Time$
	Return TRUE
End Function

'Thread endless loop
Function threadtimer(ByVal invalue as Integer) as integer
	Do while inkey$<> CHR$(27)
		Sleep 200
		Print "Thead-process time = ", Time$
		myfunc(NULL)
	Loop
	Return TRUE
End function

'Create thread
Dim as any ptr threadid = threadcreate( CAST(Any Ptr, @threadtimer), 0 )

'Main loop
'Press ESC to terminate
Do while inkey$<>chr$(27)
	Sleep 100
Loop

End

执行结果:

7e059520ca5749b99fdba50fa189b3a2.png

FreeBasic是多线程的,根据需要还可以创建更多线程,线程循环中sleep 200改为 sleep 100 则线程任务被执行的频率就会更高。

二、让SIGALRM为线程提供安全保护

上面的线程是个死循环,如果主程序很长,任务很重等其它原因死掉了,线程应该自动退出、让出系统资源。让SIGALRM做此事情即可解决这一问题。

系统在正常运行时,SIGALRM应该是长活的,如同C#中的系统线程池,它不是由用户创建的。它可以自动更新共享变量,在线程循环中对变量更新进行判断,如果SIGALRM在更新共享变量,则清FlagSet, 否则自动累加,这样如果因程序死掉了而不能更新共享变量的话,线程应该也就因此自动结束了。

三、可以使用线程锁

如果线程读写变得复杂,可以对变量或过程读写加锁,freebasic 支持 mutexlock 和 mutexunlock。

#include once "glib.bi"

const SIGALRM=14
Dim shared as Integer FlagSet = 0
Dim shared as Integer FlagCounterNew = 0
Dim shared as Integer FlagCounterOld = 0

Dim shared as any ptr maintlock, threadlock
Dim as any ptr threadid

Declare Function Signal cdecl  alias "signal" (ByVal V_Signal As long, byval V_Function As Any Ptr) as Any Ptr
Declare Function Raise cdecl  alias "raise" (ByVal V_Signal As long) as Any Ptr
Declare function alarm cdecl alias "alarm" (byval __seconds as uinteger) as uinteger

mainlock = mutexcreate( )
threadlock = mutexcreate( )

'Thread callback
Function myfunc Cdecl (Byval NotUsed As Any Ptr) as guint
	Print "Main-program time = ", Time$
	Return TRUE
End Function

'Thread endless loop
Function threadtimer(ByVal invalue as Integer) as integer
	Do while inkey$<> CHR$(27)
        Mutexlock threadlock
        If FlagCounterNew <> FlagCounterOld then
            FlagSet = 0
            FlagCounterOld = FlagCounterNew
        Else
            FlagSet += 1
            If FlagSet > 20 then
                FlagSet = 0
                Exit Do
            End if
        End if
        MutexUnlock threadlock
		Sleep 200
		Print "Thead-process time = ", Time$
		myfunc(NULL)
	Loop
	Return TRUE
End function

Sub timerevent()
    MutexLock mainlock
	FlagCounterNew += 1
    If FlagCounterNew > 1000 then
        FlagCounterNew = 0
    End if
    MutexUnlock mainlock
End Sub

sub wait_alarm(iSigno As Integer)
	'?"This is the scheduled event SIG = " & Str$(iSigno) & "--- @: " & Time$
	alarm(1)		'loads another alarm events: each alarm event is a single time event, so to repeat it it must be set again every time
	timerevent
end sub

signal(SIGALRM, @wait_alarm)		'when SIGALRM triggered, call subroutine wait_alarm
alarm(2)	

'Create thread
threadid = threadcreate( CAST(Any Ptr, @threadtimer), 0 )

'Main loop
'Press ESC to terminate
Do while inkey$<>chr$(27)
	Sleep 100
Loop

End

如果是gtk界面程序,可以简单地使用g_timeout_add(100, @myfunc, NULL) 完成100毫秒间隔的回调函数执行,直到回调函数返回FALSE结束。

#INCLUDE once gtk/gtk.h
#DEFINE __USE_GTK3__

'Thread callback
Function myfunc Cdecl (Byval NotUsed As Any Ptr) as guint
     Print "Callback time = ", Time$
    Return TRUE
End Function

gtk_init(NULL, NULL)
g_timeout_add(100, @myfunc, NULL)
gtk_main()

如果还有一个回调任务要完成,则加多一行任务,比如:

g_timeout_add(100, @myfunc1, NULL)

g_timeout_add(100, @myfunc2, NULL)

可直接编译运行的实测代码:

#DEFINE __USE_GTK3__
#Include once "gtk/gtk.bi"

Declare Function myfunc Cdecl (Byval NotUsed As Any Ptr) as guint

'Thread callback
Function myfunc Cdecl (Byval NotUsed As Any Ptr) as guint
	Print "Callback time = ", Time$
	Return TRUE
End Function

gtk_init(NULL, NULL)
var mycall = g_timeout_add (100, @myfunc, NULL)
gtk_main()

上面的代码测试了Timer, 但主程序只能等待gtk_main()结束才能继续。如果将gtk这段代码作为一个线程运行,而且主程序不等待线程结束的话,则线程运行的同时主程序仍然继续运行。

测试代代码改写为:

#DEFINE __USE_GTK3__
#Include once "gtk/gtk.bi"

Declare Function myfunc Cdecl (Byval NotUsed As Any Ptr) as guint

'Thread callback
Function myfunc Cdecl (Byval NotUsed As Any Ptr) as guint
	Print "Callback time = ", Time$
	Return TRUE
End Function

Sub sidethread()
	gtk_init(NULL, NULL)
	var mycall = g_timeout_add (300, @myfunc, NULL)
	gtk_main()
End Sub

Dim as any ptr threadid = threadcreate( CAST(Any Ptr, @sidethread), 0 )

''Main loop
Do while inkey$<>chr$(27)
	Print "Main program time = ", Time$
	Sleep 100
Loop

End 0

Gnu 对 glib 描述有一段文字(): Libraries may contain wrappers of some of these functions, e.g. gtk_main(), gtk_main_quit() and gtk_events_pending().

是说gtk_main(), gtk_main_quit,gtk_events_pending() 是 g_main_xxx 的封装 (wrapper) --- (Gnu 站点链接贴图本意只是为了不在CSDN外链)。上面的测试程序引用了 gtk,下面的测试程序使用glib验证了同样的效果。

#Include once "glib.bi"

Declare Function myfunc Cdecl (Byval NotUsed As Any Ptr) as guint

'Thread callback
Function myfunc Cdecl (Byval NotUsed As Any Ptr) as guint
	Print "Callback time = ", Time$
	Return TRUE
End Function

Dim shared as GMainLoop PTR gml = NULL
Sub sidethread()
	gml = g_main_loop_new(NULL, FALSE)
	var mycall = g_timeout_add (300, @myfunc, NULL)
	g_main_loop_run(gml)
    g_main_loop_unref(gml)
End Sub

Dim as any ptr threadid = threadcreate( CAST(Any Ptr, @sidethread), 0 )

''Main loop
Do while inkey$<>chr$(27)
	Print "Main program time = ", Time$
	Sleep 100
Loop

'When main program terminate, all thread should be removed off
'but, anyway, g_main_loop_quit(gml) is not harm to added here
g_main_loop_quit(gml)
End 0

在CSDN上又查看了些关于Glib的博客,补了一句:g_main_loop_unref(gml)

学习参考博主李尔阳博文:七、GLib主要的事件循环(The Main Event Loop)_glib 事件源 套接字-CSDN博客

凭籍多线程能力,可以在主程序中实现对其它语言封装的.so界面进行调用。gcc的.so封装和freebasic的.so封装需要一些方法,但试练都不是特别复杂。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1489351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

串的定义及BF算法

定义 BF算法——朴素查找算法——也叫做串的模式匹配算法 其应用特别多&#xff0c;比如经常在一篇文章里面搜索一些东西&#xff0c;&#xff08;比如文章里的某个内容&#xff0c;或某些关键字词出现的位置&#xff0c;次数等&#xff09; 之前我们大多数情况下是用来搜索关…

在Ubuntu中安装pycharm的专业版且可以激活到2099年(保姆级教学,值得借鉴与信任)

一、进入官网&#xff0c;下载Pycharm2021.3版本 1.官网如下 https://www.jetbrains.com/pycharm/2.在浏览器中进入官网后&#xff0c;点击Download 3.再点击右下角的Other versions 4.选择Version 2021.3下的2021.3-Linux(tar.gz)进行下载 二、安装Pycharm2021.3 1.先将该压…

还在手动Word转PPT?快来试试这些一键生成工具!

在我们日常的工作和学习中&#xff0c;将Word转化成PPT的需求时常出现&#xff0c;尤其是当我们需要进行演讲或者报告时。这不仅能使我们的演讲更具视觉冲击力&#xff0c;也有助于我们更好地传达信息。 那么&#xff0c;如何才能轻松地将Word转换成PPT呢&#xff1f;下面将为…

MWC 2024 | 紫光展锐推出业界首款全面支持5G R16宽带物联网特性的芯片平台V620

要点&#xff1a; 紫光展锐V620支持5/4/3/2G全网通。支持NR 2CC和LTE 5CC&#xff0c;在SA网络下&#xff0c;其5G下行速率可达4.67Gbps&#xff0c;上行速率高达1.875Gbps&#xff0c;相比紫光展锐上一代产品提升100%。紫光展锐V620率先支持5G TSN&#xff0c;把5G应用于工业…

汽车设计的视觉盛宴:艺术家的渲染效果图集锦

对于那些对汽车渲染艺术充满热情的朋友来说&#xff0c;"至臻汽车"渲染效果图总是心之向往。本回&#xff0c;我们精心准备了第十届3dmodels年度汽车渲染比赛的佳作&#xff0c;收录了来自全球的顶级创作者的精彩作品。每张作品都代表了艺术家对精细质感的深究及对极…

基于springboot+vue的流浪宠物管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【每日刷题】数组-LC56、LC238、随想录1、LC560

1. LC56 合并区间 题目链接 Arrays.sort先让intervals里的子数组按照子数组的第一个数字值从小到大排列。开一个新数组&#xff0c;newInterval&#xff0c;存放合并好的子数组让intervals的当前子数组i的第一个数字与newInterval的当前子数组index的最后一个数字比较大小&am…

软文推广带来的收录排名提升,助你在搜索引擎中脱颖而出

互联网营销是一种不受时间和空间限制的营销方式&#xff0c;是一些中小企业成本低、效果好的推广方式。 行业做软文推广&#xff0c;最重要的是选择合适的软文推广平台&#xff0c;现在市场上有很多软文推广平台&#xff0c;这使得很多企业难以选择&#xff0c;此时企业需要学会…

回溯算法套路③排列型回溯+N皇后【基础算法精讲 16】

46 . 全排列 链接 : . - 力扣&#xff08;LeetCode&#xff09; 思路 : 那么怎么确定选了那个数呢? 这里设置一个used表示i选没选过 ; class Solution { public:vector<vector<int>> ans;vector<int> path;void backtrack(vector<int>nums,vect…

常见漏洞的流量特征

1、SQL注入漏洞 查看url / Referer字段/User-Agent字段/cookie字段 出现一些特殊字符&#xff08;eg&#xff1a;单引号【‘】、双引号【“”】、括号【&#xff08;&#xff09;】、单引号括号【‘&#xff08;】、双引号括号【“&#xff08;】等一些常见的特殊的字符&#…

ansible执行速度慢问题解决过程

ansible执行速度慢问题解决过程 一、初见端倪二、问题分析三、解决问题更多技术博客,请关注微信公众号:运维之美 接到项目反馈,客户环境使用我们提供工具部署产品,在主机添加步骤卡了很久,实施同学没有办法,将问题上升给我们。 环境信息:kylin10 架构:arm 一、初见…

【NR 定位】3GPP NR Positioning 5G定位标准解读(四)

目录 前言 6 Signalling protocols and interfaces 6.1 支持定位操作的网络接口 6.1.1 通用LCS控制平面架构 6.1.2 NR-Uu接口 6.1.3 LTE-Uu接口 6.1.4 NG-C接口 6.1.5 NL1接口 6.1.6 F1接口 6.1.7 NR PC5接口 6.2 终端协议 6.2.1 LTE定位协议&#xff08;LPP&#x…

python二级常见题目

一.常见语法 jieba—第三方中文分词函数库 jieba—第三方中文分词函数库_jieba库函数-CSDN博客 Python基础——format格式化 Python基础——format格式化_python format-CSDN博客 format()方法的使用超全_format方法-CSDN博客 Python中random函数用法整理 Python中random…

如何在CentOS部署JumpServer堡垒机并实现无公网ip环境远程访问

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

网络进程:广播、组播、流式域、报式域(套接字)

1.广播 1.1广播发送端模型(类似UDP客户端) 程序代码&#xff1a; #include<myhead.h> int main(int argc, const char *argv[]) {//创建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}//将套接字设置成允许广播i…

【金三银四】每日一点面试题(Java--JVM篇)

1、说一下 JVM 的主要组成部分及其作用&#xff1f; JVM&#xff08;Java虚拟机&#xff09;是Java程序运行的核心组件&#xff0c;它负责将Java字节码翻译成底层操作系统能够执行的指令。JVM由以下几个主要组成部分构成&#xff1a; 类加载器&#xff08;Class Loader&#…

【sgCollapseBtn】自定义组件:底部折叠/展开按钮

特性&#xff1a; 支持自定义折叠状态支持自定义标签名称 sgCollapseBtn源码 <template><div :class"$options.name" click"show !show" :placement"placement"><div class"collapse-btns"><div class"c…

9.WEB渗透测试-Linux基础知识-Linux用户权限管理(上)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;8.WEB渗透测试-Linux基础知识-Linux基础操作&#xff08;二&#xff09;-CSDN博客 用户管…

10个软件测试的吐槽点!

问题一&#xff1a;测试时间评估 这是一个工作日常经常需要回复的问题&#xff0c;理论上&#xff0c;测试这边要做出较科学合理的回复&#xff0c;那就要将【需求变更】、【开发进度延误】、【bug 修复不稳定】、【复杂业务流程】、【测试环境不稳定】、【上下游服务依赖】、…

Javase-类与对象

文章目录 一 . 面向过程的初步认知二 . 如何创建一个类三 . 如何创建一个对象四 . this引用五 . 构造方法六 . 初始化 一 . 面向过程的初步认知 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对…