递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 4592|回复: 72
打印 上一主题 下一主题

[视窗] 【源码】多线程和定时器直接调用类内部非静态方法

  [复制链接]

26

主题

1557

帖子

5813

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5813
楼主
发表于 2023-12-24 22:31:36 | 显示全部楼层
PIV模块里有各种线程的姿势了
只是火山PC不能匹配任意的类动态方法,必须写对应参数类型的函数模板,这比较繁琐,所以我用输出名来实现
回复

使用道具 举报

26

主题

1557

帖子

5813

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5813
沙发
发表于 2023-12-24 22:53:25 | 显示全部楼层

现在只能用输出名来匹配任意参数的类动态方法。
静态方法就比较简单了,可以直接写。
回复

使用道具 举报

26

主题

1557

帖子

5813

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5813
板凳
发表于 2023-12-24 22:58:43 | 显示全部楼层
呵呵仙8 发表于 2023-12-24 22:55
版大说.多线程不能操作窗口,像我这样写,也没出现挂的现象啊!!

看运气,如果不会同时有多个线程操作同一个窗口组件,就没那么容易挂,但如果挂了也是应该的。
回复

使用道具 举报

26

主题

1557

帖子

5813

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5813
地板
发表于 2023-12-25 14:27:55 | 显示全部楼层
老道 发表于 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
    # ---
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-6-19 04:03 , Processed in 0.093984 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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