class FileInfo{public: FileInfo() {} FileInfo(const FileInfo& ci) { // m_bSysIcon = ci.m_bSysIcon; m_icon = ci.m_icon; m_pathName = ci.m_pathName; m_bIsUpDir = ci.m_bIsUpDir; m_FileInfo = ci.m_FileInfo; // } const FileInfo& operator=(const FileInfo& stringSrc) { // m_bSysIcon = stringSrc.m_bSysIcon; m_icon = stringSrc.m_icon; m_pathName = stringSrc.m_pathName; m_bIsUpDir = stringSrc.m_bIsUpDir; m_FileInfo = stringSrc.m_FileInfo; // return *this; } virtual ~FileInfo() {}// QString m_pathName; bool m_bSysIcon; QIcon m_icon; bool m_bIsUpDir; QFileInfo m_FileInfo;//};
QIconsLoaderThread::QIconsLoaderThread(QObject *parent) : QThread(parent){ m_bAbort = false;}QIconsLoaderThread::~QIconsLoaderThread(){ QMutexLocker locker(&m_mutex); m_bAbort = true;}void QIconsLoaderThread::Load(){ qDebug()<<"Call Load()"; QMutexLocker locker(&m_mutex); if (!isRunning()) { m_bAbort = false; start(); }}void QIconsLoaderThread::run(){ qDebug()<<"Call run()"; QFileListModel* pModel = qobject_cast<QFileListModel*>(this->parent()); QMutexLocker locker(&m_mutex); for(int i=0; i<=pModel->m_FileList.count()-1; i++) { if (m_bAbort) { pModel = 0; qDebug()<<"Thread stoped!"; break; } FileInfo* pFileInfo = const_cast<FileInfo*>(pModel->m_FileList[i]); if((!pFileInfo->m_bSysIcon) && (!pFileInfo->m_FileInfo.isDir())) { pFileInfo->m_icon = GetIcon(pFileInfo->m_pathName); pFileInfo->m_bSysIcon = true; } pFileInfo = 0; emit pModel->reset(); }}void QIconsLoaderThread::stop(){ qDebug()<<"Call stop()"; QMutexLocker locker(&m_mutex); if(isRunning()) { m_bAbort = true; wait(); }}
void QIconsLoaderThread::Load() { qDebug()<<"Call Load()"; QMutexLocker locker(&m_mutex); if (!isRunning()) { m_bAbort = false; start(); } }
qDebug()<<"Call run()"; QFileListModel* pModel = qobject_cast<QFileListModel*>(this->parent());
class FileInfo { private: class IconLocker { public: IconLocker(QIcon * icon, QMutex * lock):m_icon(icon), m_lock(lock) { m_lock->lock(); } ~IconLocker() { m_lock->unlock(); } QIcon * operator->() { return m_icon; } private: QIcon * m_icon; QMutex * m_lock; };public: FileInfo() {} FileInfo(const FileInfo& ci) { // m_bSysIcon = ci.m_bSysIcon; m_icon = ci.m_icon; m_pathName = ci.m_pathName; m_bIsUpDir = ci.m_bIsUpDir; m_FileInfo = ci.m_FileInfo; // } const FileInfo& operator=(const FileInfo& stringSrc) { // m_bSysIcon = stringSrc.m_bSysIcon; m_icon = stringSrc.m_icon; m_pathName = stringSrc.m_pathName; m_bIsUpDir = stringSrc.m_bIsUpDir; m_FileInfo = stringSrc.m_FileInfo; // return *this; } virtual ~FileInfo() {} IconLocker getIcon() { return IconLocker(&m_icon, &m_memberLock); } void setIcon(const QIcon & icn) { QMutexLocker locker(&m_memberLock); m_icon = icn; } bool isSysIcon() { QMutexLocker locker(&m_memberLock); return m_bSysIcon; } bool isDir() { QMutexLocker locker(&m_memberLock); return m_FileInfo.isDir(); }; // QString m_pathName; bool m_bSysIcon; QIcon m_icon; bool m_bIsUpDir; QFileInfo m_FileInfo; QMutex m_memberLock; // };
QFileListModel::QFileListModel(QObject *parent): QAbstractTableModel(parent){ connect(this, SIGNAL(reset()),this, SLOT(reset())); m_pLoaderThread = new QIconsLoaderThread(this); //m_iCount = GetLocalFiles(QString("c:\\")); SetCurrentPath(QString("c:\\"));}QList<FileInfo*> QFileListModel::GetFileList() const{ QMutexLocker locker(&m_mutex); return m_FileList;}void QFileListModel::reset(){ QMutexLocker locker(&m_mutex); QAbstractTableModel::reset();}
QList<FileInfo*> locList = pModel->GetFileList();иQMetaObject::invokeMethod(pModel, "reset", Qt::QueuedConnection);
connect(this, SIGNAL(reset()),this, SLOT(reset()));
void QFileListModel::notifyAboutChanges(int fileNumber) { emit dataChanged(index(fileNumber, m_colNumber), index(fileNumber, m_colNumber)); }
QMetaObject::invokeMethod(pModel, "notifyAboutChanges", Qt::QueuedConnection, Q_ARG(int, i));