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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Неинтуитивный QThread  (Прочитано 10344 раз)
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #15 : Сентябрь 04, 2011, 18:55 »

2LisandreL:
У вас программа не завершается. Вы напишите дебаг после thread.wait().
ORLY?

Код:
class Thread : public QThread
{
public:
    void run()
    {
        sleep( 10 );
        qDebug( "exec" );
        exec();
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Thread thread;
    thread.start();
    qDebug( "start" );
    thread.exit();
    qDebug( "exit" );
    thread.wait();
    qDebug( "wait" );
    return 0;
}

Цитировать
Запускается C:\Test\untitled-build-desktop\release\untitled.exe...
start
exit
exec
wait
C:\Test\untitled-build-desktop\release\untitled.exe завершился с кодом 0

Может описанная вами проблема платформозависимая?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Сентябрь 05, 2011, 15:22 »

Ладно, прильнем к первоисточнику

Исходники 4.5.2 (которыми я до недавнего времени пользовался)
Код
C++ (Qt)
int QThread::exec()
{
   Q_D(QThread);
   d->mutex.lock();
   d->data->quitNow = false;
   QEventLoop eventLoop;
   d->mutex.unlock();
   int returnCode = eventLoop.exec();
   return returnCode;
}
 
Да, возможен deadlock как говорит Akon. Однако в asm (статик сделать все руки не доходят) видно что код другой. Обновляю исходники до 4.7.4

Код
C++ (Qt)
int QThread::exec()
{
   Q_D(QThread);
   QMutexLocker locker(&d->mutex);
   d->data->quitNow = false;
   if (d->exited) {
       d->exited = false;
       return d->returnCode;
   }
   locker.unlock();
 
   QEventLoop eventLoop;
   int returnCode = eventLoop.exec();
 
   locker.relock();
   d->exited = false;
   d->returnCode = -1;
   return returnCode;
}
 
Теперь соответствует

Итого: было исправлено
Записан
Akon
Гость
« Ответ #17 : Сентябрь 05, 2011, 15:51 »

Пример я гнал на 4.6.1. Там код как в 4.5.2.
Кто знает, с какой версии пошло изменение?
« Последнее редактирование: Сентябрь 06, 2011, 10:25 от Akon » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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