0

私のProducer別のスレッドで実行されているQDesktopWidget)は、いくつかのQWidgetにアクセスする必要があり、 QPixmap. だから私はこのようにポーリングを設計します。

Producer、Consumer、Transmitter はboost::thread. これが私が計画した方法です。

私は、GUIスレッドに存在するdevice::Serviceクラスを持っています。QObjectこれは、すべてのサービス クラスのベースです。device::PixmapService受け継ぐものがあるdevice::Service

Threadによって呼び出される、次のシグネチャを持つメソッドがありProducerます。ProxyTray<QImage, device::PixmapService> device::PixmapService::requestPixmap()

requestPixmap()トレイProxyTray<QImage, device::PixmapService> blankTray
を作成して a を発行し、すぐthis->pixmapRequestedSignal(tray)に同じものを返しますtray

device::PixmapService::pixmapRequestedSlotQt の Signal-Slot Mechanism でリクエストを取得します。によってトレイを解決しますtray.resolve(image)

その間、Producer はやって待っています。

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

デザインは大丈夫ですか?それはうまくいきますか?Wheel を再発明していますか?

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