Crash-on-exit after call to app.processEvents()

Raymond Osborn rayosborn at mac.com
Mon May 25 22:35:02 BST 2020


Hi Armando,
Good to hear from you. I thought for a while that I had managed to fix it with the following code :

    def main(filename=None):
        app = NXConsoleApp()
        app.initialize(filename=filename)
        app.start()
        for w in QApplication.topLevelWindows():
            del w
        del app.window, app.app
        sys.exit(0)

It proved to be a false dawn - the problem started to recur again. I’ll see if your version catches things that mine missed, and let you know.

I have spent a lot of time trying to cover up PyQt5 bugs in the past year. The problem is that I can’t guarantee that my users will have the latest version of PyQt, so even if it is fixed in v5.14, I still have to patch the code. I just have no idea why simply calling processEvents() triggers the bug. If I knew that, perhaps it would give some clue how to work around it.

Ray


> On May 25, 2020, at 3:38 PM, V. Armando Sole <sole at esrf.fr> wrote:
> 
> Hi Ray,
> 
> I do not know if it will help your case. I was getting rid of some crashes on exit by deleting all widgets that had no parent. For instance, when closing the QMainWindow by doing:
> 
>     def closeEvent(self, event):
>         if __name__ == "__main__":
>             app = qt.QApplication.instance()
>             allWidgets = app.allWidgets()
>             for widget in allWidgets:
>                 try:
>                     # we cannot afford to crash here
>                     if id(widget) != id(self):
>                         if widget.parent() is None:
>                             widget.close()
>                 except:
>                     _logger.debug("Error closing widget")
>         return qt.QMainWindow.closeEvent(self, event)
> 
> Best regards,
> 
> Armando
> 
> On 25.05.2020 19:48, Raymond Osborn wrote:
> 
>> I added a call to QtWidgets.QApplication.instance().processEvents() in order to force adjustResize() to work when switching tabs (that's another story). It succeeded in fixing my resize issue, but now it triggers a segfault when I exit the application. This seemed to be related to the bug described in https://www.riverbankcomputing.com/static/Docs/PyQt5/gotchas.html#crashes-on-exit <https://www.riverbankcomputing.com/static/Docs/PyQt5/gotchas.html#crashes-on-exit>. One fix, suggested by @ekhumoro on stackoverflow (https://stackoverflow.com/questions/59120337/why-does-pyqt-sometimes-crash-on-exit <https://stackoverflow.com/questions/59120337/why-does-pyqt-sometimes-crash-on-exit>) was to delete the main window and the app first, but that doesn't seem to fix it. I am running PyQt 5.12 because that is the last version supported by conda, so I can't test the one-exit fix in v5.13, and my users probably wouldn't have it installed anyway. It happens on Macs and linux.
>>  
>> What I am asking is if there are additional things to try in addition to @ekhumoro's suggestion? Basically he suggests doing something like:
>>  
>> def main():
>>     app = QApplication(sys.argv)
>>     main_window = MainWindow()
>>     main_window.show()
>>     app.exec_()
>>     # ensure correct deletion order
>>     del main_window, app
>> Does anyone understand why the crash only occurs if I have calls to processEvents() in the code? It never happens when I remove them.
>>  
>> Thanks,
>> Ray
>>  
>>  

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20200525/f8905ad8/attachment.htm>


More information about the PyQt mailing list