マルチスレッド プラグイン ベースのアプリケーションを作成しています。私はプラグインの作者ではありません。そのため、プラグインのセグメンテーション違反が原因でメイン アプリケーションがクラッシュすることを回避したいと考えています。出来ますか?または、プラグインのクラッシュによって、メインのアプリケーションのステータスも確実に損なわれますか? 私の「実際の」アプリケーションはqtライブラリに強く基づいているため、qtを使用してスケッチプログラムを作成しました。ご覧のとおり、割り当てられていない QString でトリミングされた関数を呼び出してスレッドを強制的にクラッシュさせました。シグナル ハンドラは正しく呼び出されますが、スレッドが強制終了された後、メイン アプリケーションもクラッシュします。私は何か間違ったことをしましたか?または、前に言ったように、私がやろうとしていることは達成できませんか? この簡略化されたバージョンのプログラムでは、プラグインの使用を避け、スレッドのみを使用していることに注意してください。プラグインを導入すると、新しいクリティカル レベルが追加されます。私は考えます。一歩一歩進んでいきたい。そして、全体として、私の目標が実現可能かどうかを理解したいと思っています。誰もが私に与えようとするどんな種類の助けや提案にも感謝します.
#include <QString>
#include <QThread>
#include<csignal>
#include <QtGlobal>
#include <QtCore/QCoreApplication>
class MyThread : public QThread
{
public:
static void sigHand(int sig)
{
qDebug("Thread crashed");
QThread* th = QThread::currentThread();
th->exit(1);
}
MyThread(QObject * parent = 0)
:QThread(parent)
{
signal(SIGSEGV,sigHand);
}
~MyThread()
{
signal(SIGSEGV,SIG_DFL);
qDebug("Deleted thread, restored default signal handler");
}
void run()
{
QString* s;
s->trimmed();
qDebug("Should not reach this point");
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyThread th(&a);
th.run();
while (th.isRunning());
qDebug("Thread died but main application still on");
return a.exec();
}