



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
标题 循环创建多线程时保证参数的有效性 AntGhazi(原作) 关键字 多线程 传递参数 循环创建多线程时保证参数的有效性 当我们需要在一个循环中传递参数时,使用使用函数的方法一般都是: for(int I=0;I 100;I+) fun(I); /使用函数传递i 每一个循环都会等待fun(I);函数执行完后再进行下一个循环。 但是当我们需要这个循环中创建线程,并将I的参数传递给线程时,如依然使用以上方法,会造成什么情况呢? DWORD WINAPI ThreadFun(LPVOID lpParam) /线程函数 Int *I = (int *)lpParam; Return 0; int I; for(I=0;I 100;I+) DWORD dwThreadId; HANDLE hThread; hThread = CreateThread(NULL,0,ThreadFunc,&I,0,&dwThreadId); 好了,到这里我们就可以发现,在循环中,我们创建线程并传递的参数是I=1后,主程序有可能在执到下一次循环时,第一次的ThreadFun函数仍未执行,而此时的I已经等2了,如果ThreadFun再来调用 Int *I = (int *)lpParam;语句时,显然不是我们想要的结果。 解决此问题的一种方法,便是可以使用静态数组来保存所要传递的参数。如下: int I; static int nPara100; /此句需定义为全局 for(I=0;I 100;I+) DWORD dwThreadId; HANDLE hThread; NParaI=I; /保存参数 hThread = CreateThread(NULL,0,ThreadFunc,&nParaI,0,&dwThreadId); 此时,所有参数均保存在nPara数组中,刚才的问题是解决了。 接下来又有了新的问题,让我们一起来看看吧: 1、如果需要创建的线程不止100,而是非常的大,而且我们也并不知道会有多少次循环的时侯。 2、如果我们需要传递的参数不单单只是一个int型的I,而是一个类。那么我们声明的时侯(假设线程数量最大为65535)则: static CMYClass myClass65535; 编译之后,得到的文件将会堆上一大堆的垃圾。相信任何一位程序都不想看到自己的程序上面堆了一堆垃圾在上面吧。 那么,还有没有更好的办法解决呢。答案是一定的,这里,我就讲一下我自己常用的方法: 动态创建对像传递参数。 一提到动态创建,我们自然会想到new 与 delete ,对了,我想说的也正是他们的使用。 假设参数类型为: typedef struct _PARA int I; DWORD dwNumber; HWND hOther; Para; 使用new 在堆栈中申请一遍空间,在使用完后必需使用delete将其释放。 int I; for(I=0;I I = I; MyPara- dwNumber = 0 ;/自定 MyPara - hOther = GetSafeHWnd();/当前窗体句柄 hThread = CreateThread(NULL,0,ThreadFunc,myPara,0,&dwThreadId); /线程函数 DWORD WINAPI ThreadFun(LPVOID lpParam) /线程函数 Para *myPara = (Para *)lpParam; /执行其他功能 delete myPara; /释放 Return 0; 这样的话,也就不怕传递的参数多少与线程的数量太大了。另外如有需要的话可以加上一个线程计数器,保证当前线程的最大数量。 通常情况,我比较喜欢把线程处理放在一个类中处理,在主程序中尽量不与线程打交道。 以上是我在写ScanPort中遇到的一点点小问题,这里拿出来给大家一起分享,如果您有更好的方法,也请拿出与我们一起论讨。 在循环中使用new 可以保证每次申请到的内存的地址不会是同一个(即不会重复),从而传递给每个线程的参数也互不冲突,互不干扰,相互独立,在线程内部使用完参数后,根据接收的地址,使用delete释放申请的内存块。 AntGhazi/2001.12.21 mailto: /用结构,然后将结构的指针传给CreateThread()的参数lpParameter。需要 注意,结构应该是静态的或是全局的,或者是动态分配的。如果使用局部 变量,有可能在线程调用这个结构时,结构已经不在栈中了。 struct StructA int n1, n2, n3, n4, n5; ; DWORD WINAPI ThreadFun(LPVOID* param) StructA* pa = (StructA*)param; /这儿就可以访问结构中的变量了 /. return 1; void TestFunc() DWORD dwID; /下面的写法不对 StructA a; CreateThread(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 承揽合同和委托合同7篇
- 房地产销售合同注意事项
- 课题申报书合作单位协议
- 廉洁营销合同5篇
- 公路工程标准施工合同与范本讲解
- 2025-2030中国重点城市青年公寓市场饱和度与进入壁垒评估
- 2025-2030中国虚拟现实内容开发生态构建与用户增长潜力分析报告
- 2025-2030中国自动驾驶路测数据开放与商业化落地障碍分析报告
- 2025-2030中国智能仓储分拣机器人效率提升路径分析
- 2025-2030中国智慧水务物联网解决方案市场接受度调研
- 楷书毛笔课件
- 急危重症患者的抢救应急处理预案及流程
- 班主任基本功大赛评分标准
- 额窦手术课件
- 电梯井道圈梁加固工程施工方案
- 流感疫苗项目市场营销策略方案
- 财务代理记账报税合同模板
- HY_T 0330-2022 海滩养护与修复工程验收技术方法
- 十四条经络养生课件
- 清洁生产的实施途径
- 钢结构厂房监理实施细则
评论
0/150
提交评论