开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1942|回复: 11
收起左侧

[求助] 线程内执行循环,每个循环周期内为什么执行两次子程序?

[复制链接]

结帖率:100% (18/18)
发表于 2021-11-25 23:23:38 | 显示全部楼层 |阅读模式   福建省泉州市
  
子程序名返回值类型公开备 注
线程处理  
参数名类 型参考可空数组备 注
参_标识整数型按键标识
变量名类 型静态数组备 注
局_延时整数型 
置随机数种子 ()
局_延时 = 到整数 (按键 [参_标识].间隔框.内容)
循环判断首 ()
按键消息 (集_窗口句柄, 按键 [参_标识].键代码)
判断开始断 (选择框_浮动.选中 = )
' 局_延时 = 取随机数 (到整数 (按键 [参_标识].间隔框.内容), 到整数 (按键 [参_标识].间隔框.内容) + 到整数 (按键 [参_标识].浮动框.内容))
' 局_延时 = 到整数 (按键 [参_标识].间隔框.内容)

. ' 如果真 (按钮_日志.标题 = “隐藏日志”)
' 编辑框1.加入文本 (到文本 (时间_取北京时间 ()) + “   按键:” + 按键 [参_标识].热键框.内容 + “   下次按键 →  ” + 到文本 (局_延时) + “  毫秒后” + 字符 (10))

程序_延时 (局_延时)
循环判断尾 (集_是否循环)
线程_销毁 (按键 [参_标识].线程句柄)
子程序名返回值类型公开备 注
_时钟2_周期事件  
变量名类 型静态数组备 注
局_延时整数型 
按键消息 (集_窗口句柄, 按键 [1].键代码)
' 置随机数种子 ()
判断开始断 (选择框_浮动.选中 = )
' 局_延时 = 取随机数 (到整数 (按键 [1].间隔框.内容), 到整数 (按键 [1].间隔框.内容) + 到整数 (按键 [1].浮动框.内容))
' 局_延时 = 到整数 (按键 [1].间隔框.内容)

. ' 如果真 (按钮_日志.标题 = “隐藏日志”)
' 编辑框1.加入文本 (到文本 (时间_取北京时间 ()) + “   按键:” + 按键 [1].热键框.内容 + “   下次按键 →  ” + 到文本 (局_延时) + “  毫秒后” + 字符 (10))
时钟2.时钟周期 = 局_延时



  
子程序名返回值类型公开备 注
按键消息 发送按键消息
参数名类 型参考可空数组备 注
参_句柄整数型目标窗口句柄
参_键码整数型要发送按键消息的键代码
变量名类 型静态数组备 注
vkeyCode整数型 
按下参数整数型 
抬起参数整数型 
vkeyCode = MapVirtualKeyA (参_键码, 0)
按下参数 = 生成键盘消息lParam (1, vkeyCode, 假, 假, 假, )
抬起参数 = 生成键盘消息lParam (1, vkeyCode, 假, 假, 真, )
PostMessageA (参_句柄, 256, 参_键码, 按下参数)  ' 按下
程序_延时 (10)
PostMessageA (参_句柄, 257, 参_键码, 抬起参数)  ' 抬起
子程序名返回值类型公开备 注
生成键盘消息lParam整数型 来源:精易模块
参数名类 型参考可空数组备 注
重复计数短整数型
扫描代码字节型
是否为扩展键逻辑型可空。默认为假:普通键   真:功能键 (为功能键可用于热键技能不输入字符)
上下文代码逻辑型对于WM_KEYDOWN消息,该值始终为0
先前的键状态逻辑型如果在发送消息之前按键已按下,则值为1;如果按键已按下,则值为0
过渡状态逻辑型对于WM_KEYDOWN消息,该值始终为0
变量名类 型静态数组备 注
ret整数型 
ret = 左移 (扫描代码, 16)
ret = 位或 (ret, 重复计数)
如果真 (是否为扩展键)
ret = 位或 (ret, 左移 (1, 24))
如果真 (上下文代码)
ret = 位或 (ret, 左移 (1, 29))
如果真 (先前的键状态)
ret = 位或 (ret, 左移 (1, 30))
如果真 (过渡状态)
ret = 位或 (ret, 左移 (1, 31))
返回 (ret)


同一个子程序,放在时钟周期事件里,每个延时周期里只执行一次
放在线程里循环,每个延时周期里都执行两次,是什么原因?

发送按键消息,线程循环里面,每个循环周期都会连续发送两个按键字符,时钟周期事件则只会发送一次
由此得出结论:
①PostMessageA发送按键消息这样写是没问题的
②线程里的循环,每个延时周期里都执行两次循环事件,这是什么原因呢?精易模块多线程的bug吗?




补充内容 (2021-11-25 23:27):
用的是精易模块    线程_启动多参_整数型()
我再测试一下其他方式启动线程

补充内容 (2021-11-25 23:32):
测试结束,所有线程启动方式,得到的结果都是:
每个循环周期里线程都执行了两次循环事件
这是为什么呢?应该如何解决?

结帖率:100% (18/18)

签到天数: 22 天

 楼主| 发表于 2021-11-26 11:43:58 | 显示全部楼层   福建省泉州市
112432.png

找到原因了,此帖终结

原因是图中的这两个框,由于我是使用监视热键,热键触发启动线程
前面没加红框里的判断按键状态来限制,所以按一次热键,其实用键代码执行判断是进行了两次的
按下热键执行一次判断,启动一次线程,抬起也执行一次判断启动一次线程
最终其实是启动了两次线程,而用了同一个变量存储线程句柄,所以调试输出线程句柄的时候以为只启动了一个线程
真的是闹了个大乌龙

之前没把前面的代码发出来可能也是导致大佬们找不到答案的原因吧
感谢各位的回复@初夏喔  @供供啊 @szxiao @小书
也真诚向大家道歉

回复 支持 反对

使用道具 举报

结帖率:89% (8/9)

签到天数: 21 天

发表于 2021-11-25 23:29:14 | 显示全部楼层   广东省东莞市
循环判断首是先执行一次再判断,你应该用判断循环首
回复 支持 反对

使用道具 举报

结帖率:100% (18/18)

签到天数: 22 天

 楼主| 发表于 2021-11-25 23:53:50 | 显示全部楼层   福建省泉州市
初夏喔 发表于 2021-11-25 23:29
循环判断首是先执行一次再判断,你应该用判断循环首

试过了判断循环首,一样的结果
回复 支持 反对

使用道具 举报

结帖率:100% (18/18)

签到天数: 22 天

 楼主| 发表于 2021-11-26 00:01:47 | 显示全部楼层   福建省泉州市
初夏喔 发表于 2021-11-25 23:29
循环判断首是先执行一次再判断,你应该用判断循环首

更好玩的是,我试了其他事件内容和各种不同的延时,发现只有这个PostMessageA事件会有这么奇葩的情况
到底为什么,放在时钟里,只产生一次事件
放在现成里,每个周期产生两次事件


补充内容 (2021-11-26 00:03):
应该说,只要这个PostMessageA在线程里,整个线程循环里的所有事件都会在一个延时周期里被执行两次

补充内容 (2021-11-26 00:05):
也不对,把这东西从线程内的循环里屏蔽删除,线程事件还是产生两次,我懵了
回复 支持 反对

使用道具 举报

签到天数: 19 天

发表于 2021-11-26 01:32:38 | 显示全部楼层   广西壮族自治区柳州市
前个时钟周期没完成,下个时钟周期又开始了,所以会启动两个线程。

评分

参与人数 1好评 +1 精币 +2 收起 理由
15368134513 + 1 + 2 新技能已get√

查看全部评分

回复 支持 反对

使用道具 举报

结帖率:80% (4/5)

签到天数: 11 天

发表于 2021-11-26 07:44:57 | 显示全部楼层   广东省东莞市
及时停掉时钟。
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 17 天

发表于 2021-11-26 08:58:04 | 显示全部楼层   广东省佛山市
进入时钟事件后,加上 时钟2.时钟周期 = 0 测试再看看结果后,一步步排除。
回复 支持 反对

使用道具 举报

结帖率:100% (18/18)

签到天数: 22 天

 楼主| 发表于 2021-11-26 10:59:41 | 显示全部楼层   福建省泉州市
小书 发表于 2021-11-26 08:58
进入时钟事件后,加上 时钟2.时钟周期 = 0 测试再看看结果后,一步步排除。 ...

线程和时钟是相互独立的,互相之间没有交集,时钟添加了用来测试的
屏蔽线程,时钟给出的执行结果是周期只执行一次
屏蔽时钟,线程执行的结果是每个循环周期里连续执行两次事件
回复 支持 反对

使用道具 举报

结帖率:100% (18/18)

签到天数: 22 天

 楼主| 发表于 2021-11-26 11:00:04 | 显示全部楼层   福建省泉州市
szxiao 发表于 2021-11-26 07:44
及时停掉时钟。

跟时钟没关系
线程和时钟是相互独立的,互相之间没有交集,时钟添加了用来测试的
屏蔽线程,时钟给出的执行结果是周期只执行一次
屏蔽时钟,线程执行的结果是每个循环周期里连续执行两次事件
回复 支持 反对

使用道具 举报

结帖率:100% (18/18)

签到天数: 22 天

 楼主| 发表于 2021-11-26 11:00:47 | 显示全部楼层   福建省泉州市
供供啊 发表于 2021-11-26 01:32
前个时钟周期没完成,下个时钟周期又开始了,所以会启动两个线程。

跟时钟没关系
线程和时钟是相互独立的,互相之间没有交集,时钟是后来添加的用来对比测试的
屏蔽线程,时钟给出的执行结果是周期只执行一次
屏蔽时钟,线程执行的结果是每个循环周期里连续执行两次事件
回复 支持 反对

使用道具 举报

  高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表