Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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++ QWidget paintEvent无理由停止调用_C++_Multithreading_Qt - Fatal编程技术网

C++ QWidget paintEvent无理由停止调用

C++ QWidget paintEvent无理由停止调用,c++,multithreading,qt,C++,Multithreading,Qt,在我的一个Qt应用程序中更新QWidget时,我发现了一个非常奇怪的情况。当在没有任何警告或命令的情况下调用widget->update()方法时,会突然停止调用widget的paintEvent(QEvent*) 我的应用程序在嵌入式Linux中使用Qt 4.8.5 for ARM,有两个(相关)线程:一个线程从套接字连接获取数据,用它填充缓冲区,并调用远程对象中的一个插槽,要求它更新plot小部件(使用update()函数)。另一个线程是负责小部件绘制(Qt中的一个规则)的主线程,它执行vo

在我的一个Qt应用程序中更新QWidget时,我发现了一个非常奇怪的情况。当在没有任何警告或命令的情况下调用widget->update()方法时,会突然停止调用widget的paintEvent(QEvent*)

我的应用程序在嵌入式Linux中使用Qt 4.8.5 for ARM,有两个(相关)线程:一个线程从套接字连接获取数据,用它填充缓冲区,并调用远程对象中的一个插槽,要求它更新plot小部件(使用update()函数)。另一个线程是负责小部件绘制(Qt中的一个规则)的主线程,它执行
void paintEvent(QEvent*)
函数。因此,事件的顺序是:

  • 读取线程获取并识别数据包
  • 读取线程将数据放入缓冲区(QAbstractTableModel派生类)
  • 在同一个函数中,读取线程通过Qt::DirectConnection向一个UI基本小部件发出信号,该小部件的子部件是plotting小部件。接收器插槽称为
    slotPQDataChanged
  • slotPQDataChanged
    调用子小部件的
    update
    函数:
    poSubWidget->update()
  • 在主线程中,在Qt“希望”的时刻,调用poSubWidget的
    paintEvent(QEvent*)
    函数。它内部有一个QPainter,可以在上面绘制接收到的数据 这个过程大约每秒发生5次。当我启动系统时,一切正常运行了一段时间(正常情况下为5-10分钟),但随后poSubWidget的更新突然停止。我确信不是阅读线程停止了,因为,由于调用了
    qDebug()
    ,我知道“slotPQDataChanged”会继续被调用。我也知道不是主线程被杀死或者类似的事情,因为当问题发生时,屏幕上的计时器仍然工作正常。我知道在调用
    update()
    时,在我的代码中没有必要要求子小部件不要更新

    当然,我不知道到底发生了什么;对SO的(快速)研究没有得出积极的结果

    值得一提的是,我的应用程序可能有一个错误,它会导致它有时因为“内存不足”而被杀死

    那么,对可能发生的事情有什么建议吗?

    1)首先解决内存不足问题。这很容易成为问题的根源


    2) 除非您确切地知道自己在做什么,否则使用线程连接到GUI不是一个好主意。(这也可能是问题的根源)线程和gui应使用连接。在我的视频播放程序中,线程和gui存在相同的问题-
    paintEvent()
    在~5分钟后停止调用。通过将
    update()
    调用从一个单独的线程移动到一个小部件的插槽中(通过信号调用),解决了这个问题。因此,请确保从QT的事件线程中调用
    update