gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:13:05 29 4
gpt4 key购买 nike

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

我正在创建一个小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来隔离问题。

关于c++ - 在构造函数或静态中创建时qtimer崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40805746/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com