Здравствуйте.
Пишу поиск файлов.
Соответственно сам поиск происходит в потоке, общая задумка такая, чтобы не мигало ui->listView (model = m_ptr_model_file_result_find ) при добавление 1 item-a накапливаем промежуточный mResultFiles и потом по таймеру вызываем слот slot_result_info_search, где добавляем в модель m_ptr_model_file_result_find наши данные.
Но так как m_ptr_search_files и ptr_timer находятся в одном потоке, то пока работает m_ptr_search_files , слот timeout() от ptr_timer не сработает (m_ptr_search_files - забьет все время работы потока). Как написать правильно ?
m_ptr_search_files = new SearchFiles(ui->combo_dir_find->currentText(), get_param_search());
QThread *ptr_thread = new QThread(this);
QTimer *ptr_timer;
ptr_timer = new QTimer(0);
ptr_timer->setInterval(100);
ptr_timer->moveToThread(ptr_thread);
m_ptr_search_files->moveToThread(ptr_thread);
m_ptr_search_files->connect(ptr_timer, SIGNAL(timeout()), SLOT(slot_timer_result()), Qt::DirectConnection);
ptr_timer->connect(ptr_thread, SIGNAL(started()), SLOT(start()));
connect(ptr_thread, SIGNAL(started()), m_ptr_search_files, SLOT(slot_search()));
connect(m_ptr_search_files, SIGNAL(sig_result_info(const QStringList &)), this, SLOT(slot_result_info_search(const QStringList &)));
///добавляем найденный путь в промежуточный буффер mResultFiles
void SearchFiles::add_result(const QString &path)
{
mMutex.lock();
mResultFiles << path;
mMutex.unlock();
}
void SearchFiles::slot_timer_result()
{
qDebug() << "SearchFiles slot_timer_result" << mResultFiles.count();
if(mResultFiles.isEmpty())
return;
mMutex.lock();
emit sig_result_info(mResultFiles);
mResultFiles.clear();
mMutex.unlock();
}
void SearchFiles::slot_search(const QString &dir)
{
if(m_is_stop)
return;
QDirIterator iterator (dir, QDir::AllEntries | QDir::NoDotAndDotDot | QDir::NoSymLinks | QDir::System/* QDirIterator::Subdirectories*/);
while(iterator.hasNext())
{
iterator.next();
if(m_is_pause)
mSema.acquire();
if(m_is_stop)
return;
QFileInfo fi = iterator.fileInfo();
if(filter_files(fi))
{
add_result(fi.filePath());
}
if(fi.isDir() && mParamSearch.at(1).toBool()) //рекурсивный поиск
{
slot_search(fi.filePath());
}
}
}
///слот старта потока
void SearchFiles::slot_search()
{
mResultFiles.clear();
QDir d(mDir);
if(d.exists(mDir))
{
slot_search(mDir);
}
slot_timer_result();//сбросим что осталось
emit finished();
}
//получение результатов от поиска
void MainWindow::slot_result_info_search(const QStringList &list)
{
//добавляем новый item
QList<QStandardItem *> items_list;
QStandardItem *root = m_ptr_model_file_result_find->invisibleRootItem();
foreach(QString path, list)
{
items_list.append(new QStandardItem(m_ptr_model_file->findIcon(path), path));
}
root->appendRows(items_list);
qDebug() << "m_ptr_model_file_result_find->rowCount() = " << m_ptr_model_file_result_find->rowCount();
ui->label_count_files->setText(QString::number(m_ptr_model_file_result_find->rowCount()));
qDebug() << "--------------- ";
}