2014年4月28日 星期一

[BCB] Thread 記錄

[BCB] Thread 記錄

幾個 Thread 常出現的問題:
1.      執行 WaitFor() 後,執行緒卡住回不來,無法結束。
WaitFor 可能造成 deadlock,若是不需該執行緒的執行結果,則建議不使用此功能。
2.      delete thread 有時會出現 Access Violation
Thread 原生的 Terminate 可能已含清除記憶體,故在使用 delete thread 後造成錯誤,有兩種建議寫法:
2-1. Thread->OnTerminate = OnThreadTerminate;
    void __fastcall xxx::OnThreadTerminate()
   {
       …
       delete thread;  // 釋放記憶體
       thread = NULL;  // 若沒有指為 NULL,仍可讀到訊息,但讀到的訊息可能是錯誤的。
   }
2-2. 寫在程式的解構子中
    if(FTimerThread)
        FTimerThread->Terminate();
3.      Application->ProcessMessage 可能造成錯誤,及耗時。
ThreadTimer Application->ProcessMessage 最好不要混用,除非必要或有很好的 debug 機制,否則易發生問題且不易追蹤。
另外,Application->ProcessMessage 呼叫的位置也很重要。
Example.
    TimerFunction()
   {
        // 最好放這,因為程式尚未執行,若因為 ProcessMessage 而跳離也不會對程式造成影響。
        // 中間呼叫 ThreadFunction,不要放中間,若跳離程式處理到一半會出錯。
        // 次好放這,程式已執行結束,跳離也沒關係。
   }
因為 Application->ProcessMessage 是去攔截訊息,看是否有需要先處理的消息,如果有則跳去處理優先全高的消息,因此會耗時,且放的位置會影響到程式的執行。
** 正確的使用方法:
3-1. 在單執行緒的程式中,可以安心使用 Application->ProcessMessages,只要系統其他應用程式不忙,那加了 Application->ProcessMessages 自然會讓  GUI 順暢。
3-2. 在多執行緒的程式中,應儘可能少用 Application->ProcessMessages,除非您已確定,此執行緒可以暫時不繼續處理。對於有大迴圈或處理大量資料的執行緒,如果擔心她會占用太多 CPU 時間,則應設定該執行緒的優先權為 Lower Lowest,如此就不用擔心其他的執行緒受到影響了。
4.      Application->HandleMessage vs Application->ProcessMessage
HandleMessage 調用 ProcessMessage function
ProcessMessage 實際獲取消息並分配。