From a39b9bb410593edf105be3ce808b6bfd94f95cde Mon Sep 17 00:00:00 2001 From: Arno Date: Thu, 11 Apr 2013 07:19:51 +0200 Subject: Fix frame cacheDir Get rid of the cache file. Instead, generate the cache on startup. The cache was never written since it was turned into a thread. Because of that I wrote a cleanup function, but surprisingly it didn't have much impact on the startup time, so I dropped the cache file. Also, fix destructor of SmGlobals. Call deleteLater on all Q_OBJECTS, and of course, some header cleanup. --- framecache.cpp | 56 ++++++++++++++++++++++---------------------------------- framecache.h | 8 ++++---- shemov.cpp | 42 ++++++++++++++++-------------------------- shemov.h | 8 ++------ smglobals.cpp | 4 ++-- 5 files changed, 46 insertions(+), 72 deletions(-) diff --git a/framecache.cpp b/framecache.cpp index ef5329a..e6fceaa 100644 --- a/framecache.cpp +++ b/framecache.cpp @@ -26,9 +26,7 @@ FrameCache::FrameCache(QObject *parent) : QObject(parent){ mGenerator = new FrameCacheGenerator(this); mGenerator->init(mSemFree, mSemUsed, mCacheMx, mDataQueue, mFrameCache); mGenerator->readConfig(); - mGenerator->readCache(); - mCacheFile = mGenerator->cacheFile(); - mMagic = mGenerator->magic(); + rebuild(); mGenerator->start(); QSettings s; mWhen = s.value("ui/grabframe", "00:00:00").toString(); @@ -36,14 +34,6 @@ FrameCache::FrameCache(QObject *parent) : QObject(parent){ FrameCache::~FrameCache(){ mGenerator->exit(); - QFile outfile(mCacheFile); - outfile.open(QIODevice::WriteOnly | QIODevice::Truncate); - QDataStream ds(&outfile); - ds << (qint32)mMagic; - for(QHash, QString>::const_iterator it = mFrameCache->constBegin(); it != mFrameCache->constEnd(); ++it){ - ds << it.key().first << it.key().second << it.value(); - } - outfile.close(); } const QPixmap FrameCache::entry(const QString &sourcePath, const QString &when){ @@ -80,7 +70,27 @@ const QString FrameCache::entryPath(const QString &sourcePath, const QString &wh return mFrameCache->value(data); } -FrameCacheGenerator::FrameCacheGenerator(QObject *parent) : QThread(parent), mMagic(0xDEADBEEF), mCacheSubDir(".frameCache"), mCacheFileName("cache") {} +void FrameCache::rebuild(){ + QMutexLocker l(mCacheMx); + QDir cdir(mGenerator->cacheDir()); + QFileInfoList files = cdir.entryInfoList(QDir::Files); + mFrameCache->clear(); + foreach(QFileInfo fi, files){ + QString base = fi.fileName(); + base.chop(fi.suffix().size() + 1); // basename doesn't work, b/c we have filenames w spaces + base.chop(7); //remove temp. extension + QString when = base.right(8); + base.chop(9); //remove when + _, leaving the orig. filename + QPair key = qMakePair(base, when); + if(mFrameCache->contains(key)){ + QFile::remove(fi.absoluteFilePath()); + }else{ + mFrameCache->insert(key, fi.absoluteFilePath()); + } + } +} + +FrameCacheGenerator::FrameCacheGenerator(QObject *parent) : QThread(parent), mCacheSubDir(".frameCache"), mCacheFileName("cache") {} void FrameCacheGenerator::init(QSemaphore *set, QSemaphore *get, QMutex *cachemx, QQueue > *data, QHash, QString> *cache){ mSemFree = set; @@ -106,28 +116,6 @@ void FrameCacheGenerator::readConfig(){ mFfMpegPath = s.value("paths/ffmpeg").toString(); } -void FrameCacheGenerator::readCache(){ - QFile cache(mCacheFile); - cache.open(QIODevice::ReadOnly); - QDataStream ds(&cache); - qint32 magic; - ds >> magic; - if(magic != mMagic){ - return; - } - while(!ds.atEnd()){ - QString source, pos, cacheFile; - ds >> source >> pos >> cacheFile; - QFileInfo fi(cacheFile); - if(fi.size() == 0){ - QFile::remove(fi.absoluteFilePath()); - continue; - } - QPair pair(source, pos); - mFrameCache->insert(pair, cacheFile); - } -} - void FrameCacheGenerator::run(){ forever{ mSemUsed->acquire(); diff --git a/framecache.h b/framecache.h index 509fea6..867eda7 100644 --- a/framecache.h +++ b/framecache.h @@ -27,6 +27,9 @@ class FrameCache : public QObject { const QPixmap entry(const QString &sourcePath, const QString &when = QString()); const QString entryPath(const QString &sourcePath, const QString &when); + public slots: + void rebuild(); + private: QHash, QString> *mFrameCache; QQueue > *mDataQueue; @@ -45,9 +48,8 @@ class FrameCacheGenerator : public QThread { explicit FrameCacheGenerator(QObject *parent = 0); void init(QSemaphore *set, QSemaphore *get, QMutex *cachemx, QQueue > *data, QHash, QString> *cache); const QString cacheFile() const { return mCacheFile; } - qint32 magic() const { return mMagic; }; + const QString cacheDir() const { return mCacheDir; } void readConfig(); - void readCache(); public slots: void run(); @@ -61,9 +63,7 @@ class FrameCacheGenerator : public QThread { QHash, QString> *mFrameCache; QString mCacheDir; QString mCacheFile; - //QString mWhen; QString mFfMpegPath; - const qint32 mMagic; const QString mCacheSubDir; const QString mCacheFileName; diff --git a/shemov.cpp b/shemov.cpp index a2fd195..a99025f 100644 --- a/shemov.cpp +++ b/shemov.cpp @@ -6,42 +6,24 @@ */ #include -#include #include -#include #include -#include #include #include -#include #include #include #include -#include -#include -#include -#include -#include -#include #include -#include -#include #include -#include -#include -#include -#include #include #include #include "shemov.h" #include "filesystemwidget.h" -#include "filestreewidget.h" #include "fileview.h" #include "configurationdialog.h" #include "statisticsdialog.h" -#include "filesystemfileproxy.h" #include "archivetreeview.h" #include "smglobals.h" #include "seriestreewidget.h" @@ -53,13 +35,10 @@ #include "mappingtableeditor.h" #include "mappingtablemodel.h" #include "dbanalyzer.h" -#include "mappingtreewidget.h" #include "newpicsdialog.h" #include "pictureswidget.h" -#include "pictureviewer2.h" -#include "helper.h" #include "smdirmodel.h" -#include "smtreeview.h" +#include "framecache.h" SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags), mOpenWithGroupFS(0), mOpenWithGroupAV(0) { //application icon @@ -164,9 +143,9 @@ void SheMov::closeEvent(QCloseEvent *event){ mATree->filesWidget()->filesTree()->writeSettings(); mPicWidget->picViewer2()->writeSettings(); mPicWidget->writeSettings(); - FilesTreeModel *filesModel = static_cast(SmGlobals::instance()->model("FilesModel")); - filesModel->writeCache(); writeSettings(); + SmGlobals *globals = SmGlobals::instance(); + delete globals; event->accept(); } @@ -407,13 +386,17 @@ void SheMov::createActions(){ //connnect mQuitA = new QAction(tr("Quit"), this); mQuitA->setShortcut(tr("CTRL+q")); + mRebuildFrameCacheA = new QAction(tr("Rebuild frame cache") ,this); + + // general actions + connect(mQuitA, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); + connect(mRebuildFrameCacheA, SIGNAL(triggered()), this, SLOT(rebuildFrameCache())); //Edit menu (FS) mCdupA = new QAction(QIcon(":/up_dick.png"), tr("Go up"), this); connect(mCdupA, SIGNAL(triggered()), mFSWidget, SLOT(parentDir())); mBackDirA = new QAction(QIcon(":/back_dick.png"), tr("Go back"), this); connect(mBackDirA, SIGNAL(triggered()), mFSWidget, SLOT(goBack())); - connect(mQuitA, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); mMarkFilesA = new QAction(tr("Select files..."), this); mMarkFilesA->setShortcut(tr("CTRL++")); connect(mMarkFilesA, SIGNAL(triggered()), mFSWidget->fileView(), SLOT(markFiles())); @@ -766,7 +749,7 @@ void SheMov::createMenus(){ fileMenu->addSeparator(); fileMenu->addAction(mConsistencyA); fileMenu->addAction(mAnalyzerA); - //fileMenu->addAction(mMappingEditorA); + fileMenu->addAction(mRebuildFrameCacheA); fileMenu->addSeparator(); fileMenu->addAction(mQuitA); menuBar()->addMenu(fileMenu); @@ -1119,6 +1102,13 @@ void SheMov::createPalette(){ } } +void SheMov::rebuildFrameCache(){ + int retval = QMessageBox::question(this, tr("Question"), tr("Rebuild frame cache from directory?"), QMessageBox::Yes | QMessageBox::No); + if(retval == QMessageBox::Yes){ + SmGlobals::instance()->frameCache()->rebuild(); + } +} + void SheMov::checkConsistency(){ ConsistencyCheck c; c.exec(); diff --git a/shemov.h b/shemov.h index cb3d3d3..5d5bdd1 100644 --- a/shemov.h +++ b/shemov.h @@ -9,22 +9,16 @@ #define SHEMOV_H #include -#include -#include #include class QTabWidget; class FilesystemWidget; -class QAction; class QLabel; -class QItemSelection; class QSignalMapper; -class QMenu; class QActionGroup; class ArchiveTreeView; class NewMovieWizard; class DbAnalyzerDialog; -class MappingTreeWidget; class PicturesWidget; class SmTreeModel; class NewPicsDialog; @@ -60,6 +54,7 @@ class SheMov : public QMainWindow { void editMappings(QString table); void newPicsDialog(); void newPicsDialogWithFiles(); + void rebuildFrameCache(); signals: void configChanged(); @@ -113,6 +108,7 @@ class SheMov : public QMainWindow { QAction *mAnalyzerA; QAction *mNewPicsA; QAction *mHoverDirectoriesA; + QAction *mRebuildFrameCacheA; //TreeView Actions //Series Actions diff --git a/smglobals.cpp b/smglobals.cpp index 9f52854..6652d0e 100644 --- a/smglobals.cpp +++ b/smglobals.cpp @@ -35,9 +35,9 @@ SmGlobals *SmGlobals::mInstance = 0; SmGlobals::~SmGlobals(){ foreach(QAbstractItemModel *model, mModels.values()){ - delete model; + model->deleteLater(); } - delete mFrameCache; + mFrameCache->deleteLater(); } SmGlobals *SmGlobals::instance(){ -- cgit v1.2.3-70-g09d2