Здравствуйте уважаемые коллеги.
Я сейчас активно пользуюсь поиском по форуму и пока возникло несколько вопросов надеюсь поможете решить несколько вопросов по работе с потоком и таймером.
То, что я хочу реализовать.
Есть контейнер, который содержит имена файлов. Файлы последовательно обрабатываются по имени из контейнера. Нужно передавать в GUI информацию о обработке.
Сейчас обработка конкретного файла сделана просто
While(1)
{
…Обработка
emitUpdateProgress();
}
Проблема в том что очень часто обработка занимает очень мало времени меньше секунды, и поэтому обновление информации происходит слишком часто. И я думаю правильным в этой ситуации ввести таймер по котором будет выполняться обновление GUI из потока.
Как я пытался с ним работать:
Через mоveToThread(наверное не правильно)
Мой код
В конструкторе класса наследника от QThread
m_timerReloadProgress = new QTimer(this);
m_timerReloadProgress->setInterval(100);
connect(m_timerReloadProgress, SIGNAL(timeout()),
this, SLOT(slotProgress()));
this->moveToThread(this);
слот
void FilesOpThread::slotProgress()
{
QMutexLocker lock(&m_mutex);
m_progressUpdate = 1;
}
Этот слот ни разу не срабатывает.
В FilesOpThread::run()
Есть.
m_timerReloadProgress->start();
Вопрос кстати нужен ли тут локер если переменная только для этого экземпляра класса?
Походил по форуму нашел несколько похожих тем.
Зачем в этом коде указывать DirectConnection?
Источник
http://www.prog.org.ru/index.php?topic=16871.msg112803#msg112803void CThr::run(void)
{
// Объявляем Таймер
QTimer timer;
connect( &timer, SIGNAL(timeout()), SLOT(s_OnTimer()), Qt::DirectConnection ); // укажим принудительно прямое подключение
timer.start(1000);
QEventLoop loop;
//--------- чтение пакетов и заполнение списка
while (!flStop)
{
..Здесь получаем некоторые данные и копируем в список, например QVector
loop.processEvents(); // прокрутили очередь сообщений + таймеры
}
}
Думаю насколько эффективнее станет если я заменю свою функцию emitUpdateProgress на loop.processEvents? Или есть более эффективные способы решить эту проблему.
Жду предложений