Skip to main content
 首页 » 编程设计

c++之在构造函数或静态中创建时qtimer崩溃

2025年05月04日54飞鱼

因此,我终于找到了这个奇怪的问题,但我没有找到答案。

我正在创建一个小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!"; 
 } 

但是为什么呢?我想计时器不会在构造函数中创建,但是在构造函数中创建对象应该不是问题吧?为何静态版本也会崩溃,这是同一问题吗?

请您参考如下方法:

好的,看来这与qtimer无关,而与内存问题有关。我到处都在寻找如何在Windows中获取进程句柄的方法,并且大部分是有关Unix的资源。然后在thesetwo之间,我很好地弄混了一切,最后使用了DWORD作为process_pid,似乎已将其放置在内存中的计时器之前。因此,调用openprocess会导致损坏并导致崩溃。启动应用程序后创建计时器,通过再次还原计时器来“解决”此问题。

吸取了另一个教训,并且使用qint64作为从qProcess到OpenProcess的pid可以正常工作。希望其他人在尝试执行类似操作时可以找到此方法,并且可以避免麻烦,感谢您踢我创建一个mcve来隔离问题。