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(); }
挿入されたコードブロックを削除することはできません。。。添え