0

我的Producer在不同的线程上运行)需要访问QDesktopWidget一些 QWidget,它还需要使用QPixmap. 所以我设计了这样的投票。

生产者、消费者、发送者是boost::thread。这就是我的计划。

我有一个device::Service类,它QObject存在于 GUI 线程中。它是所有服务类的基础。有device::PixmapService继承device::Service

有一个带有以下签名的方法,由ProducerThread 调用。ProxyTray<QImage, device::PixmapService> device::PixmapService::requestPixmap()

requestPixmap()创建一个托盘ProxyTray<QImage, device::PixmapService> blankTray
并发出一个this->pixmapRequestedSignal(tray)并立即返回相同的tray结果。

device::PixmapService::pixmapRequestedSlot使用 Qt 的信号槽机制获取请求。并将托盘解析为tray.resolve(image)

同时生产者在等待。

while(!tray.released());
QImage image = tray.data();

设计好吗?它甚至会起作用吗?我在重新发明一些轮子吗?

template <typename T, typename Manipulator>
class ProxyTray: public AbstractProxyTray{
  friend class Manipulator;
  private:
    T    _data;
  public:
    ProxyTray();
  public:
    T& data() const;
    ~ProxyTray();
  private:
    void resolve(T& data);
};

class AbstractProxyTray{
  private:
    bool _busy;
  public:
    AbstractProxyTray();
  public:
    bool released() const;//returns !_busy
    virtual ~AbstractProxyTray() = 0;
};

我还需要为 ProxyTray 写一个副本。并且复制应该没问题,因为托盘将保存基于QSharedDatawhich implements的 Qt 类型copy on write

4

0 回答 0