`
gaofen100
  • 浏览: 1227708 次
文章分类
社区版块
存档分类
最新评论

MFC使用多线程时请谨慎使用srand()来产生随机数

 
阅读更多

本人最近写一个小程序时遇到的问题,纠结了一两天天,最终得以解决,现将相关情况写在下面,希望其他遇到相同情况的同学能少走些弯路。

实现的功能:基于基本对话框,按下开始按钮后,在对话框内随机绘制若干图片,按下停止按钮后,停止绘制图片。

由于在绘制图片的时候还需要响应按钮消息,所以我用了一个线程去实现绘制图片这部分功能

线程代码如下:

Graphics graph(memDC.GetSafeHdc());int m_rand=rand()%pImage->m_ImagePathAry.GetSize();WCHAR* path=(pImage->imagepath+"\\"+pImage->m_ImagePathAry[m_rand]).AllocSysString();Image image(path);graph.DrawImage(&image,0,0,pImage->rc.right-pImage->rc.left,pImage->rc.bottom-pImage->rc.top);pDC->BitBlt(pImag e->rc.left,pImage->rc.top,pImage->rc.right-pImage->rc.left,pImage->rc.bottom-pImage->rc.top,&memDC,0,0,SRCCOPY); pImage->pWnd->ReleaseDC(pDC);//m_rand++; DelayTime(30);//延时30毫秒}return TRUE;}


线程采用的是工作线程,传入的参数里面有要绘制图片的详细信息。请大家注意红色加粗的部分,srand(time(NULL)),之前我一直是放在whlie循环里面,结果我虽然在线程里面有写了DelayTime(30)(这个函数就是网上有很多的精确延时函数,我博客里面也有转载),但是实际效果上,图片的显示间隔却是1秒(视觉感觉上,大概1秒左右)。

这里面也是我一直不理解的地方,我将srand这段代码放在while循环的外面之后发现程序就可以按照我设定的时间间隔绘图了。这个真的很奇怪,难道是srand这个函数干扰了DelayTime延时精度?

ps:

我Debug的时候一直没有发现错误是因为,srand是以当前时间作为seek的,而在线程里面,虽然是在while循环里面,但是每一次执行的时间都是不同,这也就导致了每次产生的随机数也是不同的。



  


  
分享到:
评论

相关推荐

    MFC实现产生随机数

    总结起来,通过MFC在VC++中实现生成随机数的功能,你需要创建一个MFC对话框应用程序,添加一个按钮控件,处理按钮点击事件,然后在事件处理函数中使用C++的标准库生成随机数。这个过程涉及了MFC的消息映射、控件交互...

    用rand()和srand()产生为随机数的方法总结

    例如,使用当前系统时间作为种子值,可以使用 `srand((unsigned)time(0))`,这样每次程序运行时,随机数生成器的种子值都会不同,从而产生不同的随机数。 4. 取得指定范围的随机整数 要取得指定范围 [a, b) 之间的...

    c语言中rand()和srand()产生随机数方法比较

    每次调用 `rand()` 时,它都会返回序列中的下一个随机数,如果没有使用 `srand()` 来设置种子,那么默认情况下,程序的启动时间被用作初始种子,这意味着如果程序多次运行而没有改变种子,将得到完全相同的随机数...

    MFC 随机数生成器 抽奖器

    `std::rand()`函数可以生成一个0到RAND_MAX之间的伪随机数,而`std::srand()`函数用于设置随机数种子,通常用当前时间作为种子以确保每次运行时生成不同的序列。在MFC中,可以使用C++标准库的方法,或者使用MFC的`...

    rand()与srand()_函数_随机数_

    1. 使用`srand()`初始化随机数生成器,通常在程序开始时调用,以确保每次运行时得到不同的随机数序列。 2. 在需要随机数的地方调用`rand()`。每次调用都会返回一个新的随机数。 示例代码: ```cpp #include #...

    Keil C51 中产生随机数的方法

    为了确保每次程序运行时都能得到不同的随机数序列,我们通常会使用`srand()`函数来设置这个种子。 #### `srand()`函数 `srand()`函数的原型同样位于`<stdlib.h>`中,它接受一个整型参数作为种子,用于初始化`rand...

    asd.rar_MFC 随机数

    在这个环境中,开发者通常会使用C++标准库或者MFC库中的特定功能来创建随机数。 在VC++ 6.0中,生成随机数主要依赖于C++标准库中的`<cstdlib>`或`<ctime>`头文件。其中,`<cstdlib>`提供了`rand()`函数,用于生成伪...

    产生随机数的方法

    `srand()`函数位于`<ctime>`或`<time.h>`头文件中,它需要一个无符号整数作为参数,通常我们会使用`time(NULL)`来获取当前的系统时间作为种子,因为系统时间每秒都会改变,这样可以确保每次运行程序时得到的随机数...

    C语言产生随机数详解

    * 在调用rand函数产生随机数前,必须先利用srand函数设好随机数种子,如果未设随机数种子,rand函数在调用时会自动设随机数种子为1。 srand函数的使用方法: * srand函数的原形是void srand(unsigned int seed); ...

    用c语言产生随机数

    因此,为了确保每次运行程序时能够得到不同的随机数序列,通常使用当前时间作为种子,并通过srand()函数传入种子值,即srand((unsigned)time(NULL))。这里的time(NULL)返回当前时间的时间戳,由于每次运行程序时时间...

    C++产生随机数的几种方法

    - 在多线程环境下,每个线程应有自己的随机数引擎实例,以避免竞态条件。 总的来说,C++提供了多种生成随机数的方法,从基础的`rand()`到高级的`<random>`库,可以根据项目需求选择合适的方法。理解并熟练掌握这些...

    mfc.rar_mfc 排序_mfc随机排序_随机数

    在MFC中,可以使用库中的rand()函数来生成随机数,配合srand()函数设置种子以确保每次运行的随机性。 “随机数”这部分可能涵盖了如何在MFC应用中生成和使用随机数。在C++中,可以使用C++11引入的库来生成高质量的...

    c++随机数产生函数

    srand()函数用来设置rand()函数产生随机数时的随机数种子,函数原型为`void srand(unsigned int seed)。`srand()函数的参数seed必须是一个整数,通常可以使用geypid()或time(0)的返回值作为种子。如果每次seed都设...

    VC6.0++,MFC随机数生成对话框

    在本文中,我们将深入探讨如何使用Microsoft Visual C++ 6.0(简称VC6.0)集成开发环境和MFC(Microsoft Foundation Classes)库来创建一个应用程序,该程序能够生成大量随机数,对其进行排序,并将结果保存到文本...

    用c语言产生随机数.doc

    本文将详细介绍如何使用C语言中的`rand()`函数以及配套的`srand()`函数来生成伪随机数,并探讨如何通过设置随机数种子来获取更高质量的随机数序列。 #### `rand()`与`srand()`函数详解 ##### `rand()`函数 `rand()...

    利用srand函数产生随机数模拟掷塞子各面出现的次数

    利用系统内srand函数,模拟投掷一枚塞子60000次时,各个面出现的次数。

    C语言产生随机数C语言产生随机数.doc

    * 在调用 rand() 函数之前,必须先使用 srand() 函数设置随机数的种子值。 * 如果未设置随机数种子,rand() 函数将自动设置种子为 1。 srand() 函数的使用: * srand() 函数用于设置随机数的种子值。 * srand() ...

    Qt里产生随机数.doc

    在Qt中生成随机数,我们可以使用C++标准库提供的`rand()`和`srand()`函数,也可以利用Qt自身的类`QRandomGenerator`。首先,我们来深入理解`rand()`和`srand()`。 `rand()`函数是一个返回伪随机数的函数,其返回的...

    vc6.0产生随机数

    `srand()` 是用来设置随机数种子的,它接受一个无符号整数作为参数,通常我们使用当前时间作为种子,以确保每次运行程序时生成的序列不同。 下面是一个简单的示例,展示如何在VC6.0中使用这两个函数: ```cpp #...

Global site tag (gtag.js) - Google Analytics