• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

循环创建多线程时保证参数的有效性

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 31次 | 进入软件测试论坛讨论

领测软件测试网

循环创建多线程时保证参数的有效性

当我们需要在一个循环中传递参数时,使用使用函数的方法一般都是:

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 nPara[100];     //此句需定义为全局

for(I=0;I<100;I++){

DWORD dwThreadId;

HANDLE hThread; 
NPara[I]=I;                //保存参数    hThread = CreateThread(NULL,0,ThreadFunc,&nPara[I],0,&dwThreadId);

}

此时,所有参数均保存在nPara数组中,刚才的问题是解决了。

接下来又有了新的问题,让我们一起来看看吧:

1、如果需要创建的线程不止100,而是非常的大,而且我们也并不知道会有多少次循环的时侯。

2、如果我们需要传递的参数不单单只是一个int型的I,而是一个类。那么我们声明的时侯(假设线程数量最大为65535)则:

static CMYClass myClass[65535];

编译之后,得到的文件将会堆上一大堆的垃圾。相信任何一位程序都不想看到自己的程序上面堆了一堆垃圾在上面吧。

那么,还有没有更好的办法解决呢。答案是一定的,这里,我就讲一下我自己常用的方法:

动态创建对像传递参数。

一提到动态创建,我们自然会想到new 与 delete ,对了,我想说的也正是他们的使用。

假设参数类型为:

typedef struct _PARA{

    int I;

    DWORD dwNumber;

    HWND hOther;

}Para;

使用new 在堆栈中申请一遍空间,在使用完后必需使用delete将其释放。

int I;

for(I=0;I<100;I++){

DWORD dwThreadId;

HANDLE hThread; 
Para *myPara = new Para;
MyPara->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中遇到的一点点小问题,这里拿出来给大家一起分享,如果您有更好的方法,也请拿出与我们一起论讨。

 

AntGhazi/2001.12.21


延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网