Russian Qt Forum
Апрель 20, 2024, 05:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qthread and QTimer  (Прочитано 1907 раз)
rik_mik_2raza
Новичок

Offline Offline

Сообщений: 6


Просмотр профиля
« : Июль 30, 2022, 17:09 »

Здравствуйте.
Пишу поиск файлов.
Соответственно сам поиск происходит в потоке, общая задумка такая, чтобы не мигало 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() << "--------------- ";   
}

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.065 секунд. Запросов: 22.