Wince Invalidate刷新问题 百思不得其解
问题描述: 继承了CStatic封装了一个类,用于描绘曲线, 采用双缓存画图法。在OnPaint()函数中有如下代码:
void MyStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetClientRect(&rect);
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
CBitmap bitmap;
CBitmap* pOldBitmap = NULL;
bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
pOldBitmap = MemDC.SelectObject(&bitmap);
MemDC.FillSolidRect(rect, m_BackColor);
if (g_nStatus == 1)
{
for (int i=0; i<g_arrDateX.GetSize()-1; i++)
{
MemDC.MoveTo(g_arrDateX[i], g_arrDateY[i]);
MemDC.LineTo(g_arrDateX[i+1], g_arrDateY[i+1]);
}
}
dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(pOldFont);
MemDC.SelectObject(pOldBitmap);
}
然后创建一线程,线程里添加画图数据,线程函数如下:
void __stdcall ThreadFun(LPVOID lpVoid)
{
while (!g_bStop)
{
/////////////////////////////////////
// 线程延时(勿略)
static float fTime = 0;
if (g_nStatus == 1)
{
fTime = fTime + 0.06f;
g_arrDateX.Add(fTime);
g_arrDateY.Add(50);
// 刷新曲线
if (g_arrDateX.GetSize() % 5 == 0)
{
((CTestDlg*)g_pTestDlg)->PostMessage(WM_USER_UPDATA, 0, 0);
}
}
}
}
WM_USER_UPDATA为线程通知主界面刷新消息,WM_USER_UPDATA执行函数如下:
afx_msg LRESULT CTestDlg::OnUpData(WPARAM wParam, LPARAM lParam)
{
m_MyStatic.Invalidate(); // 执行MyStatic::OnPaint()
return 1;
}
问题如下:按原理,同于数据量不断增大,刷新会变得很慢,但1000秒内不会界面无反应,大概在600秒左右停止线程(即停止刷新),MyStatic::OnPaint()无问题,能刷新过来,但接下来问题就
来了,这时候只要有另一窗体遮住MyStatic窗体,当关掉遮挡窗体后MyStatic再也刷新不过来了,能测出MyStatic::OnPaint()一定在执行,就是刷新不过来,好像失效似的。不知为何???
[解决办法]
感觉你这个跟我之前遇到的问题差不多
http://topic.csdn.net/u/20111201/19/4efb3644-ad08-42e9-9609-b62d05ae57e8.html
我程序里采用了多线程,最后用事件对象进行了互斥,然后这个问题就解决了
光是你这段程序,好像没什么问题,应该是跟其他线程抢资源,然后造成冲突