以前程序中使用duiLib的资源文件,一直指定为 UILIB_ZIP.
可以最近在写一个从设备中读取信息的List填充,当设备插入时的同时,用鼠标托住UI乱晃,在程序填充List的时候,卡了一下。
从设备中读取信息,是在线程中做的。只可能是填充数据的时候卡了。
经过测量,发现问题在生成每一行的ListItem处。因为每一个ListItem都是装入的xml文件。
每次刷新List之前,因为不同的设备信息数量不同。为了简单,直接将List清掉。再重新填充。
这样导致从磁盘读取ListItem的xml文件随行数的增加,时间也增加。
今天想到一招,将资源类型改为 UILIB_ZIPRESOURCE, 试了试,同样的操作,感觉不到卡, DuiLib设计的NB啊, 连这都能为用户想到.
资源类型改变后,改动的代码很少.
/// @file XmlWnd.h
/// @brief 从Xml文件生成的窗体基类
#ifndef __XML_WND_H__
#define __XML_WND_H__
class CXmlWnd : public WindowImplBase
{
public:
// CXmlWnd();
CXmlWnd(WCHAR * pcXmlFileName, WCHAR * pcWndClassName);
virtual ~CXmlWnd();
/// 返回的资源类型是Zip时, 调不到GetSkinFolder, 因为是纯虚函数, 要实现一下
virtual CDuiString GetSkinFolder(void);
/// 以下的虚函数都是能调到的
virtual LRESULT WndMessageProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
virtual LRESULT SysMessageProc(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled);
virtual CDuiString GetZIPFileName() const;
virtual CDuiString GetSkinFile();
virtual LPCTSTR GetWindowClassName(void) const;
virtual UILIB_RESOURCETYPE GetResourceType() const;
virtual LPCTSTR GetResourceID() const;
UILIB_RESOURCETYPE CXmlWnd::GetResourceType() const
{
return UILIB_ZIPRESOURCE;
}
LPCTSTR CXmlWnd::GetResourceID() const
{
return MAKEINTRESOURCE(IDR_BIN_SKIN_ZIP);
}
/
//
// BIN
//
IDR_BIN_SKIN_ZIP ZIPRES "..\\uidesign\\skin.zip"