WMF & amp; Qt Не может получить сигнал в слоте от OnProcessSample

Теперь я использую 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 & Слот, как показано ниже.

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 в функцию Slot.
Если кто-нибудь знает эту проблему, не могли бы вы дать мне несколько советов по ее преодолению?

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]