在构造函数或静态中创建时,qtimer崩溃

时间:2016-11-25 13:04:04

标签: c++ qt constructor crash

所以,我终于找到了这个奇怪的问题,我找不到答案。

我正在创建一个小gui,在一个单独的窗口中启动一个应用程序,然后使用qtimer轮询该应用程序的状态。

    process_timer = new QTimer(this);
    connect(process_timer, SIGNAL(timeout()), this, SLOT(checkFlashProcess()));
    process_timer->start(100);

所以这很有效。但我不想每次都创建一个新的计时器,所以我将process_timer的创建放在了gui的构造函数中:

Flasher::Flasher(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Flasher)
{
    ui->setupUi(this);
    process_timer = new QTimer(this);
}

现在这会导致崩溃和输出: QObject :: connect:无法连接(null):: timeout()到Flasher :: 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 个答案:

答案 0 :(得分:0)

好的,所以看起来这与qtimer无关,而是与内存问题有关。我正在四处寻找如何在Windows中获取进程句柄,并且主要找到有关unix的源代码。然后在these two之间,我显然混淆了东西并最终使用了一个用于process_pid的DWORD,它似乎已经放在内存中的计时器之前。因此,调用openprocess会导致损坏并导致崩溃。启动应用程序后创建计时器&#34;修复&#34;通过再次恢复计时器。

另一个经验教训,使用qint64从qProcess到OpenProcess的pid工作正常。希望其他人在寻找类似的东西时可以找到这个,并且可以避免麻烦,谢谢你踢我创建一个mcve来隔离问题。