开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 2554|回复: 10
收起左侧

[已回应] 类_线程池1 投递任务 2个问题 需改进啊 附自己改造后的代码

[复制链接]

结帖率:100% (2/2)
发表于 2013-10-29 12:58:25 | 显示全部楼层 |阅读模式   湖南省湘西土家族苗族自治州
本帖最后由 维卷残恋 于 2013-10-29 13:05 编辑

问题1:投递任务 超时设置是等待线程[1]执行完成,如果超时还没有完成  就 TerminateThread 终止 重新启动一条线程工作 这个不是很好 有些时候需要实现的功能有点繁杂,涉及到有失败重试次数的问题,线程所占用的时间会稍微多一些。投递任务 超时为无限等待:如果线程[1]所占用的时间 是其他线程稍长一点就会发现一个现象 创建时设置的线程数是10 当全部线程都已经完成工作  这时线程[1]执行完成了 这时候才会投递成功,这时候线程池跟首次启动一样 0条线程在工作


问题2:投递任务  不设置超时 将会不停的closehandle 线程[1]的线程句柄 然后启动新线程  即便实际执行的线程数量已经超过了 类方法 创建时所设置的线程数量


{:soso_e117:}以下是改造版,设置超时 则投递任务失败. 动态判断线程是否已经完成任务 比较能正确的保证线程与创建设置时的线程数量一致 上次用来写一个外国游戏的扫好器 发现类_线程池1 存在的问题,自己改过之后 拿来分享下吧。 再次感谢精易模块开源行为。



类_线程池1_改造.zip

1.67 KB, 下载次数: 51, 下载积分: 精币 -2 枚

点评

部分代码,个人认为是有问题的,请加x5sz@qq.com为QQ好友详谈,注明:精易模块 否则会拒绝   上海市上海市  发表于 2013-10-29 14:53
结帖率:50% (1/2)
发表于 2013-11-29 05:46:07 | 显示全部楼层   广东省惠州市
没玩过 玩玩看
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)
 楼主| 发表于 2013-11-4 10:10:53 | 显示全部楼层   湖南省湘西土家族苗族自治州
我叫林舒书 发表于 2013-11-3 22:44
表示我也没收到,我也想看看他这个怎么改。@小磊

每月1号。。
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
发表于 2013-11-3 22:44:06 | 显示全部楼层   广西壮族自治区桂林市
维卷残恋 发表于 2013-11-3 22:13
苦比了。。为啥我没收到开源邮件。。

表示我也没收到,我也想看看他这个怎么改。@小磊
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)
 楼主| 发表于 2013-11-3 22:13:51 | 显示全部楼层   湖南省湘西土家族苗族自治州

苦比了。。为啥我没收到开源邮件。。
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
发表于 2013-11-3 22:09:45 | 显示全部楼层   广西壮族自治区桂林市
维卷残恋 发表于 2013-11-2 22:31
这个我是复制从精易模块内那个类_线程池1 只有部分代码改写的 等小磊下次更新发出来再看看吧,

貌似已经更新了
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)
 楼主| 发表于 2013-11-2 22:31:19 | 显示全部楼层   湖南省湘西土家族苗族自治州
我叫林舒书 发表于 2013-11-2 20:40
感觉楼主的写法还是有问题。

处理数组的时时候,删除了成员,继续循环的话可能会出错,修改了下还有一 ...

这个我是复制从精易模块内那个类_线程池1 只有部分代码改写的 等小磊下次更新发出来再看看吧,
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
发表于 2013-11-2 20:41:43 | 显示全部楼层   广西壮族自治区桂林市
有点乱  上面的两个代码

[e]
.版本 2
.支持库 spec

.子程序 投递任务_新, 整数型, 公开, 往线程池中投递一个任务,返回线程句柄
.参数 函数, 子程序指针
.参数 参数, 整数型, 可空
.参数 超时, 整数型, 可空, 留空,则无限等待
.局部变量 线程个数, 整数型
.局部变量 线程句柄, 整数型
.局部变量 当前时间, 整数型
.局部变量 状态值, 整数型

.如果真 (集_停止)
    返回 (0)
.如果真结束
当前时间 = 取启动时间 ()
.判断循环首 (真)
    线程个数 = 取数组成员数 (集_线程句柄)
    .判断开始 (线程个数 > 集_线程数量)
        .计次循环首 (线程个数, )
            状态值 = 内部_取线程状态 (集_线程句柄 [线程个数])
            .如果真 (状态值 < 2)
                TerminateThread (集_线程句柄 [线程个数], 0)
                CloseHandle (集_线程句柄 [线程个数])
                删除成员 (集_线程句柄, 线程个数, )
                跳出循环 ()
            .如果真结束
            线程个数 = 线程个数 - 1
        .计次循环尾 ()
    .默认
        跳出循环 ()
    .判断结束

    .如果真 (超时 > 0)
        .如果真 (取启动时间 () - 当前时间 > 超时)
            返回 (0)
        .如果真结束

    .如果真结束
    处理事件 ()
    延迟 (50)
.判断循环尾 ()
线程句柄 = CreateThread (0, 0, 到整数 (函数), 参数, 0, 0)
加入成员 (集_线程句柄, 线程句柄)
返回 (线程句柄)
[/e]

[e]
.版本 2

.子程序 置线程数, , 公开, 设置新线程数量
.参数 线程数量, 整数型

集_停止 = 真
集_线程数量 = 线程数量 - 1
集_停止 = 假
[/e]
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
发表于 2013-11-2 20:40:43 | 显示全部楼层   广西壮族自治区桂林市
小磊 发表于 2013-10-29 14:00
你这个写法,我以前用过,后来忘记是什么原因改成了现在这样,这样的话我会先并存一下

感觉楼主的写法还是有问题。

处理数组的时时候,删除了成员,继续循环的话可能会出错,修改了下
  1. .版本 2
  2. .支持库 spec

  3. .子程序 投递任务_新, 整数型, 公开, 往线程池中投递一个任务,返回线程句柄
  4. .参数 函数, 子程序指针
  5. .参数 参数, 整数型, 可空
  6. .参数 超时, 整数型, 可空, 留空,则无限等待
  7. .局部变量 线程个数, 整数型
  8. .局部变量 线程句柄, 整数型
  9. .局部变量 当前时间, 整数型
  10. .局部变量 状态值, 整数型

  11. .如果真 (集_停止)
  12.     返回 (0)
  13. .如果真结束
  14. 当前时间 = 取启动时间 ()
  15. .判断循环首 (真)
  16.     线程个数 = 取数组成员数 (集_线程句柄)
  17.     .判断开始 (线程个数 > 集_线程数量)
  18.         .计次循环首 (线程个数, )
  19.             状态值 = 内部_取线程状态 (集_线程句柄 [线程个数])
  20.             .如果真 (状态值 < 2)
  21.                 TerminateThread (集_线程句柄 [线程个数], 0)
  22.                 CloseHandle (集_线程句柄 [线程个数])
  23.                 删除成员 (集_线程句柄, 线程个数, )
  24.                 跳出循环 ()
  25.             .如果真结束
  26.             线程个数 = 线程个数 - 1
  27.         .计次循环尾 ()
  28.     .默认
  29.         跳出循环 ()
  30.     .判断结束

  31.     .如果真 (超时 > 0)
  32.         .如果真 (取启动时间 () - 当前时间 > 超时)
  33.             返回 (0)
  34.         .如果真结束

  35.     .如果真结束
  36.     处理事件 ()
  37.     延迟 (50)
  38. .判断循环尾 ()
  39. 线程句柄 = CreateThread (0, 0, 到整数 (函数), 参数, 0, 0)
  40. 加入成员 (集_线程句柄, 线程句柄)
  41. 返回 (线程句柄)
复制代码
还有一个问题,就是线程池执行的时候不能改变线程数,能不能加个置线程数
  1. .版本 2

  2. .子程序 置线程数, , 公开, 设置新线程数量
  3. .参数 线程数量, 整数型

  4. 集_停止 = 真
  5. 集_线程数量 = 线程数量 - 1
  6. 集_停止 = 假
复制代码
回复 支持 反对

使用道具 举报

结帖率:60% (3/5)
发表于 2013-10-29 14:00:47 | 显示全部楼层   上海市上海市
你这个写法,我以前用过,后来忘记是什么原因改成了现在这样,这样的话我会先并存一下
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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