我的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。