0

現在、WMF を使用して Qt に実際のカメラ フレームを表示しています。まず、IMFSampleGrabberSinkCallback から継承した Grabber クラスにある OnProcessSample の画像フレームを WMF で定期的に取得するだけで問題ありません。

WMF.CPP

STDMETHODIMP Grabber::OnProcessSample
(
REFGUID guidMajorMediaType,
DWORD dwSampleFlags,
LONGLONG llSampleTime,
LONGLONG llSampleDuration,
const BYTE * pSampleBuffer,
DWORD dwSampleSize
)

{

  QMutexLocker locker(&m_SampleMutex);

  pMySignal->setValue();

  return S_OK;
}

フレームの取得をUIに通知するために、以下のようなSignal&SlotでQObjectから継承したシンプルなクラスを作成してみました。

MainWindow.h

class MySignal : public QObject
{
     Q_OBJECT

     public:
      MySignal(QObject * parent = 0, char* name = 0)
      {
           setObjectName ( name );
      }

      void setValue() { emit EnvokeSignal(); }

public slots:
      void ReceiveSignal();

signals:
     void EnvokeSignal();
};

class MySignal2 : public QObject
{
     Q_OBJECT

     public:
      MySignal2(QObject * parent = 0, char* name = 0)
      {
           setObjectName ( name );
      }

      void setValue() { emit EnvokeSignal2(); }

      public slots:
      void ReceiveSignal2();

     signals:
     void EnvokeSignal2();
};

MainWindow.cpp

MySignal* pMySignal;

void MySignal::ReceiveSignal()
{
    //qDebug()<<"Objectname = "<< objectName() <<" val = "<< v;
    OutputDebugString(L" === ReceiveSignal === \n");
}

void MySignal2::ReceiveSignal2()
{
    //qDebug()<<"Objectname = "<< objectName() <<" val = "<< v;
    OutputDebugString(L" === ReceiveSignal === \n");
}

void MainWindow::on_pushButton_clicked()
{
    MySignal SignalSlotCleass(0, "a");
    MySignal2 Signal2SlotCleass(0, "b");


    pMySignal = &SignalSlotCleass;

    QObject::connect( &SignalSlotCleass, &MySignal::EnvokeSignal, &Signal2SlotCleass, &MySignal2::ReceiveSignal2 );

    EnumerateCamDevice_StartupMF();
}

MySignal1、MySignal2 のような 2 つのクラスのみを使用すると、Slot メソッドで Signal メッセージを取得できました。しかし、WMF.cpp を OnProcessSample 関数とマージしようとすると、Slot 関数で OnProcessSample から送信されたシグナル メッセージを取得できませんでした。この問題を知っている人がいたら、それを克服するためのヒントを教えてくれませんか?

4

1 に答える 1

0

関数 on_pushButton_clicked() が完了すると、オブジェクト SignalSlotCleass と Signal2SlotCleass が削除されます。スタック上に作成されているためです。たとえば、次のようにできます。

SignalsHandler.h

class SignalsHandler
{
public:
    // if you want you can use any other smart pointer
    // or even simple pointer but don`t forget clear memory
    QSharedPointer<MySignal> pMySignal; 
    QSharedPointer<MySignal2> pMySignal2;
public:
    void SignalsHandler() :
        pMySignal( new MySignal(0, "a") ),
        pMySignal( new MySignal2(0, "b") )
    {
        QObject::connect( pMySignal, &MySignal::EnvokeSignal, pMySignal2, &MySignal2::ReceiveSignal2 );
    }
};

WMF.CPP

STDMETHODIMP Grabber::OnProcessSample
(
REFGUID guidMajorMediaType,
DWORD dwSampleFlags,
LONGLONG llSampleTime,
LONGLONG llSampleDuration,
const BYTE * pSampleBuffer,
DWORD dwSampleSize
)
{

    QMutexLocker locker(&m_SampleMutex);

    // or you can pass hndl like a parameter of function
    SignalsHandler hndl;
    hndl.pMySignal->setValue();

    return S_OK;
}
于 2013-11-28T05:16:21.137 に答える