MFC 线程内延时有关问题
MFC 线程内延时问题
单击按钮后,创建线程
线程函数
延时函数
现在出现的情况就是,开始线程后,我自己观察了下,大概第一张图片和第二章图片之间的间隔是我设置的50毫秒,之后每张图片的显示都是1秒左右,很奇怪,不知道是为什么?
------解决方案--------------------
你是否能确定是绘图循环变成了 1 秒?还是说仅仅是从屏幕上看视觉效果是 1 秒?
我总感觉你这种绘图方法对 DC 的使用有点不对头,有可能不是每次绘图结果都能被眼睛看到。
————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
------解决方案--------------------
把你的延时函数换成这个
单击按钮后,创建线程
- C/C++ code
void CRandom_CreatDlg::OnButtonStart() { // TODO: Add your control notification handler code here if (!image.isStart) { image.isStart=true; pThread=AfxBeginThread(ThreadDisplay,&image,THREAD_PRIORITY_NORMAL); } else image.isStart=false; }
线程函数
- C/C++ code
UINT ThreadDisplay(LPVOID param) { ImageInfo *pImage=(ImageInfo*)param; if (pImage->m_ImagePathAry.GetSize()==0) { return FALSE; } while(pImage->isStart) { srand(time(NULL)); CDC *pDC=pImage->pWnd->GetDC(); Graphics graph(pDC->GetSafeHdc()); int m_rand=rand()%pImage->m_ImagePathAry.GetSize(); WCHAR* path=pImage->m_ImagePathAry[m_rand].AllocSysString(); Image image(path); graph.DrawImage(&image,pImage->rc.left,pImage->rc.top,pImage->rc.right-pImage->rc.left,pImage->rc.bottom-pImage->rc.top); DelayTime(50); } return TRUE; }
延时函数
- C/C++ code
void DelayTime(DWORD dwMilliseconds) { LARGE_INTEGER littmp; LONGLONG lTimeBegin; LONGLONG lTimeEnd; double dMinus; double dFreq; double dTim; QueryPerformanceFrequency(&littmp); dFreq=(double)littmp.QuadPart; QueryPerformanceCounter(&littmp); lTimeBegin=littmp.QuadPart; do { QueryPerformanceCounter(&littmp); lTimeEnd=littmp.QuadPart; dMinus=(double)(lTimeEnd-lTimeBegin); dTim=dMinus/dFreq; } while (dTim<dwMilliseconds*0.001); }
现在出现的情况就是,开始线程后,我自己观察了下,大概第一张图片和第二章图片之间的间隔是我设置的50毫秒,之后每张图片的显示都是1秒左右,很奇怪,不知道是为什么?
------解决方案--------------------
你是否能确定是绘图循环变成了 1 秒?还是说仅仅是从屏幕上看视觉效果是 1 秒?
我总感觉你这种绘图方法对 DC 的使用有点不对头,有可能不是每次绘图结果都能被眼睛看到。
————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
------解决方案--------------------
把你的延时函数换成这个
- C/C++ code
//************************************** // 延时 //************************************** void delay( DWORD times ) { DWORD dwStart = GetTickCount(); DWORD dwEnd = dwStart; do { doevents(); dwEnd = GetTickCount(); } while( ( dwEnd - dwStart ) <= times ); }