crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QThread
gpepsi
  опции профиля:
сообщение 5.8.2011, 13:00
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 31.3.2010
Пользователь №: 1582

Спасибо сказали: 0 раз(а)




Репутация:   0  


потоковая функция крутит постоянный цикл опрашивая флаг завершения.
функция ожидания потока (wait) может ждать его бесконечно.

сбросить флаг перед ожидание потока нет возможности, т.к. я не нашел ни одну виртуальную функцию, которая бы вызывалась пепосредственно перед wait.

как это можно реализовать ? или нужно писать обертку ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 5.8.2011, 13:32
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Если я правильно понял, то можно сделать так:


while( !thread->wait(100) ){
тут можно сбрасывать флаг, когда нужно
}

Сообщение отредактировал PAFOS - 5.8.2011, 13:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gpepsi
  опции профиля:
сообщение 5.8.2011, 19:58
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 31.3.2010
Пользователь №: 1582

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(PAFOS @ 5.8.2011, 13:32) *
Если я правильно понял, то можно сделать так:


while( !thread->wait(100) ){
тут можно сбрасывать флаг, когда нужно
}


немного не так. поток крутится
while(flag)
{
}


а сбросить флаг нет возможности. поэтому wait() будет блокирующий до бесконечности
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 7.8.2011, 19:05
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


там же у функции bool QThread::wait( int usec ) можно явно задать кол-во миллисекунд ожидания. Если по истечении времени поток завершился, то bool QThread::wait( int usec ) вернет true, иначе false.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gpepsi
  опции профиля:
сообщение 9.8.2011, 19:59
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 31.3.2010
Пользователь №: 1582

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(PAFOS @ 7.8.2011, 19:05) *
там же у функции bool QThread::wait( int usec ) можно явно задать кол-во миллисекунд ожидания. Если по истечении времени поток завершился, то bool QThread::wait( int usec ) вернет true, иначе false.


это понятно - но в моем случае wait никогда не завершится с true. Это значит, что поток нужно terminate, что не есть хорошо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 10.8.2011, 8:20
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Цитата(gpepsi @ 9.8.2011, 20:59) *
Цитата(PAFOS @ 7.8.2011, 19:05) *
там же у функции bool QThread::wait( int usec ) можно явно задать кол-во миллисекунд ожидания. Если по истечении времени поток завершился, то bool QThread::wait( int usec ) вернет true, иначе false.


это понятно - но в моем случае wait никогда не завершится с true. Это значит, что поток нужно terminate, что не есть хорошо

Используй петлю обработки сообщений в рамках потока и QEvent смотреть тут как это работает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 10.8.2011, 8:27
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Походу чет мы недопонимаем.

Может быть по коду будет понятнее моя мысль:

#include <QtCore>


class Thread : public QThread
{
    QAtomicInt m_terminateFlag; // Позволяет атомарно работать с целочисленной переменной
    int m_counter; // полезный результат выполнения потока

    void run()
    {
        qDebug() << "Thread started";
        
        // ожидаем пока главный поток не поставит флаг завершения
        while( m_terminateFlag == 0 )
        {
            // выполняем полезную нагрузку
            m_counter++;
        }
        
        qDebug() << "Thread ended";
    }

public:
    Thread():QThread(),m_terminateFlag(false),m_counter(0){}

    int counter() const
    {return m_counter;}

    void setTerminateFlag()
    { m_terminateFlag = 1; }

};

int main(int argc, char *argv[])
{
    const int WorkInSeconds = 10;

    QCoreApplication a(argc, argv);

    Thread thread;
    thread.start();

    QTime time;
    time.start();

    // Ожидаем пока поток завершится самостоятельно
    while( !thread.wait(10) )
    {
        // Проверяем условие завершения потока и ставим дочернему потоку флаг завершения  
        if( (time.elapsed()/1000) > WorkInSeconds )
            thread.setTerminateFlag();
        

        QCoreApplication::processEvents();
    }

    qDebug() << thread.counter();

    return 0;
}



Не покатит?)

И кстати, тему бы переместить не помешало бы)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 11:05