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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Поток и таймер  (Прочитано 3957 раз)
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? Или есть более эффективные способы решить эту проблему.

Жду предложений
« Последнее редактирование: Апрель 06, 2011, 19:07 от like-nix » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Апрель 06, 2011, 19:13 »

Первое что бросается в глаза - а зачем хлопоты с таймером если можно просто засекать/накапливать время обработки в самом while и обновлять индикатор только когда прошло достаточно времени?
Записан
like-nix
Гость
« Ответ #2 : Апрель 06, 2011, 19:21 »

Т.е. через стандартный time? Да можно попробовать.
« Последнее редактирование: Апрель 06, 2011, 19:48 от like-nix » Записан
mutineer
Гость
« Ответ #3 : Апрель 07, 2011, 12:49 »

Код:
this->moveToThread(this);

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


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