<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國際加速解決方案。 廣告
                在了解了INotify與Epoll的基礎知識之后便可以正是開始分析Reader子系統的工作原理了。首先要理解InputReader的運行方式。在5.1.3節介紹了InputReader被InputManager創建,并運行于InputReaderThread線程中。InputReader如何在InputReaderThread中運行呢? InputReaderThread繼承自C++的Thread類,Thread類封裝了pthread線程工具,提供了與Java層Thread類相似的API。C++的Thread類提供了一個名為threadLoop()的純虛函數,當線程開始運行后,將會在內建的線程循環中不斷地調用threadLoop(),直到此函數返回false,則退出線程循環,從而結束線程。 InputReaderThread僅僅重寫了threadLoop()函數: **InputReader.cpp-->InputReaderThread::threadLoop()** ``` bool InputReaderThread::threadLoop() { mReader->loopOnce(); // 執行InputReader的loopOnce()函數 returntrue; } ``` InputReaderThread啟動后,其線程循環將不斷地執行InputReader.loopOnce()函數。因此這個loopOnce()函數作為線程循環的循環體包含了InputReader的所有工作。 * * * * * **注意**: C++層的Thread類與Java層的Thread類有著一個顯著的不同。C++層Thread類內建了線程循環,threadLoop()就是一次循環而已,只要返回值為true,threadLoop()將會不斷地被內建的循環調用。這也是InputReader.loopOnce()函數名稱的由來。而Java層Thread類的run()函數則是整個線程的全部,一旦其退出,線程也便完結。 * * * * * 接下來看一下InputReader.loopOnce()的代碼,分析一下InputReader在一次線程循環中做了什么。 **InputReader.cpp-->InputReader::loopOnce()** ``` void InputReader::loopOnce() { ...... /* **① 通過EventHub抽取事件列表**。讀取的結果存儲在參數mEventBuffer中,返回值表示事件的個數 *當EventHub中無事件可以抽取時,此函數的調用將會阻塞直到事件到來或者超時 */ size_tcount = mEventHub->getEvents(timeoutMillis ,mEventBuffer, EVENT_BUFFER_SIZE); { AutoMutex _l(mLock); ...... if(count) { // **② 如果有抽得事件,則調用processEventsLocked()函數對事件進行加工處理** processEventsLocked(mEventBuffer, count); } ...... } ...... /* **③ 發布事件。** processEventsLocked()函數在對事件進行加工處理之后,便將處理后的事件存儲在 mQueuedListener中。在循環的最后,通過調用flush()函數將所有事件交付給InputDispatcher */ mQueuedListener->flush(); } ``` InputReader的一次線程循環的工作思路非常清晰,一共三步: - 首先從EventHub中抽取未處理的事件列表。這些事件分為兩類,一類是從設備節點中讀取的原始輸入事件,另一類則是輸入設備可用性變化事件,簡稱為設備事件。 - 通過processEventsLocked()對事件進行處理。對于設備事件,此函數對根據設備的可用性加載或移除設備對應的配置信息。對于原始輸入事件,則在進行轉譯、封裝與加工后將結果暫存到mQueuedListener中。 - 所有事件處理完畢后,調用mQueuedListener.flush()將所有暫存的輸入事件一次性地交付給InputDispatcher。 這便是InputReader的總體工作流程。而我們接下來將詳細討論這三步的實現。
                  <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>

                              哎呀哎呀视频在线观看