2

我有一个应用程序,只要有新的 rss 源可用,它就会在所有窗口的前面弹出一个通知对话框。用户可以运行应用程序的多个实例,我只希望弹出一个通知对话框。关于如何实现这一目标的任何想法?谢谢。

4

1 回答 1

4

您可以简单地在某处放置一个锁定文件以指示另一个进程正在显示一个对话框,并在显示另一个之前检查存在的wheater。

一种更复杂的方法是用于QSharedMemory同步您的访问。在类似的情况下,我使用上下文管理器做了类似的事情,但对于这种情况,它可能看起来像:

from PyQt4.QtGui import QApplication, QMessageBox
from PyQt4.QtCore import QSharedMemory


class MemoryCondition:
    def __init__(self, key='memory_condition_key'):
        self._shm = QSharedMemory(key)
        if not self._shm.attach():
            if not self._shm.create(1):
                raise RuntimeError('error creating shared memory: %s' %
                                   self._shm.errorString())
        self.condition = False

    def __enter__(self):
        self._shm.lock()
        if self._shm.data()[0] == b'\x00':
            self.condition = True
            self._shm.data()[0] = b'\x01'
        self._shm.unlock()
        return self.condition

    def __exit__(self, exc_type, exc_value, traceback):
        if self.condition:
            self._shm.lock()
            self._shm.data()[0] = b'\x00'
            self._shm.unlock()


# usage example:
app = QApplication([])

with MemoryCondition() as condition:
    if condition:
        mb = QMessageBox()
        mb.setText("you'll only see one of me")
        mb.exec_()
    else:
        print("other process is doing it's stuff")
于 2013-05-02T10:28:40.570 回答