我正在构建一个可以在Linux上使用Python 3和PyQt5“最小化到托盘”的应用程序。隐藏后,trayIcon.showMessage()
显示的消息被解除,尝试显示第二条消息会导致分段错误。
该应用程序会监视文件的更改,并通知用户该匹配项的出现位于特定的正则表达式中。当它被隐藏时,通过带有托盘图标的消息向用户显示这些事件。
起初我认为这是由于控制台中的QObject::startTimer: Timers can only be used with threads started with QThread
等消息导致窗口被隐藏时出现的一些线程问题的结果(我不知道为什么会发生这种情况,我没有创建任何线程),所以我决定只在窗口可见的情况下更新窗口,但这不起作用。
我能够将其缩小到触发消息的行:
if self.trayIcon.isVisible():
print("about to show message")
print(self.fileContentsList[-1])
self.trayIcon.showMessage(
"New match!",
self.fileContentsList[-1])
但我不确定为什么会发生分段错误。我试过谷歌搜索,但似乎我的情况有点独特。可能是什么问题?
编辑:我忘记添加的内容:使用strace(strace python3 logwatch.py
)运行应用程序会以某种方式停止发生分段错误。
EDIT2:代码可在GitHub https://github.com/tehlordvortex/logwatch/上找到
EDIT3: PyCharm控制台中显示的具体行是:Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
EDIT4:似乎将它附加到任何形式的调试器可以防止崩溃。我试过PyCharm的调试器和valgrind。
答案 0 :(得分:0)
我修好了。正如我最初想的那样,这是一个线程问题。
来自监视程序模块的Observer在另一个线程上运行,这是额外线程的来源。我重写了我的Watch类,通过applyBatch()
通知我的Window,而不是直接调用回调。这使得回调在主线程上运行。
此修复程序在this commit中列出。如果有更好的方式或其他方式,我非常想知道。