当前位置:编程学习 > C/C++ >>

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

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

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

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

      线程代码如下:

     

[cpp] UINT ThreadDisplay(LPVOID param) 

    ImageInfo *pImage=(ImageInfo*)param; 
    if (pImage->m_ImagePathAry.GetSize()==0) 
    { 
        return FALSE; 
    } 
        <strong><span style="color:#ff0000;">srand(time(NULL));//</span></strong>  
    while(1) 
    {    
 
        CDC *pDC=pImage->pWnd->GetDC(); 
        CDC memDC; 
        CBitmap MemBitmap; 
        memDC.CreateCompatibleDC(NULL) 
        MemBitmap.CreateCompatibleBitmap(pDC,pImage->rc.right-pImage->rc.left,pImage->rc.bottom-pImage->rc.top); 
        memDC.SelectObject(MemBitmap); 
        memDC.FillSolidRect(0,0,pImage->rc.right-pImage->rc.left,pImage->rc.bottom-pImage->rc.top,RGB(255,255,255)); 
                <pre name="code" class="cpp">               <strong><span style="color:#ff0000;"> //srand(time(NULL));</span></strong> 
UINT ThreadDisplay(LPVOID param)
{
 ImageInfo *pImage=(ImageInfo*)param;
 if (pImage->m_ImagePathAry.GetSize()==0)
 {
  return FALSE;
 }
        <strong><span style="color:#ff0000;">srand(time(NULL));//</span></strong>
 while(1)
 {  

  CDC *pDC=pImage->pWnd->GetDC();
  CDC memDC;
  CBitmap MemBitmap;
  memDC.CreateCompatibleDC(NULL)
  MemBitmap.CreateCompatibleBitmap(pDC,pImage->rc.right-pImage->rc.left,pImage->rc.bottom-pImage->rc.top);
  memDC.SelectObject(MemBitmap);
  memDC.FillSolidRect(0,0,pImage->rc.right-pImage->rc.left,pImage->rc.bottom-pImage->rc.top,RGB(255,255,255));
                <pre name="code" class="cpp">               <strong><span style="color:#ff0000;"> //srand(time(NULL));</span></strong>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循环里面,但是每一次执行的时间都是不同,这也就导致了每次产生的随机数也是不同的。

 

摘自 txg703003659的专栏
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,