Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多次调用update时,Qt应用程序崩溃_C++_Qt_Qpainter_Paintevent - Fatal编程技术网

C++ 多次调用update时,Qt应用程序崩溃

C++ 多次调用update时,Qt应用程序崩溃,c++,qt,qpainter,paintevent,C++,Qt,Qpainter,Paintevent,我有一个应用程序,可以使用QPainter绘制分形。 paintEvent功能如下: void SimulationWindow::paintEvent(QPaintEvent*) { QPainter painter(this); QPen my_pen; initPainter(painter,my_pen); initCoordsystem(painter); if(m_mode == TRACE) { drawTraject

我有一个应用程序,可以使用
QPainter
绘制分形。
paintEvent
功能如下:

void SimulationWindow::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    QPen my_pen;
    initPainter(painter,my_pen);
    initCoordsystem(painter);
    if(m_mode == TRACE)
    {
        drawTrajectory(painter,my_pen);
    }
    else if(m_mode == FRACTAL)
    {
        drawFractal(painter, my_pen);
    }

    /*if(!m_isFinished)
    {
        update();
    }*/
}
在这个版本中,最后一个
if
被注释掉,它似乎可以正常工作。 否则,它将在运行期间开始连续绘制分形(直到
m_isFinished
为true),但在启动后一秒钟,它崩溃。
drawFractal
函数仅根据另一个线程中运行的名为computeFractal的函数连续计算的结果绘制分形。
m_isFinished
布尔变量在此函数开头设置为false,最后设置为true

我真的很困惑,谁能告诉我车祸的原因是什么?可能是因为计算分形在不同的线程上运行? (
QtConcurrent::run(this->m_simulationwindow,&simulationwindow::computeFractal);

编辑:

void SimulationWindow::drawFractal(QPainter&painter,QPen&my_pen)
{
对于(int i=0;i
在这种情况下根本不调用
drawTraction

编辑:
update()
实际上调度是一个
paintEvent()
,这意味着它不会导致无限递归。只有
repaint()
会导致这种情况

建议

您可以设置一个
QTimer
,每秒调用一次更新,然后以这种方式控制渲染执行/帧率

QTimer *timer = new QTimer(this);

connect(timer, SIGNAL(timeout(), this, SLOT(myUpdate()));
timer->start(1000f/60f);  //every 1/60 of a second it times out

void MyWindow::myUpdate()
{ 
    //do your logic here
    update();
}
然后在
paintEvent()
上,应该只保留实际渲染


编辑:Qt还有其他控制时间的解决方案,可以帮助您渲染,例如,

它到底在哪里崩溃?您是否尝试在调试器中运行该程序?另外,你可以发布你的两个函数DrawTraction和drawFractal的代码吗?@this.lau.\ux:我补充了你的要求。目前我不知道它在哪里崩溃。你确定m_位置和m_颜色的大小完全相同吗?可能在调试时在drawFractal函数的顶部添加一些健全性检查。谁说它在drawFractal中崩溃了?也有画家和画家initCoordsystem@this.lau_我想你找到了迷恋的原因。m_位置的大小可以小于m_颜色的大小,因为这些大小总是在更新,因为在另一个线程上计算仍在继续,有时循环变量大于m_位置的大小。(m_颜色和位置为std::vector-s)感谢您了解这一点!你帮我节省了很多时间。我试过你的方法,可惜没用。我用start(1000.0f)启动计时器,所以更新每秒钟调用一次,但是update()只调用了3次,结果崩溃了。可能是其他原因造成了问题。您是否尝试过在调试模式下运行,它是否显示了崩溃的位置?每次调用update()时,也会调用paintEvent()。Qt文档中的错误:警告:如果在函数中调用repaint(),而函数本身可能从paintEvent()调用,则可能会得到无限递归。update()函数从不导致递归。@KuramaYoko我发现了以下几点:计时器超时的次数越多,应用程序崩溃的可能性就越小。@Greenflow,你是对的。好像我没有完全记住这个概念。我将更新我的答案,删除此确认。
QTimer *timer = new QTimer(this);

connect(timer, SIGNAL(timeout(), this, SLOT(myUpdate()));
timer->start(1000f/60f);  //every 1/60 of a second it times out

void MyWindow::myUpdate()
{ 
    //do your logic here
    update();
}