hydra_13
@hydra_13
Пограммист - любитель)

Как перехватывать исключения в QThread?

Требуется перехватывать системные исключения вне основного потока. В основном потоке все очень просто:
Переопределяем QApplication::notify() и радуемся:
bool notify(QObject *obj, QEvent *ev)
{
    bool result = false;
    try{
        result = QApplication::notify(obj, ev);
    } catch(...){
        qDebug() << "exception";
        result = false;
    }
    return result;
}


В качестве теста использовал следующий код (событие нажатия на QPushButton):
void MainWindow::on_pb1_clicked()
{
    QObject* obj = (QObject*) 0x00112233;
    delete obj;
}

Все отлично отрабатывает при указании опции компиляции -EHa. Но есть одна проблема. При использовании QThread данная конструкция не работает. Пример:
Переопределили функцию on_pb1_clicked():
void MainWindow::on_pb1_clicked()
{
QPluginLoader pluginLoader("d:/Sources/qt/_BUILDS/Plugin/Desktop_Qt_5_5_1_MSVC2013_64bit/release/FirstPlugin.dll");
    QObject *pluginObj = pluginLoader.instance();
    if (pluginObj){
        CensorPluginRootInstance* root = qobject_cast<CensorPluginRootInstance *>(pluginObj);
        if (root) {
            PluginInterface* plugin = root->createPluginObject();
            if (plugin){
                ui->teStat->append("plugin load ok!");
                QThread* thread = new QThread;
                connect(thread, &QThread::started, plugin, &PluginInterface::Work);
                plugin->moveToThread(thread);
                thread->start();
            } else
                ui->teStat->append("plugin not loaded 3!");
        }else
            ui->teStat->append("plugin not loaded 2!");
    }else
        ui->teStat->append("plugin not loaded 1!");
}

Код плагина:
bool Plugin::Work()
{
    char* pc = (char*)0x00112233;
    delete pc;
    return false;
}

Плагин подгружается, о чем свидетельствует надпись "plugin load ok!", а затем:
f76d61c04cdc4a3ebbcd2d46e9415b0e.png
Как программно перехватить исключения, вызванные не из основного потока?
  • Вопрос задан
  • 402 просмотра
Решения вопроса 1
Свою функцию передайте, внутри неё уже плагин вызывайте с перехватом,

Movetothread, что это?

Еще есть отладчик, символы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы