このような奇妙な問題が見つかりました。コンストラクタまたはスタティックで作成されたときにqtimerがクラッシュする
私は別のウィンドウでアプリケーションを起動し、qtimerを使ってこのアプリケーションの状態をポーリングする小さなGUIを作成しています。
process_timer = new QTimer(this);
connect(process_timer, SIGNAL(timeout()), this, SLOT(checkFlashProcess()));
process_timer->start(100);
これは機能します。しかし、私はむしろ、毎回新しいタイマーを作成しませんので、私は、GUIのコンストラクタでprocess_timerの作成を置い:
Flasher::Flasher(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Flasher)
{
ui->setupUi(this);
process_timer = new QTimer(this);
}
今これはクラッシュにつながると出力: のQObject ::接続:することができませんフラッシャーする:: checkFlashProcessを()このため
同じ(ヌル)::タイムアウト()接続:
Flasher::Flasher(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Flasher),
process_timer(new QTimer)
{...
QTimer * process_timerは、アプリケーションヘッダに定義されています。
私はまた、非ダイナミックとしてprocess_timerを定義しようとしている:
header.h:
QTimer process_timer;
code.cpp
void Flasher::on_flashButton_clicked()
{
(...)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, process_pid);
if(hProcess)
{
qDebug() << "Got handle for process!";
connect(&process_timer, SIGNAL(timeout()), this, SLOT(checkFlashProcess()));
process_timer.start(30);
}
これもクラッシュにつながります。
コールバック:
void Flasher::checkFlashProcess()
{
qDebug() << "Got handle for process!";
}
しかし、これはなぜですか?私はタイマーがコンストラクタで作成されていないと思うが、コンストラクタでオブジェクトを作成することは正しく問題ではないはずですか?なぜ静的バージョンがクラッシュするのか、これは同じ問題でしょうか?
どこで 'connect'呼び出しがあり、' Flasher'オブジェクトインスタンスの構築に対していつ呼び出されますか? – alexisdm
guiのボタン用のスロットにConnectが呼び出されています。 'void Flasher :: on_flashButton_clicked() { ... hProcess = OpenProcess(PROCESS_QUERY_INFORMATION、FALSE、process_pid); if(hProcess) { qDebug()<< "プロセスのハンドルを取得しました!"; process_timer =新しいQTimer(this); connect(process_timer、SIGNAL(タイムアウト())、this、SLOT(checkFlashProcess())); process_timer-> start(30); } ' –
あなたは' process_timer'が作成から 'connect()'の呼び出しの間のどこかでヌルに設定されていないことを100%確信していますか?あなたはデバッガの 'connect()'呼び出しをやめて調査しましたか? – Googie