線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:784
推到 Plurk!
推到 Facebook!

ThreadProc 呼叫到DirectShow 物件產生 deadlock

尚未結案
lgyui
初階會員


發表:21
回覆:29
積分:30
註冊:2003-01-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-25 01:26:35 IP:218.161.xxx.xxx 未訂閱
當我使用 CWindThread 時, ThreadProc 使用到 DirectShow 物件後,我便沒法子正常要求它停下來    
    UINT Win32ThreadProcedure(PVOID pvParam) {
         CoInitializeEx(0, COINIT_APARTMENTTHREADED);
        Win32Thread *thread = static_cast (pvParam);
         for (int i=0;i<150;i  ) {
              /////////// 這一行沒加就正常也, 加了後有時後會 deadlock
              dx_tuner->SetChannel(i 1); <<< 呼叫 DirectShow IAMTuner
              if (IsKill()) break;
         }
        thread->deadEvent.SetEvent();
        CoUninitialize();
        return 0;
}    BOOL Win32Thread::IsKill() {
  BOOL b = WaitForSingleObject(killEvent, 0) == WAIT_OBJECT_0;
  return b;
}    BOOL Win32Thread::IsDead() {
  BOOL b = WaitForSingleObject(deadEvent, 0) == WAIT_OBJECT_0;
  return b;
}    BOOL Win32Thread::Start() {
  killEvent.ResetEvent();
  deadEvent.ResetEvent();
  winThread = ::AfxBeginThread(
    Win32ThreadProcedure, (LPVOID) this, 
    THREAD_PRIORITY_NORMAL, 0, 0, NULL
  );
  if (winThread) return TRUE;
  else return FALSE;
}    BOOL Win32Thread::Stop() {
  if (!IsDead() && winThread != NULL) {
    killEvent.SetEvent(); <<< 設定要求 Thread 停止
    while (!IsDead()) { <<< 等待 Thread  停止 ( deadlock )
      Sleep(500);
      //WaitForSingleObject(deadEvent, INFINITE);
    }
    winThread = NULL;
    return TRUE;
  }
  return FALSE;
}
Win32Thread::~Win32Thread() { }
@@ 樹有本未 事有始終 知其所以 則近道已
系統時間:2024-05-21 1:05:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!