mutable在这种情况下到底需不需要?(高手进)
我现在正在维护一个程序的界面,使用了mutable,这个界面使用wxWidgits写的,要实时更新进度(剩余多长时间转换完成),我说一下程序的大致流程:
mutable wxString timeLeft; //记录还剩余多长时间的字符变量,因为要在程序的一个地方被写,OnPaint()中读取,所以用mutable
void CShow::OnPaint(wxPaintEvent& WXUNUSED(event) )
{
wxPaintDC dc( this );
PrepareDC( dc );
wxSize sz = GetClientSize();
wxRect rect(0, 0, sz.x, sz.y);
// 画一个大背景
if (m_wxBmpBackground.IsNull())
return;
wxMemoryDC memDC;
memDC.SelectObject(m_wxBmpBackground);
dc.Blit(0, 0, m_wxBmpBackground.GetWidth(), m_wxBmpBackground.GetHeight(), & memDC, 0, 0, wxCOPY, true);
dc.SetFont(*wxNORMAL_FONT);
dc.SetTextForeground(wxColour(wxT("#0046d5")));
dc.DrawText(timeLeft, wxPoint(20, 32));
}
...
timeleft = ...//在这里给timeLeft变量赋值
Refresh(); //强制重新绘制,调用OnPaint(),从而在界面上显示timeLeft的值
因为程序在运行中会快速改变timeLeft的值,所以我使用mutable来声明timeLeft,因为这样的话,OnPaint()重绘制的时候,就会直接从内存中读取timeLeft的值,而不是timeLeft的副本,这样可以达到很好的实时性(个人观点)。
但我的同事看了我写的上述代码后,认为没有必要使用mutable,因为timeLeft对于该cpp就是全局的,我去掉mutable,结果也是正确的,界面也更新了显示。
但我们知道OnPaint()在界面产生微小改变的时候都会重绘,调用频率很高,所以我担心OnPaint()在一个时间段内读取的只是timeLeft的副本,而不是真实的timeLeft的值,虽然程序运行没有见到显示值的异常,但正确的作法应该加上mutable,不知道我说的有没有道理?