[英]qt the best way to sync files with a sqlite db
我正在尋找與sqlite db同步某些目錄中文件的最佳方法。
首先,我使用一個線程來遞歸查找按擴展名篩選的文件,並將其添加到我的數據庫中。 接下來,我使用QFileSystemWatcher來監視文件是否更改並且運行良好。
問題是每次我運行應用程序時,我都不知道文件是否已更改,因此我需要運行線程,並且在執行過程中(大約1分鍾)占用一個內核的100%cpu
那我該怎么做才能改善這個算法呢? 謝謝
關於A993
編輯:
該代碼是遞歸函數,類似於此函數,我用於對目錄中的文件進行計數(此函數也占用100%的cpu)
int MediaScan_Thread::recursiveCount(QDir &dir)
{
int i=dir.entryInfoList(_filters,QDir::Files).count();
foreach(QFileInfo info, dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot))
{
QDir subdir(info.absoluteFilePath());
i += recursiveCount(subdir);
}
return i;
}
我正在Linux上工作,但我會開發一個多平台應用程序。
我將遍歷一個entryList()列表,遞歸目錄並檢查文件上的文件過濾器。 沒有一種簡單的方法可以在多個線程上遞歸搜索文件列表。 但是,一旦獲得文件列表,對其進行並行處理應該很容易。
我將對count和文件列表的調用組合到了I / O上,因為沒有理由重復兩次。 此版本將跟蹤查詢的QStringList
,以便以后可以進行更多處理。
在創建遞歸函數列表時,在遞歸函數上使用foreach可能會出現問題,因此我改用帶迭代器的for循環。
特殊的添加是模仿QDir nameFilters功能,因為entryList()帶有用於目錄和文件(不是我們想要的)的fileFilters參數。
我省略的一個功能是遞歸深度限制,以避免永遠搜索。
此代碼示例已編譯但未經測試
// declare in MediaScan_Thread and set them in constructor or wherever it needs to be:
QVector<QRegExp> _nameRegExps;
QStringList _filters;
QDir::Filters _dirFilters;
// ....
void MediaScan_Thread::initFilterRegExp()
{
_nameRegExps.clear();
for (int i = 0; i < _filters.size(); ++i)
{
_nameRegExps.append( QRegExp(_filters.at(i), (_dirFilters & QDir::CaseSensitive) ? Qt::CaseSensitive : Qt::CaseInsensitive, QRegExp::Wildcard) );
}
}
int MediaScan_Thread::recursiveCountAndMatchedFiles(QDir &dir, QStringList& matchedFiles )
{
int i = 0;
QFileInfoList lst = dir.entryInfoList( QStringList() , QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot );
for ( auto itr = lst.begin(); itr != lst.end(); itr++ )
{
QFileInfo &info = (*itr);
if (info.isDir())
i += recursiveCountAndMatchedFiles( info.absoluteDir(), matchedFiles );
else
{
QString fileName = info.absoluteFilePath();
for (auto iter = _nameRegExps.constBegin(), end = _nameRegExps.constEnd();
iter != end; ++iter)
{
if (iter->exactMatch(fileName)) {
i++;
matchedFiles << fileName;
break;
}
}
}
}
return i;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.