<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] ## 線程 1. QThread 是個 low-level 的類,適用于長期顯示的構建長期運行的線程 2. QtConCurrent 是一個命名空間,提供了用于編寫并發軟件的更高層次的類和算法 3. QtConCurrent 的 QThreadPool 是管理線程池的類,每個Qt應用程序都帶有 QThreadPool::globInstance()函數,它帶有推薦的最大線程數(一般為核數) 4. 令模式和利用 QtConcurrent::run()工作時可把QRunnable用作基類。在這些情況下,無須顯式地創建線程或者直接管理它們,只需簡單地把工作片段描述為具有正確接口的對象即可。 ## 避免使用線程場景 - 一般情況下,要盡可能避免使用線程. - 而是用 Qt 事件循環與 QTimer 、非阻塞 I/O 操作、信號以及短持續時間槽相結合的方法來代替。 - 此外,可以在**主線程中長期運行的循環調用** Application::processEvents(),以使執行工作時圖形用戶界面可以保持響應 - 要驅動動畫( animation),建議使用 QTimer, QTimerLine 或者動畫框架( Animation Framework)。這些AP并不需要額外創建其他線程。它們允許訪問動畫代碼中的 GUI 對象而且不會妨礙圖形用戶界面的響應。 ## 使用線程場景 如果要完成CPU密集型工作并希望將其分配給多個處理核,可以把工作分散到Runnable并通過以下這些推薦做法來實現線程的安全。 - 無論何時,都盡可能使用 QConCurernt 算法把 CPU 密集型計算工作分散給多線程,而不是自己編寫 QThread代碼。 - 除了主線程以外,不要從其他任何線程訪問圖形用戶界面(這也包括那些由 QWdiget 類, QPixMap 和其他與顯卡相關的類)。這包括讀取操作,比如查詢 QLineEdit 中輸入的文本 - 要在其他線程中處理圖像,使用 QImage 而不是 QPixMap - 子線程中不要調用 QDialog::exec() 或者從除主線程之外的任何線程創建 QWidget QIODevice 的子類 - 使用 QMutex, QReadWriteLock 或者 QSemaphone 以禁止多個線程同時訪間臨界變量。 - 在一個擁有多個 return 語句的函數中使用 鎖,確保鎖均能釋放 - 創建 QObject 的線程,也稱線程關聯( thread affinity),負責執行那個 QObject的槽。 - 通過從run()函數直接或者間接地調用 QThread::exec(),可以讓線程進入事件循環。 - 利用 Application::postEvent()分發事件,或使用隊列式的信號槽連接,都是用于線程間通信的安全機制—但需要接收線程處于事件循環中。 - **確保每個跨線程連接的參數類型都用 qRegisterMetafype() 注冊過** ## QRunnable 與 QThreads 區別 1. 與外界通信方式不同。由于QThread是繼承于QObject的,但QRunnable不是,所以在QThread線程中,可以直接將線程中執行的結果通過信號的方式發到主程序,而QRunnable線程2不能用信號槽,只能通過別的方式,等下會介紹。 2. 啟動線程方式不同。QThread線程可以直接調用start()函數啟動,而QRunnable線程需要借助QThreadPool進行啟動。 3. 資源管理不同。QThread線程對象需要手動去管理刪除和釋放,而QRunnable則會在QThreadPool調用完成后自動釋放。 4. QThread適用于那些常駐內存的任務。而且QThread可以通過信號/槽的方式與外界進行通信。而QRunnable則適用于那些不常駐內存,任務數量比較多的情況。 ## QThread / QRunnable / QtConcurrent 區別 |特性|QThread|QRunnable|QtConcurrent| |---|---|---|---| |高級API|×|×| √| |面向任務|× | √|√ | |內建對暫停/恢復/取消的支持|× | ×| √| |具有優先級| √| ×| ×| |可運行事件循環| √| ×|× |
                  <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>

                              哎呀哎呀视频在线观看