多线程绘图时遇到的srand函数影响延时时间的问题
时间:2011-11-25
来源:互联网
本人最近写一个小程序时遇到的问题,纠结了一两天天,最终得以解决,现将相关情况写在下面,希望其他遇到相同情况的同学能少走些弯路。
实现的功能:基于基本对话框,按下开始按钮后,在对话框内随机绘制若干图片,按下停止按钮后,停止绘制图片。
由于在绘制图片的时候还需要响应按钮消息,所以我用了一个线程去实现绘制图片这部分功能
线程代码如下:
UINT ThreadDisplay(LPVOID param)
{
ImageInfo *pImage=(ImageInfo*)param;
if (pImage->m_ImagePathAry.GetSize()==0)
{
return FALSE;
}
srand(time(NULL));//[color=#FF0000][/color]
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));
Graphics graph(memDC.GetSafeHdc());
int m_rand=rand()%pImage->m_ImagePathAry.GetSize();
//srand(time(NULL));
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(pImage->rc.left,pImage->rc.top,pImage->rc.right-pImage->rc.left,pImage->rc.bottom-pImage->rc.top,&memDC,0,0,SRCCOPY);
DelayTime(30);
}
return TRUE;
}
线程采用的是工作线程,传入的参数里面有要绘制图片的详细信息。请大家注意红色加粗的部分,srand(time(NULL)),之前我一直是放在whlie循环里面,结果我虽然在线程里面有写了DelayTime(30)(这个函数就是网上有很多的精确延时函数,我博客里面也有转载),但是实际效果上,图片的显示间隔却是1秒(视觉感觉上,大概1秒左右)。
这里面也是我一直不理解的地方,我将srand这段代码放在while循环的外面之后发现程序就可以按照我设定的时间间隔绘图了。这个真的很奇怪,难道是srand这个函数干扰了DelayTime延时精度?
ps:
我Debug的时候一直没有发现错误是因为,srand是以当前时间作为seek的,而在线程里面,虽然是在while循环里面,但是每一次执行的时间都是不同,这也就导致了每次产生的随机数也是不同的。
实现的功能:基于基本对话框,按下开始按钮后,在对话框内随机绘制若干图片,按下停止按钮后,停止绘制图片。
由于在绘制图片的时候还需要响应按钮消息,所以我用了一个线程去实现绘制图片这部分功能
线程代码如下:
UINT ThreadDisplay(LPVOID param)
{
ImageInfo *pImage=(ImageInfo*)param;
if (pImage->m_ImagePathAry.GetSize()==0)
{
return FALSE;
}
srand(time(NULL));//[color=#FF0000][/color]
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));
Graphics graph(memDC.GetSafeHdc());
int m_rand=rand()%pImage->m_ImagePathAry.GetSize();
//srand(time(NULL));
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(pImage->rc.left,pImage->rc.top,pImage->rc.right-pImage->rc.left,pImage->rc.bottom-pImage->rc.top,&memDC,0,0,SRCCOPY);
DelayTime(30);
}
return TRUE;
}
线程采用的是工作线程,传入的参数里面有要绘制图片的详细信息。请大家注意红色加粗的部分,srand(time(NULL)),之前我一直是放在whlie循环里面,结果我虽然在线程里面有写了DelayTime(30)(这个函数就是网上有很多的精确延时函数,我博客里面也有转载),但是实际效果上,图片的显示间隔却是1秒(视觉感觉上,大概1秒左右)。
这里面也是我一直不理解的地方,我将srand这段代码放在while循环的外面之后发现程序就可以按照我设定的时间间隔绘图了。这个真的很奇怪,难道是srand这个函数干扰了DelayTime延时精度?
ps:
我Debug的时候一直没有发现错误是因为,srand是以当前时间作为seek的,而在线程里面,虽然是在while循环里面,但是每一次执行的时间都是不同,这也就导致了每次产生的随机数也是不同的。
作者: txg703003659 发布时间: 2011-11-25
上面的复制错了,while循环里面的srand函数在m_rand这个变量前面。具体可以去看我的博客,http://blog.csdn.net/txg703003659/article/details/7009814希望有知道原因的大虾能告知一下,不胜感激!
作者: txg703003659 发布时间: 2011-11-25
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28