QTは、プレイ動画を監視するためにスレッドを作成します

 

1.スレッドクラスを作成(PlayVideoThreadを)

PlayVideoThread.hのヘッダファイル

#pragma

の#include <QObjectを> 
の#include " DataDefine.h " 
の#include " hi_sdk_api.h " 

クラス PlayVideoThread:公共QObjectを
{ 
    Q_OBJECTの

公共
    PlayVideoThread(); 
    PlayVideoThread();
    のsetParam(VIDEO_CHANNEL chを、int型の勝利)。

公共スロット:
     無効doWork(); 

信号:
    無効 sglOnMessage(VIDEO_STATUS_EVENTのイベント、QStringののMSG)。

信号:
    無効sglSendHandle(HI_HANDLE loginHandle、HI_S32プレイ)。

プライベート
    VIDEO_CHANNEL m_Ch。
    int型m_Win; 

    HI_HANDLE m_lLoginHandle; 
    HI_S32 m_lPlay; 
}。

 

PlayVideoThread.cppのソースファイル

#include " PlayVideoThread.h " 


PlayVideoThread :: PlayVideoThread()
{ 
} 

PlayVideoThread ::PlayVideoThread()
{ 
} 

ボイド PlayVideoThreadのsetParam ::(CH VIDEO_CHANNEL、INT 勝利)
{ 
    m_Ch = CH; 
    m_Win = 勝つ; 
} 

ボイドPlayVideoThreadを:: doWork()
{ 
    HI_S32 ERR; 

    / * 成功し扱うHI_HANDLEリターン、それ以外の戻り0 * / 
    m_lLoginHandle= HI_SDK_Login(m_Ch.device.ip.toStdString()。c_str()、m_Ch.device.user.toStdString()。c_str()、m_Ch.device.password.toStdString()。c_str()、m_Ch.device.port 、&ERR)。

    EMITのsglOnMessage(m_lLoginHandle == 0?E_LOGIN_FAILURE:E_LOGIN_SUCCESS、" ログインERR " ); 
    EMIT sglOnMessage(E_DEBUG_LOG、m_lLoginHandle == 0" ログインERR "" ログイン成功" ); 

    HI_S_STREAM_INFO情報。
    info.u32Channel = HI_CHANNEL_1。
    info.blFlag = HI_TRUE。
    info.u32Mode =HI_STREAM_MODE_TCP; 
    info.u8Type = HI_STREAM_ALL; 

    / * 成功した戻りの#define HI_SUCCESS 0、エラーコードを返すことに失敗。* / 
    M_lPlay = HI_SDK_RealPlay(m_lLoginHandle、(HI_VOID *)m_Win、&情報); 

    EMIT sglOnMessage(m_lPlay =!0 E_REALPLAY_FAILURE :? E_REALPLAY_SUCCESS、" プレイERR " ); 
    EMIT sglOnMessage(E_DEBUG_LOG、m_lPlay == 0" プレイERR "" プレイ成功" ;)

    // 送信ログインしてプレイが正常に処理
    EMIT sglSendHandle(m_lLoginHandle、m_lPlayを); 
}

 

2.コールこのスレッドカテゴリ:

LZYVideo.hヘッダファイル

#pragma

の#include <BaseVideo.h> 
の#include " PlayVideoThread.h " 
の#include " hi_sdk_api.h " 
の#include <QThread> クラス LZYVideo:公共BASEVIDEO 
{ 
    Q_OBJECTの公共
    LZYVideo(QObjectを *親= 0 )。
    LZYVideo();
    int型 startRealPlay(VIDEO_CHANNEL CH、int型の勝利)。
    int型stopRealPlay(); プライベート
    HI_HANDLE m_lLoginHandle。
    HI_S32 m_lPlay;





    VIDEO_CHANNEL m_VideoChannel; 

    PlayVideoThread * m_pPlayWorker。
    QThread * m_pPlayWorkerThread。

プライベート無効 createThreadForPlayVideo(VIDEO_CHANNEL chを、int型の勝利)。
    destroyThreadForPlayVideo(); 

プライベートスロット:
     無効sltGetHandle(HI_HANDLE loginHandle、HI_S32プレイ)。
}。

 

LZYVideo.cppのソースファイル

 
#include " LZYVideo.h " 


のボイド LZYVideo :: createThreadForPlayVideo(VIDEO_CHANNEL chを、int型の勝利)    // 创建线程
{ 
    destroyThreadForPlayVideo(); 
    m_pPlayWorkerは = 新しいPlayVideoThreadを。
    m_pPlayWorker - > のsetParam(CH、勝ちます)。
    m_pPlayWorkerThreadは = 新しい QThreadを(この); 
    m_pPlayWorker - > moveToThread(m_pPlayWorkerThread)。
    接続(m_pPlayWorkerThread、SIGNAL(完成())、m_pPlayWorkerThread、SLOT(deleteLater()))。
    接続(m_pPlayWorkerThread、SIGNAL(完成())、m_pPlayWorker、SLOT(deleteLater()))。
    CONNECT(m_pPlayWorkerThread、SIGNAL(開始())、m_pPlayWorker、SLOT(doWork())); 

    CONNECT(m_pPlayWorker、SIGNAL(sglOnMessage(VIDEO_STATUS_EVENT、QStringの))、これは、信号(sglOnMessage(VIDEO_STATUS_EVENT、QStringの)))。
    CONNECT(m_pPlayWorker、SIGNAL(sglSendHandle(HI_HANDLE、HI_S32))、このスロット(sltGetHandle(HI_HANDLE、HI_S32)))。

    m_pPlayWorkerThread - > 開始(); 
} 

ボイドLZYVideo :: destroyThreadForPlayVideo()
{ 
    場合(m_pPlayWorkerThread && m_pPlayWorkerThread-> isRunning())
    { 
        m_pPlayWorkerThread - >- > 出口(); 
        m_pPlayWorkerThread 待機(); 
        m_pPlayWorkerThread - > deleteLater(); 
        m_pPlayWorkerThread = NULL; 
    } 
} 

int型 LZYVideo :: startRealPlay(VIDEO_CHANNEL CH、INT 勝利)
{ 
    m_VideoChannel = CH。

    stopRealPlay(); 

    createThreadForPlayVideo(CH、勝利)。   // 创建一个线程播放视频
    
    リターン 0 ; 
} 

ボイドLZYVideo :: sltGetHandle(HI_HANDLE loginHandle、HI_S32プレイ)
{ 
    m_lLoginHandle = loginHandle。 
    m_lPlay = 遊び。

    destroyThreadForPlayVideo(); 
}

 

 

挿入されたコードブロックを削除することはできません。添え

 

おすすめ

転載: www.cnblogs.com/tingtaishou/p/11993182.html