递归火山软件开发平台

标题: 【源码】多线程和定时器直接调用类内部非静态方法 [打印本页]

作者: 小小小小鸟    时间: 2023-12-24 21:41
标题: 【源码】多线程和定时器直接调用类内部非静态方法
本帖最后由 小小小小鸟 于 2023-12-25 15:52 编辑

火山PC自带的启动线程命令要求函数必须是静态的,有时候为了多线程调用一个类的内部方法,必须声明一个静态的外套方法,然后用指针或者取程序()方法来调用真正的函数,写多了不堪其扰还增加代码排版量,所以自己用嵌入方法结合匿名函数封装了一个可以 直接 启动新线程并调用本对象的类内部方法 的方法,这样一句代码就可以了,无需再新写一个静态方法,感兴趣的可以试试并继续扩展各种参数形式的~ (, 下载次数: 792)

2023.12.25 增加 定时器支持,一行代码启动一个类内部方法的定时器(时钟) (, 下载次数: 778)




作者: 呵呵仙8    时间: 2023-12-24 22:26
提示: 作者被禁止或删除 内容自动屏蔽
作者: Xelloss0618    时间: 2023-12-24 22:31
PIV模块里有各种线程的姿势了
只是火山PC不能匹配任意的类动态方法,必须写对应参数类型的函数模板,这比较繁琐,所以我用输出名来实现
作者: urenai    时间: 2023-12-24 22:33
我靠,满满的技术值啊。。。。
作者: 小小小小鸟    时间: 2023-12-24 22:36
呵呵仙8 发表于 2023-12-24 22:26
虽然类里有事件接收及虚拟方法这种实用的东西!!但也向楼主学习学习!!

虚拟方法是不是虚函数virtual那个···好像是类的多态,和多线程无关,用事件的方法不还是也得多写代码的嘛,就是为了偷懒让代码更简洁点才整的这个~哎 火山限制好多···
作者: 小小小小鸟    时间: 2023-12-24 22:36
Xelloss0618 发表于 2023-12-24 22:31
PIV模块里有各种线程的姿势了
只是火山PC不能匹配任意的类动态方法,必须写对应参数类型的函数模板,这比较 ...

如果能匹配 任意的类动态方法,骚操作就多了~
作者: 呵呵仙8    时间: 2023-12-24 22:42
提示: 作者被禁止或删除 内容自动屏蔽
作者: 小小小小鸟    时间: 2023-12-24 22:42
呵呵仙8 发表于 2023-12-24 22:42
线程事件放在一起,也很不错的.就像组件一个.可知由谁发起的线程任务!!
以前写的https://bbs.voldp.com/thre ...

好的 谢谢 学习学习~
作者: 呵呵仙8    时间: 2023-12-24 22:46
提示: 作者被禁止或删除 内容自动屏蔽
作者: Xelloss0618    时间: 2023-12-24 22:53
(, 下载次数: 685)
现在只能用输出名来匹配任意参数的类动态方法。
静态方法就比较简单了,可以直接写。

作者: 呵呵仙8    时间: 2023-12-24 22:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: 小小小小鸟    时间: 2023-12-24 22:58
Xelloss0618 发表于 2023-12-24 22:53
现在只能用输出名来匹配任意参数的类动态方法。
静态方法就比较简单了,可以直接写。
...

哈哈 用火山就是这样,总是不能让你很舒服的来实现一些事情~
作者: Xelloss0618    时间: 2023-12-24 22:58
呵呵仙8 发表于 2023-12-24 22:55
版大说.多线程不能操作窗口,像我这样写,也没出现挂的现象啊!!

看运气,如果不会同时有多个线程操作同一个窗口组件,就没那么容易挂,但如果挂了也是应该的。
作者: 小蜗牛    时间: 2023-12-24 23:18
看看咋样
作者: Pomelo    时间: 2023-12-24 23:31
多线程直接调用类内部非静态方法
作者: sfmf520    时间: 2023-12-25 01:38
学习学习
作者: itismine    时间: 2023-12-25 09:11
学习一下。。。
作者: rinipp    时间: 2023-12-25 09:35
学习一下
作者: 乐易论坛    时间: 2023-12-25 10:54
看看
作者: 老道    时间: 2023-12-25 11:39
本帖最后由 老道 于 2023-12-25 11:47 编辑
Xelloss0618 发表于 2023-12-24 22:53
现在只能用输出名来匹配任意参数的类动态方法。
静态方法就比较简单了,可以直接写。
...

这种姿势才看到过,SetTimer 的回调函数 直接指定 类内的非静态成员方法 有野路子吗?不想用消息。易语言之前的野路子是通过索引取类方法指针,调用的时候把类自身 push 进去。再call
作者: glbosom    时间: 2023-12-25 11:42
学习一下
作者: Xelloss0618    时间: 2023-12-25 14:27
老道 发表于 2023-12-25 11:39
这种姿势才看到过,SetTimer 的回调函数 直接指定 类内的非静态成员方法 有野路子吗?不想用消息。易语言 ...

也有野路子的,比如是直接用类指针作为时钟ID,然后在回调里将时钟ID还原为类指针去调用类动态方法。


<火山程序 类型 = "通常" 版本 = 1 />

类 窗口时钟类 <公开 折叠>
{
    方法 类_清理 <折叠>
    {
        结束时钟 ()
    }

    方法 启动时钟 <公开 类型 = 逻辑型 注释 = "启动时钟,重复启动将替换之前的时钟,可以当作是修改周期时间." 折叠 @禁止流程检查 = 真>
    参数 窗口句柄 <类型 = 变整数 注释 = "请提供主窗口的句柄">
    参数 周期时间 <类型 = 整数 注释 = "时钟运行的周期时间,以毫秒为单位">
    {
        @ m_hwnd = reinterpret_cast<HWND>(@<窗口句柄>);
        @ return (::SetTimer(m_hwnd, reinterpret_cast<UINT_PTR>(this), static_cast<UINT>(@<周期时间>), &@sn<current_class_def>::Timerproc) != 0);
    }

    方法 结束时钟 <公开 类型 = 逻辑型 注释 = "结束时钟" 折叠 @禁止流程检查 = 真>
    {
        @ return ::KillTimer(m_hwnd, reinterpret_cast<UINT_PTR>(this));
    }

    方法 周期时间 <公开 属性写 注释 = "修改当前的周期时间" 折叠>
    参数 周期时间 <类型 = 整数 注释 = "时钟运行的周期时间,以毫秒为单位">
    {
        @ if (m_hwnd != NULL)
        @     ::SetTimer(m_hwnd, reinterpret_cast<UINT_PTR>(this), static_cast<UINT>(@<周期时间>), &@sn<current_class_def>::Timerproc);
    }

    方法 时钟事件 <公开 定义事件 类型 = 整数 注释 = "每当经过了指定的时钟周期,将发送本事件." 注释 = "注意: 本事件在主窗口的消息循环中执行,请勿执行耗时操作,否则会卡界面."
            返回值注释 = "此返回值无意义" 折叠>
    参数 窗口句柄 <类型 = 变整数 注释 = "返回与时钟关联的窗口句柄">
    参数 启动时间 <类型 = 整数 注释 = "系统启动后经过的毫秒数,与\"取启动时间\"一致.">

    # ---
    # @begin
    # <> <include>
    # HWND m_hwnd = NULL;
    # static VOID CALLBACK Timerproc (HWND hwnd, UINT message, UINT_PTR iTimerID, DWORD dwTime) {
    #     reinterpret_cast<@sn<current_class>*>(iTimerID)->@<时钟事件>(reinterpret_cast<INT_P>(hwnd), static_cast<INT>(dwTime));
    # }
    # <> </include>
    # @end
    # ---
}



作者: Creator    时间: 2023-12-25 15:27
好东西支持下
作者: 小小小小鸟    时间: 2023-12-25 15:53
老道 发表于 2023-12-25 11:39
这种姿势才看到过,SetTimer 的回调函数 直接指定 类内的非静态成员方法 有野路子吗?不想用消息。易语言 ...

看看我新更新的内容,应该是你需要的···
作者: 高山!&流水    时间: 2023-12-25 16:53
谢谢分享!!
作者: 老道    时间: 2023-12-25 19:49
Xelloss0618 发表于 2023-12-25 14:27
也有野路子的,比如是直接用类指针作为时钟ID,然后在回调里将时钟ID还原为类指针去调用类动态方法。

大佬NB !!!!!
作者: 老道    时间: 2023-12-25 19:49
小小小小鸟 发表于 2023-12-25 15:53
看看我新更新的内容,应该是你需要的···

嗯嗯 都挺好!
作者: 次元の叶子    时间: 2023-12-25 20:24
楼主辛苦了,谢谢楼主,感谢楼主分享,楼主好人一生平安!!!
作者: zhizizhis    时间: 2023-12-25 20:57
学习一下 我直接用api cpu占用很高
作者: 888888    时间: 2023-12-25 23:12
谢谢分享
作者: alanwoo    时间: 2023-12-26 00:05
学习学习
作者: 折戟沉沙    时间: 2023-12-26 06:58
看看
作者: 阿海    时间: 2023-12-26 07:59
学习学习,谢谢
作者: 715684    时间: 2023-12-26 13:34
好好学习天天向上

作者: 正版商业用户    时间: 2023-12-26 17:06
看看学习
作者: bkqrj    时间: 2023-12-27 09:32
66666666666
作者: 水常流    时间: 2023-12-27 17:20
感谢分享
作者: urenai    时间: 2023-12-27 17:40
老板给正一个 取动态方法指针 可行吗?
作者: 寒风    时间: 2023-12-28 01:26
好的 谢谢 学习学习~
作者: 它来了它来了    时间: 2023-12-28 02:22
1111111
作者: 小小小小鸟    时间: 2023-12-28 06:26
urenai 发表于 2023-12-27 17:40
老板给正一个 取动态方法指针 可行吗?

我感觉意义不大啊,调用动态方法需要对象的指针,你都有指针了直接 用 -> 或者 读指针处对象 来调用动态方法就行呗
作者: 阿杰    时间: 2023-12-28 14:46
小小小小鸟
作者: shuimiao    时间: 2023-12-28 16:27
学习一下
作者: li327065266kun    时间: 2023-12-28 16:46
咋写的?????????
作者: yifan09    时间: 2023-12-28 17:52
学习
作者: ziv    时间: 2023-12-28 21:36
如果您要查看本帖隐藏内容请回复
作者: wangvoldp    时间: 2023-12-29 16:42
666666666666666
作者: xcbxiang123    时间: 2023-12-29 21:19

虽然类里有事件接收及虚拟方法这种实用的东西!!但也向楼主学习学习!!
作者: htpmcj    时间: 2023-12-29 23:19
学习一下
作者: 网络注册会员    时间: 2023-12-30 00:15
学习一下   
作者: matali    时间: 2024-1-1 10:04
谢谢 学习学习~
作者: xb114    时间: 2024-1-2 14:03
可是难倒我了
作者: 韦贝贝    时间: 2024-1-17 14:01

看看咋样     
作者: server    时间: 2024-1-17 17:21
学习            
作者: 1181070768    时间: 2024-1-17 23:23
不错的例程666
作者: 曼菲士    时间: 2024-1-20 11:45
很有意义,学习一下看UDP是否可以用。
作者: jqldjsx    时间: 2024-1-31 11:01
学习学习学习中
作者: 就这    时间: 2024-2-2 13:02
谢谢 学习学习~
作者: nail1983    时间: 2024-2-7 12:44
学习学习~
作者: 小烦    时间: 2024-2-10 10:03
学习看看
作者: John    时间: 2024-3-19 13:12
学习
作者: 空空道人    时间: 2024-3-19 23:03
111
作者: TianYa    时间: 2024-3-25 15:14
感谢,拿走学习
作者: blackmood    时间: 2024-3-27 12:42
程和定时器直接调用类内部非
作者: GZmc    时间: 2024-4-2 16:23
多线程和定时器直接调用类内部非静态方法
作者: 太星    时间: 2024-4-3 09:35
感谢分享!!
作者: leing    时间: 2024-4-6 17:16
来学习学习
作者: xp321wh    时间: 2024-4-10 19:36
看看是什么
作者: 网猫    时间: 2024-4-10 19:55

作者: nothing    时间: 2024-4-21 22:35
学习下。。。。
作者: 2088863004    时间: 2024-5-1 18:12

作者: wang928177    时间: 2024-5-11 11:50
看看看看一下呀
作者: 惊鸿    时间: 2024-6-14 20:31
动线程命令要求函数必须
作者: 1316447212    时间: 2024-7-23 21:37
谢谢分享..
作者: 山火小萌新    时间: 2024-7-25 18:51
萌新学习中
作者: qiken    时间: 2024-8-2 18:48
正需要这个很好的
作者: xiaoya    时间: 2024-8-3 14:56

楼主辛苦了,谢谢楼主,感谢楼主分享,楼主好人一生平安!!!
作者: sfmf520    时间: 2024-8-9 12:22
请问下,
启动线程_非静态方法.zip  
这个线程,我需要两个变整数参数,需要怎么改呢?我对C不了解,尝试着修改了下,结果报错了。
作者: 小小小小鸟    时间: 2024-8-9 12:33
sfmf520 发表于 2024-8-9 12:22
请问下,
启动线程_非静态方法.zip  
这个线程,我需要两个变整数参数,需要怎么改呢?我对C不了解,尝试 ...

可以用我的新帖子的方法:https://bbs.voldp.com/thread-22654-1-1.html
多线程.启动线程(参数1,参数2)
        被调用的方法(多线程.取参数(0,变整数),多线程.取参数(1,变整数))
作者: sfmf520    时间: 2024-8-9 13:23
小小小小鸟 发表于 2024-8-9 12:33
可以用我的新帖子的方法:https://bbs.voldp.com/thread-22654-1-1.html
多线程.启动线程(参数1,参数2)
         ...

谢谢谢谢谢谢
作者: feimu2005    时间: 2024-8-11 17:51
好的 谢谢 学习学习~

作者: huang19781029    时间: 2024-9-1 17:11
366666666666666666
作者: tian89    时间: 2024-9-3 15:36
下载看看
作者: guangye1    时间: 2024-9-25 06:58
这个简单一些。学习一下

作者: cxz7411    时间: 2024-10-5 12:50
这个支持一下
作者: qzuser123ss    时间: 2024-10-6 22:29
态方法就比较简单了,可以直接写。
作者: TY88888888    时间: 2024-10-31 08:47
【源码】多线程和定时器直接调用类内部非静态方法 [修改]
作者: q472448760    时间: 2024-11-22 19:58
5666666666666666666666666
作者: 75842989    时间: 2025-1-20 01:38
学习一下
作者: pan2112    时间: 2025-2-7 23:54
谢谢666666
作者: boom    时间: 2025-2-20 09:37

作者: cssshk    时间: 2025-4-2 15:01
感谢,学习收藏
作者: alpc    时间: 2025-4-15 22:16
学习一下 ,看看 多线程定时器怎么弄
作者: kongpeii    时间: 2025-5-1 22:16
】多线程和定时器直接调用类内部非静态方法 [修改]
高级模式

作者: exit    时间: 2025-5-5 11:50
支持一下,谢谢





欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4