Grabber::removeListener Method

特定のイベント用のコールバックハンドラオブジェクトの登録を取り消します。

構文

bool removeListener( GrabberListener* pListener, DWORD callback = -1 );
パラメータ 説明
pListener 登録を取り消すコールバックハンドラへのポインタを指定します。
callback 指定されたコールバックハンドラが扱わなくなるイベントを指定します。
2つ以上のlistener typeを結合させるにはバイナリのOR演算子を使います。デフォルトは-1となり、 -1 は利用可能な全GrabberListener::tListenerTypeクラスライブラリリファレンス>クラス>GrabberListener>GrabberListener::tListenerTypeのコンビネーションです。

戻り値

pListenerで指定されたコールバックハンドラの登録取り消しが正常に行われた場合はtrueとなります。これは指定されたイベント用のコールバックがどれも処理中でないことが条件となります。コールバックが処理中である場合、grabberがハンドラの登録取り消し要求を格納しておき、falseを返します。そしてそのコールバックの処理が完了次第、格納されていた要求が実行されます。

備考

全てのイベント用に登録されたコールバックハンドラの取り消しを行う際にremoveListenertrueを返した場合、単にコールバックハンドラを破棄しただけの可能性があります。
falseが返される場合、アプリケーションはループ内でGrabber::isListenerRegisteredクラスライブラリリファレンス>クラス>Grabber>Grabber::isListenerRegistered Methodをコールして登録取り消し要求が実行されるのを待たなければいけません。ループ内にはSleep(0)を入れるようにしてください。そうでなければプロセッサに過度な負荷がかかってしまい、待機状態のコールバックがなかなか処理されなくなってしまう可能性があります。これがデッドロックを引き起こすことになります。Grabber::isListenerRegisteredクラスライブラリリファレンス>クラス>Grabber>Grabber::isListenerRegistered Method がtrueを返せな、コールバックハンドラを破棄して構いません。

サンプル

この例ではイベント用にGrabberListenerクラスライブラリリファレンス>クラス>GrabberListenerより継承したコールバックハンドラの登録と取り消しの方法、そしてコールバックハンドラを安全に削除する方法についても紹介します。

Grabber *grabber = new DShowLib::Grabber();
CListener *pcListener = new CListener();   //GrabberListenerオブジェクトの作成
                       // CListenerはGrabberListenerより継承
// pcListenerオブジェクトをGrabberのGrabberListener オブジェクトリストへ登録
grabber->addListener( pcListener, DShowLib::GrabberListener::eFRAMEREADY|
                  DShowLib::GrabberListener::eOVERLAYCALLBACK );
grabber->startLive( true );   // ライブモードの開始
// イベントのハンドリング
fflush(stdin);
printf("Press [enter] to stop!");
getchar();
// GrabberListenerオブジェクトは削除する前に登録を取り消す必要があるため
// 最初にframereadyイベント用の登録を取り消す
grabber->removeListener(pcListener, DShowLib::GrabberListener::eFRAMEREADY);
// 次にoverlaycallbackイベント用の登録を取り消す
grabber->removeListener(pcListener, DShowLib::GrabberListener::eOVERLAYCALLBACK);
// 全ての登録取り消し要求が処理されるまで待機
while( grabber->isListenerRegistered( pcListener, eALL) )
{
  Sleep( 0 );  //待機
}
// これでCListenerメソッドがGrabberにコールされる心配がなくなった為、
// 安全にCListenerを削除することができます
delete pcListener;
grabber->stopLive();  // ライブモードの停止
delete grabber;