精易论坛

标题: 多次执行任务 [打印本页]

作者: shikong    时间: 前天 19:34
标题: 多次执行任务
需要定时五秒执行任务,如果无任务则停止

任务是执行get或post请求拿到数据,并且添加到超级列表框内,每五秒执行一次,如果执行时间超过6分钟则停止执行 该任务废弃 并且每秒需要提示当前任务剩余多长时间

希望使用多线程进行

例如:超级列表框第2列是123,456,789,如果先拿到456的值则先展示456要求获取的值,然后把456这个任务从任务池删除 继续执行123和789的任务


作者: 2224848    时间: 前天 19:34
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
任务队列任务信息待处理的任务队列 
线程池鱼刺类_线程池Ex  
定时器ID整数型  
任务状态整数型任务执行状态(0=停止,1=运行中) 

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
' 初始化线程池(最多3个并发线程)
线程池.创建 (3, 10)

' 初始化超级列表框
超级列表框1.插入列 (0, "任务ID", 100, , , )
超级列表框1.插入列 (1, "参数", 100, , , )
超级列表框1.插入列 (2, "状态", 100, , , )
超级列表框1.插入列 (3, "剩余时间", 120, , , )
超级列表框1.插入列 (4, "结果", 300, , , )

' 启动定时器(每秒触发一次)
定时器ID = 置时钟间隔 (1000, &时钟事件)

' 初始状态为停止
任务状态 = 0
按钮1.标题 = "开始任务"
子程序名返回值类型公开备 注
_按钮1_被单击  
如果 (任务状态 = 0)
' 开始任务
任务状态 = 1
按钮1.标题 = "停止任务"

' 立即触发一次任务执行
执行任务 ()
' 停止任务
任务状态 = 0
按钮1.标题 = "开始任务"

子程序名返回值类型公开备 注
_按钮2_被单击  
变量名类 型静态数组备 注
任务ID整数型 
参数文本型 
' 添加测试任务
任务ID = 取数组成员数 (任务队列) + 1
参数 = 到文本 (任务ID * 111)

添加任务 (任务ID, 参数)
信息框 ("已添加任务: " & 参数, 0, )
子程序名返回值类型公开备 注
添加任务逻辑型 
参数名类 型参考可空数组备 注
任务ID整数型
请求参数文本型
变量名类 型静态数组备 注
新任务任务信息 
新任务.任务ID = 任务ID
新任务.请求参数 = 请求参数
新任务.开始时间 = 取现行时钟 ()
新任务.超时时间 = 360  ' 6分钟(360秒)

加入成员 (任务队列, 新任务)

' 在列表框中添加任务行
超级列表框1.插入行 (, 任务ID, , , , )
超级列表框1.置标题 (超级列表框1.取总行数 () - 1, 1, 请求参数)
超级列表框1.置标题 (超级列表框1.取总行数 () - 1, 2, "等待中")
超级列表框1.置标题 (超级列表框1.取总行数 () - 1, 3, "6:00")

返回 ()
子程序名返回值类型公开备 注
执行任务  
变量名类 型静态数组备 注
i整数型 
当前任务任务信息 
' 如果任务队列为空或任务已停止,则不执行
如果真 (取数组成员数 (任务队列) = 0 任务状态 = 0)
返回 ()

' 遍历任务队列,投递未执行的任务
计次循环首 (取数组成员数 (任务队列), i)
当前任务 = 任务队列 [i]

' 检查任务是否已超时
如果真 (取现行时钟 () - 当前任务.开始时间 > 当前任务.超时时间 * 1000)
任务超时处理 (i)
继续 ()

' 检查任务状态(这里简化处理,实际应增加状态标记)
线程池.投递任务 (&处理请求, i)
计次循环尾 ()
子程序名返回值类型公开备 注
处理请求  
参数名类 型参考可空数组备 注
任务索引整数型
变量名类 型静态数组备 注
当前任务任务信息 
请求URL文本型 
请求结果文本型 
开始时间整数型 
' 获取任务信息
互斥锁_锁定 (任务队列锁)
当前任务 = 任务队列 [任务索引]
互斥锁_解锁 (任务队列锁)

' 更新任务状态为执行中
线程_同步 (, , , , )
超级列表框1.置标题 (任务索引 - 1, 2, "执行中")
线程_同步结束 ()

' 记录开始时间
开始时间 = 取现行时钟 ()

' 执行HTTP请求(示例代码,实际需根据需求调整)
请求URL = "https://api.example.com/data?param=" & 当前任务.请求参数
请求结果 = HTTP_网页访问 (请求URL, 0, , , , , , , , , )

' 检查是否超时
如果真 (取现行时钟 () - 开始时间 > 当前任务.超时时间 * 1000)
线程_同步 (, , , , )
任务超时处理 (任务索引)
线程_同步结束 ()
返回 ()

' 更新UI显示结果
线程_同步 (, , , , )
超级列表框1.置标题 (任务索引 - 1, 2, "已完成")
超级列表框1.置标题 (任务索引 - 1, 4, 请求结果)

' 从任务队列中移除已完成的任务
删除成员 (任务队列, 任务索引)
线程_同步结束 ()
子程序名返回值类型公开备 注
任务超时处理  
参数名类 型参考可空数组备 注
任务索引整数型
' 更新UI显示超时
超级列表框1.置标题 (任务索引 - 1, 2, "已超时")
超级列表框1.置标题 (任务索引 - 1, 4, "任务执行超时,已放弃")

' 从任务队列中移除超时任务
删除成员 (任务队列, 任务索引)
子程序名返回值类型公开备 注
时钟事件  
变量名类 型静态数组备 注
i整数型 
当前任务任务信息 
已用时间整数型 
剩余时间整数型 
剩余分钟整数型 
剩余秒数文本型 
' 更新所有任务的剩余时间显示
计次循环首 (取数组成员数 (任务队列), i)
当前任务 = 任务队列 [i]
已用时间 = (取现行时钟 () - 当前任务.开始时间) / 1000
剩余时间 = 当前任务.超时时间 - 已用时间

如果真 (剩余时间 <= 0)
任务超时处理 (i)
继续 ()

剩余分钟 = 剩余时间 / 60
剩余秒数 = 到文本 (剩余时间 % 60)

' 补零处理
如果真 (取文本长度 (剩余秒数) = 1)
剩余秒数 = "0" & 剩余秒数

超级列表框1.置标题 (i - 1, 3, 到文本 (剩余分钟) & ":" & 剩余秒数)
计次循环尾 ()

' 每5秒执行一次任务
如果真 (取现行时钟 () % 5000 < 1000)  ' 约每5秒触发一次
执行任务 ()

子程序名返回值类型公开备 注
__启动窗口_将被销毁  
' 释放资源
线程池.销毁 ()
时钟事件 (定时器ID)


i支持库列表   支持库注释   
eAPI, eThread, eUI(未知支持库)

  
数据类型名公开备 注
任务信息 
成员名类 型传址数组备 注
任务ID整数型  
请求参数文本型  
请求类型整数型  
开始时间整数型  
超时时间整数型  
状态整数型  



[color=rgba(0, 0, 0, 0.85)]如需实际使用,需要根据具体的 HTTP 请求需求修改处理请求[color=rgba(0, 0, 0, 0.85)]子程序中的代码,包括请求 URL、请求方式、请求头和请求参数。


作者: yushizhuo    时间: 前天 22:19
大佬 这是拿20精币定制来了
作者: 行云追流水    时间: 昨天 10:59
2224848 发表于 2025-7-23 03:06
[e=1].版本 2
.支持库 eAPI, eThread, eUI

牛逼   20精币拼命了
作者: 2224848    时间: 昨天 13:20
行云追流水 发表于 2025-7-23 10:59
牛逼   20精币拼命了

哈哈,拼了也没给我呀。
作者: shikong    时间: 昨天 14:01
2224848 发表于 2025-7-23 03:06
[e=1].版本 2
.支持库 eAPI, eThread, eUI

可以付费私聊吗?这个问题好像还没解决这20精币先给你




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4