创建100个事件对象,是不是有点多?

_船长_ 2013-11-17 02:49:40
遇到一个问题,不知道该如何解决才好,来请教一下大家,把问题描述一下:

引用
开4个线程用来进行文件拷贝,用户选择一个文件拷贝操作项,线程就处理一个,最多选择100个操作项。


我想到的解决方法:

将文件拷贝需要用到的数据定义为一个结构体COPYFILE,然后在内存中开辟一块大小为100*sizeof(COPYFILE)的内存区域g_Mem,同时创建100个事件对像数组g_Event[100]和[color=#0000FF],

主线程中的处理:

定义int nEvent[100],用来标记事件对象的信号状态(其中1表示有信号,0表示没有信号),初始状态全为0,当用户选择一个文件拷贝操作项时,遍历nEvent[100]数组,找出值为0的项序号nIndex,

引用
1)、找到:
设置g_Event[nIndex]为有信号状态,并对g_Mem+sizeof(COPYFILE)*nIndex进行赋值,最后将nEvent[nIndex]赋值为1;

2)、没有找到:
则提示用户当前已经选择了100个文件拷贝操作,无法再选择


拷贝线程中的处理:

DWORD dwIndex = WaitForMultipleObjects(100, g_Event, FALSE, INFINITE);

g_Mem+sizeof(COPYFILE)*(dwIndex - WAIT_OBJECT_0)就得到了文件拷贝需要的数据结构体COPYFILE,拷贝完成,给主线程发送一个WM_MY_COMPLETE消息,附带参数dwIndex - WAIT_OBJECT_0。

主线程接收到该消息,知道当前事件对象没有信号,下次就可以重新设置该事件对象

想到的注意问题:WaitForMultipleObjects这个函数存在一个问题,如果每次有很多事件对象处于触发状态,都会返回序号靠前的,这样就有可能导致序号靠后的没有机会被执行!

我暂时想到了这个注意问题,不知道是否还有其他注意事项,欢迎大家指教一下!

创建100个事件对象,是不是有点多?不知大神们怎么看??或者是还有更好的解决方法,希望大家不吝赐教。
...全文
273 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobo_包子 2013-11-22
  • 打赏
  • 举报
回复
IOCP高性能,比你开那么多线程好多了
xiaohuh421 2013-11-19
  • 打赏
  • 举报
回复
是有些多了, 内核的资源有限, 并且因为需要与用户层通信, 效率什么低一些.
_船长_ 2013-11-18
  • 打赏
  • 举报
回复
自己顶下吧。
_船长_ 2013-11-18
  • 打赏
  • 举报
回复
自己顶下吧。
_船长_ 2013-11-18
  • 打赏
  • 举报
回复
引用 10 楼 oyljerry 的回复:
[quote=引用 4 楼 jzycode 的回复:] 发现WaitForMultipleObjects最多只能等待64个事件对象,100个会失败!不过,不要紧,那我最多选择64个文件拷贝!
没必要这么多事件,搞一个线程池,当所有线程都在处理,就把文件放队列等待。[/quote] 好的,多谢指点,我通过两种方法实现下,比较效率如何!反正是我工作之余做的一个小项目!
_船长_ 2013-11-18
  • 打赏
  • 举报
回复
引用 12 楼 bjtbjt 的回复:
[quote=引用 10 楼 oyljerry 的回复:] [quote=引用 4 楼 jzycode 的回复:] 发现WaitForMultipleObjects最多只能等待64个事件对象,100个会失败!不过,不要紧,那我最多选择64个文件拷贝!
没必要这么多事件,搞一个线程池,当所有线程都在处理,就把文件放队列等待。[/quote] 队列,循环,同步。[/quote] 我的那个方法不用考虑同步的问题!
oyljerry 2013-11-18
  • 打赏
  • 举报
回复
引用 4 楼 jzycode 的回复:
发现WaitForMultipleObjects最多只能等待64个事件对象,100个会失败!不过,不要紧,那我最多选择64个文件拷贝!
没必要这么多事件,搞一个线程池,当所有线程都在处理,就把文件放队列等待。
5t4rk 2013-11-18
  • 打赏
  • 举报
回复
引用 10 楼 oyljerry 的回复:
[quote=引用 4 楼 jzycode 的回复:] 发现WaitForMultipleObjects最多只能等待64个事件对象,100个会失败!不过,不要紧,那我最多选择64个文件拷贝!
没必要这么多事件,搞一个线程池,当所有线程都在处理,就把文件放队列等待。[/quote] 队列,循环,同步。
碼上道 2013-11-17
  • 打赏
  • 举报
回复
感觉一个几个线程就行了,硬盘性能也没有这么高。fastcopy这个软件,看一下实现思路
_船长_ 2013-11-17
  • 打赏
  • 举报
回复
引用 5 楼 worldy 的回复:
LZ是否要使用4个线程拷贝100个文件啊?
??有什么问题嘛?
worldy 2013-11-17
  • 打赏
  • 举报
回复
LZ是否要使用4个线程拷贝100个文件啊?
_船长_ 2013-11-17
  • 打赏
  • 举报
回复
发现WaitForMultipleObjects最多只能等待64个事件对象,100个会失败!不过,不要紧,那我最多选择64个文件拷贝!
wangk 2013-11-17
  • 打赏
  • 举报
回复
引用 2 楼 jzycode 的回复:
[quote=引用 1 楼 akirya 的回复:] 开1个线程就够了 可以考虑用IOCP
创建100个事件对象没有不妥吧?因为从来没有创建过这么多的事件对象,有点怀疑啊![/quote] 创建100个事件没有什么不妥,不过这不是个良好的设计思路。 建议使用一个处理队列,配合线程同步就是了。
_船长_ 2013-11-17
  • 打赏
  • 举报
回复
引用 1 楼 akirya 的回复:
开1个线程就够了 可以考虑用IOCP
\ 创建100个事件对象没有不妥吧?因为从来没有创建过这么多的事件对象,有点怀疑啊!
  • 打赏
  • 举报
回复
开1个线程就够了 可以考虑用IOCP
1、 JavaScript 的基本类型有哪些?引用类型有哪些?null 和 undefined 的区别?(必 会) 76 2、如何判断 JavaScript 的数据类型?(必会) JavaScript 数据类型一共有 7 种: 77 2、 创建对象有几种方法(必会) 79 4、简述创建函数的几种方式? (必会) 79 5、Javascript 创建对象的几种方式? (必会) 79 6、请指出 JavaScript 宿主对象和原生对象的区别?(必会) 81 7、 JavaScript 内置的常用对象有哪些?并列举该对象常用的方法?(必会) 82 8、 === 和 ==的区别?(必会) 87 9、 null,undefined 的区别(必会) 88 10、JavaScript 中什么情况下会返回 undefined 值?(必会) 88 11、如何区分数组和对象?(必会) 89 12、怎么判断两个对象相等?(必会) 89 13、列举三种强制类型转换和两种隐式类型转换?(必会) 91 14、 JavaScript 中怎么获取当前日期的月份?(必会) 91 15、 什么是类数组(伪数组),如何将其转化为真实的数组?(必会) 92 16、如何遍历对象的属性?(必会) 92 17、src 和 href 的区别是?(必会) 94 18、如何使用原生 JavaScript 给一个按钮绑定两个 onclick 事件?(必会) 95 19、 如何在 JavaScript 中比较两个对象?(必会) 95 20、JavaScript 中的作用域、预解析与变量声明提升? (必会) 97 21、变量提升与函数提升的区别?(必会) 99 22、 什么是作用域链?(必会) 99 23、如何延长作用域链?(必会) 99 23、 判断一个值是什么类型有哪些方法?(必会) 100 25、JavaScript 变量按照存储方式区分为哪些类型,并描述其特点?(必会) 100 26、如何实现数组的随机排序?(必会) 100 27、 Function foo() {}和 var foo = function() {}之间 foo 的用法上的区别?(必会) 101 28、索引有哪几种类型,有什么区别?(了解) 102 29、简述 Array.form 和 Array.of 的使用及区别?(了解) 103 30、根据你的理解,请简述 JavaScript 脚本的执行原理(了解) 104 WebAPI 105 1、 什么是 dom?(必会) 105 2、dom 是哪种基本的数据结构?(必会) 105 3、 dom 操作的常用 api 有哪些?(必会) 105 4、 dom 节点的 Attribute 和 Property 有何区别?(必会) 106 5、dom 结构操作怎样添加、移除、移动、复制、创建和查找节点?(必会) 106 6、dom 事件的级别?(必会) 107 7、dom 事件模型?(必会) 107 8、dom 事件流?(必会) 107 9、什么是事件冒泡,它是如何工作的?如何阻止事件冒泡?(必会) 108 10、JavaScript 动画和 CSS3 动画有什么区别?(必会) 108 11、event 对象的常见应用?(必会) 109 12、自定义事件/ 模拟事件?(必会) 109 13、通用事件绑定/ 编写一个通用的事件监听函数?(必会) 110 14、dom 和 bom 的区别(必会) 111 15、事件三要素(必会) 111 16、事件执行过程(必会) 111 17、获取元素位置(必会) 112 18、封装运动函数(必会) 112 19、绑定事件和解除事件的区别(必会) 113 20、谈谈事件委托的理解?(必会) 114 21、 JavaScript 中的定时器有哪些?他们的区别及用法是什么?(必会) 114 22、比较 attachEvent 和 addEventListener?(必会) 115 23、document.write 和 innerHTML 的区别?(必会) 115 24、 什么是 window 对象?什么是 document 对象?(必会) 116 25、Js 拖动的原理?(必会) 118 26、描述浏览器的渲染过程,DOM 树和渲染树的区别(必会) 119 27、dom 树和 render 树之间的关系?(高薪常问) 119 28、获取到页面中所有的 CheckBox 怎么做(不适用第三方框架)?(高薪常问) 119 29、 简单说一下页面重绘和回流?(高薪常问) 119 30、如何最小化重绘(repaint)和回流(reflow)(高薪常问) 120 31、Js 延迟加载的方式有哪些?(了解) 120 32、IE 与

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧