<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 17.2 使用wxThread 如果你要在你的代碼中使用線程,首先要實現一個wxThread的派生類,并且至少要重載其虛函數Entry,這個函數包含了線程要做的主要的事情.舉例來說,比如我們要用一個單獨的線程來計算圖片中顏色的數目,下面是我們的派生類的聲明: ``` class MyThread : public wxThread { public: MyThread(wxImage* image, int* count): m_image(image), m_count(count) {} virtual void *Entry(); private: wxImage* m_image; int* m_count; }; // 一個標識符 用來在線程工作完成的時候通知應用程序. #define ID_COUNTED_COLORS 100 ``` Entry函數用來進行計算工作并且返回一個返回值(對于聯合線程(即將介紹),Wait函數將返回這個值),下面是我們的Entry函數: ``` void *MyThread::Entry() { (* m_count) = m_image->CountColours(); // 使用一個已知的事件來通知應用程序. wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, ID_COUNTED_COLORS); wxGetApp().AddPendingEvent(event); return NULL; } ``` 為了簡單起見,我們沒有定義新的事件而是使用了一個已有的事件通知應用程序線程的工作已經做完了. 線程的創建 線程的創建分為兩步,首先產生一個線程的實例,然后調用線程的Create函數: ``` MyThread *thread = new MyThread(); if ( thread->Create() != wxTHREAD_NO_ERROR ) { wxLogError(wxT("Can't create thread!")); } ``` 有兩種不同的線程,一種線程你在啟動之后就可以忘記它的存在,而另外一種,你需要等待它返回一個結果.前者我們稱為分離線程,后者稱為聯合線程. 線程的類型是通過調用wxThread的構造函數時傳遞的參數是wxTHREAD_DETACHED還是wxThrEAD_JOINABLE來決定的,聯合線程的返回值是由對其成員函數Wait的調用返回的,而對于分離線程,不可以調用Wait函數. 你不必把所有的線程都創建為聯合線程,,因為聯合線程有它不方便的地方,你必須調用聯合線程的Wait函數來等待聯合線程結束,否則系統為這個線程分配的所有的資源將不會被釋放,并且你還需要自己刪除這個線程對象(盡管這個對象只能使用一次).而分離線程則具有"點火以后就忘掉"的特性,你只需要啟動它,它將自己自己中止和釋放. 當然,這也意味者分離線程必須在堆上創建,因為它將在結束的時候調用delte(this).聯合線程既可以在棧上創建也可以在堆上創建,不同通常也都是在堆上創建的.不要創建全局的線程對象,因為他們將在他們的構造函數執行的時候分配內存,這將導致內存檢測系統出現一些問題. 指定棧大小 你可以在調用線程的Create函數的時候指定它的棧大小,默認的0代表使用操作系統默認的大小. 指定優先級 某些操作系統允許應用程序自己提供一個線程的優先級(時間片的大小),你可以通過wxThread::SetPriority函數來達到這個目的.優先級的數值在0到100之間,0為最低優先級而100為最高優先級,不過最好使用預定義的宏wxTHREAD_MIN_PRIORITY, wxTHREAD_DEFAULT_PRIORITY和wxTHREAD_MAX_ PRIORITY,他們的值分別為0,50和100.SetPriority函數應該在調用Create之后,調用Run函數之前被調用. 啟動線程 調用Create函數以后,線程還沒有開始運行,你還需要調用wxThread::Run函數來啟動線程,這個函數將會調用你自定義的Entry函數. 怎樣暫停線程以等待一個外部條件 如果線程需要等待某些事情發生,你應該避免直接使用查詢和什么事都不做這樣的循環,這會讓你的程序"忙于等待",白白浪費CPU的時間. 如果你需要等待幾秒鐘,你可以使用wxThread::Sleep函數. 如果你正在等待什么事情發生,你應該使用一種調用來阻止當前線程執行直到你收到事情已經發生的通知.例如,如果你在線程中使用了 socket,你應該阻塞在socket的系統調用上,直至socket收到數據,這就不會白白浪費CPU了,或者如果你正在等待一個聯合線程使用的數據,你可以調用Wait其函數來阻塞自己. 有時候你可能會想用線程的Pause和Resume函數來臨時將你的線程置入睡眠狀態,但是這樣做有兩個問題,首先,暫停機制不是所有的系統都支持,有些系統(尤其是POSIX標準的系統)的Pause是模擬的,線程必須調用TestDestroy并且在這個函數返回True的時候立刻中斷自己的運行.第二個問題是,調用Pause的線程有時候很難回復正常運行,因為這使得操作系統可能在任何時候中止你的線程的運行,如果你的線程正在鎖定一個信號量,很可能來不及釋放這個信號量導致出現死鎖. 因此,使用Pause和Resume并不是一個很好的設計,你應該盡可能使用信號量或者關鍵區域(參見下一小節)來重新設計你的代碼. 線程中止 正如前面我們談到的那樣,分離線程是自動結束和釋放自己的.而對于聯合線程,你可以簡單的調用wxThread::Wait函數.或者在一個GUI程序中,你可以在系統空閑事件處理函數中調用wxThread::IsAlive函數,然后僅在IsAlive返回False的時候調用 Wait函數.Wait函數是釋放聯合線程資源的唯一的方法. 你可以調用wxThread::Delete來請求刪除一個線程,不過要讓它工作正常,你需要在你的線程中周期性的調用TestDestroy函數(譯者注:根據經驗,在Windows平臺上,對于聯合線程使用這種方法好像不是一個好主意).
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看