2016-11-25 5 views
0

このような奇妙な問題が見つかりました。コンストラクタまたはスタティックで作成されたときに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!"; 
} 

しかし、これはなぜですか?私はタイマーがコンストラクタで作成されていないと思うが、コンストラクタでオブジェクトを作成することは正しく問題ではないはずですか?なぜ静的バージョンがクラッシュするのか、これは同じ問題でしょうか?

+1

どこで 'connect'呼び出しがあり、' Flasher'オブジェクトインスタンスの構築に対していつ呼び出されますか? – alexisdm

+0

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); } ' –

+0

あなたは' process_timer'が作成から 'connect()'の呼び出しの間のどこかでヌルに設定されていないことを100%確信していますか?あなたはデバッガの 'connect()'呼び出しをやめて調査しましたか? – Googie

答えて

0

これはqtimerとは関係なく、メモリの問題と思われます。私はウィンドウでプロセスのハンドルを取得する方法をたくさん探していて、主にUNIXに関するソースを見つけました。次にthesetwoの間に私はちょっと混乱してしまい、process_pidのDWORDを使ってしまいました。これはメモリのタイマーの直前に置かれたようです。したがって、openprocessを呼び出すと破損が発生し、クラッシュに至りました。アプリケーションを起動した後にタイマーを作成すると、タイマーをもう一度元に戻して「固定」します。

もう1つの教訓があり、qProcessからOpenProcessまでのpidにqint64を使用するとうまくいきます。似たようなことをするときに他の人がこれを見つけることができたら、問題を切り分けるためにmcveを作成してくれてありがとう。

+0

どのようにしてメモリリークの原因が分かりましたか? mcveとは何ですか? – ransh

関連する問題