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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QException, проброс исключения из рабочего треда в главный.  (Прочитано 5206 раз)
Susenin
Новичок

Offline Offline

Сообщений: 35


Просмотр профиля
« : Декабрь 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, ничего не понял. Как оно работает?

Прикладываю минимальный проект.
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #1 : Декабрь 16, 2013, 07:03 »

Вероятно, чтоб словить исключение в основном потоке, надо запустить задачу и заблокировать его [основной поток].
Пример есть в документации к классу QException.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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