Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: like-nix от Апрель 06, 2011, 19:03



Название: Поток и таймер
Отправлено: like-nix от Апрель 06, 2011, 19:03
Здравствуйте уважаемые коллеги.

Я сейчас активно пользуюсь поиском по форуму и пока возникло несколько вопросов надеюсь поможете решить несколько вопросов по работе с потоком и таймером.

То, что я хочу реализовать.

Есть контейнер, который содержит имена файлов. Файлы последовательно обрабатываются по имени из контейнера. Нужно передавать в 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#msg112803
Код:
void 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? Или есть более эффективные способы решить эту проблему.

Жду предложений


Название: Re: Поток и таймер
Отправлено: Igors от Апрель 06, 2011, 19:13
Первое что бросается в глаза - а зачем хлопоты с таймером если можно просто засекать/накапливать время обработки в самом while и обновлять индикатор только когда прошло достаточно времени?


Название: Re: Поток и таймер
Отправлено: like-nix от Апрель 06, 2011, 19:21
Т.е. через стандартный time? Да можно попробовать.


Название: Re: Поток и таймер
Отправлено: mutineer от Апрель 07, 2011, 12:49
Код:
this->moveToThread(this);

Вот это точно не стоит делать