我的Producer
(在不同的线程上运行)需要访问QDesktopWidget
一些 QWidget,它还需要使用QPixmap
. 所以我设计了这样的投票。
生产者、消费者、发送者是boost::thread
。这就是我的计划。
我有一个device::Service
类,它QObject
存在于 GUI 线程中。它是所有服务类的基础。有device::PixmapService
继承device::Service
有一个带有以下签名的方法,由Producer
Thread 调用。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 写一个副本。并且复制应该没问题,因为托盘将保存基于QSharedData
which implements的 Qt 类型copy on write
。