WMF & Qt Не удается получить сигнал в слоте от OnProcessSample

0

Теперь я использую WMF, чтобы показать реальную рамку камеры на Qt. Поначалу хорошо получить рамку изображения в OnProcessSample, которая находится в моем классе Grabber, унаследованном от IMFSampleGrabberSinkCallback с 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;
}

Чтобы уведомить о получении кадра в пользовательском интерфейсе, я попытался создать простые классы, унаследованные от QObject, с помощью Signal & Slot, как показано ниже.

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, я могу получить сообщение Signal в методе Slot. Но если я попытался объединить WMF.cpp с функцией OnProcessSample, я не смог получить сообщение сигнала, отправленное из функции OnProcessSample в слот. Если кто-нибудь знает эту проблему, не могли бы вы дать мне несколько советов по ее преодолению?

Теги:
qt
signals-slots
wmf

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;
}
  • 0
    Я очень ценю ваш комментарий. Это на самом деле полезно ~ Спасибо ^ __ ^
  • 0
    Рад это слышать =)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню