Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Susenin от Декабрь 16, 2013, 00:56



Название: QException, проброс исключения из рабочего треда в главный.
Отправлено: Susenin от Декабрь 16, 2013, 00:56
Доброй ночи!

Пишу многопоточную программу с исключениями. Рабочие потоки бросают исключения. Судя по документации, класс QException обеспечивает передачу исключений между потоками.
У меня не получается этого достичь - в основном потоке исключения не ловятся.
Код
C++ (Qt)
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   try
   {
       MainWindow w;
       w.show();
       Worker worker;
       QObject::connect(&worker, &Worker::showInt, &w, &MainWindow::showInt, Qt::QueuedConnection);
 
       QThread thread;
       worker.moveToThread(&thread);
       thread.start();
 
       return a.exec();
   }
   catch (Exception & e)
   {
       QMessageBox::warning(0, "", "");
   }
}
 

Объект worker раз в секунду посылает сигнал, по которому в главном окне увеличивается счетчик. Через 5 секунд worker бросает исключение. Exception - наследник QException.
Код
C++ (Qt)
Worker::Worker(QObject *parent)
   : QObject(parent)
{
   m_timer.setSingleShot(false);
   m_timer.setInterval(1000);
   connect(&m_timer, &QTimer::timeout, this, &Worker::update);
   m_timer.start();
   m_counter = 0;
}
 
void Worker::update()
{
   if (m_counter > 4)
   {
       throw Exception("some message");
   }
   m_counter++;
   emit showInt(m_counter);
}
 

Возникает окно "R6010 - abort() has been called".

Что я делаю не так? Как правильно пользоваться QException для передачи между потоками?
Смотрел в qexception.cpp, ничего не понял. Как оно работает?

Прикладываю минимальный проект.


Название: Re: QException, проброс исключения из рабочего треда в главный.
Отправлено: Johnik от Декабрь 16, 2013, 07:03
Вероятно, чтоб словить исключение в основном потоке, надо запустить задачу и заблокировать его [основной поток].
Пример есть в документации к классу QException.