數據結構 隊列_隊列實例:事件處理

来源:http://www.cnblogs.com/idreamo/archive/2017/11/23/7882989.html
-Advertisement-
Play Games

在事件驅動的應用中利用隊列來處理事件是一種常見的方法。 事件驅動的應用主要遵循實時事件發生的順序來執行。 例如,在java或windows中開發圖形用戶界面,應用程式的行為主要取決於鍵盤操作、滑鼠點擊等一些由用戶觸發的事件。其他一些數據驅動型的例子還包含飛機或工廠設備中的控制系統等。 在很多事件驅動 ...


在事件驅動的應用中利用隊列來處理事件是一種常見的方法。

事件驅動的應用主要遵循實時事件發生的順序來執行

例如,在java或windows中開發圖形用戶界面,應用程式的行為主要取決於鍵盤操作、滑鼠點擊等一些由用戶觸發的事件。其他一些數據驅動型的例子還包含飛機或工廠設備中的控制系統等。

在很多事件驅動的應用中,事件可能隨時發生,因此在能夠處理這些已經發生的事件之前,有序地存儲和管理這些事件是非常重要的。由於系統處理事件的順序基本是按照事件發生的先後順序進行的,因此隊列是處理這種情況的較好的辦法。

示例1列舉了兩個用於事件處理的函數:receive_event和process_event。兩個函數都用於處理包含Event類型事件的隊列。Event在event.h中定義,在此沒有列舉出來。

一個應用程式調用receive_enent將一個將要處理的事件入隊。當應用程式認為是時候來處理一個事件時,它就會調用process_event函數。

在process_event函數內部,事件從隊列中出隊,並轉交由應用程式指定的具體的調度函數處理。調度函數作為參數dispatch傳遞給process_event。使用調度函數的目的是採取適當的行為來處理事件。

一般有兩種常用的調度方法:同步地處理事件,即在處理的事件未完成之前無法進行下一個操作;非同步地處理事件,即在事件處理的過程中,還能另外啟動獨立進程來處理其他事件。通常非同步處理效率更高,但在處理主從進程之間的關係時需要特別小心,以免衝突。

receive_event的運行時複雜度為O(1),因為它只調用了複雜度為O(1)的隊列操作queue_enqueue。process_event的運行時複雜度取決於它所調用的調度函數。process_event剩下部分運行固定的時間。

示例1:  處理事件函數的實現

/*events.c*/
#include <stdlib.h>
#include <string.h>
#include "event.h"
#include "events.h"
#include "queue.h"

int receive_event(Queue *enents,const Event *event)
{
    Event  *new_event;
    
    if((new_event = (Event*)malloc(sizeof(Event))) == NULL)
        return -1;
    
    memcpy(new_event,event,sizeof(Event));

    if(queue_enqueue(events,new_event) != 0)
        return -1;

    return 0;
}

int process_event(Queue *events,int (*dispatch)(Event *event))
{
    Event  *event;
    
    if(queue_size(events) == 0)
        return -1;
    else
    {
        if(queue_dequeue(events,(void**)&event) != 0)
            return -1;
        else
        {
            dispatch(event);
            free(event);
        }
    }
return 0;
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Jenkins介紹 Jenkins是基於Java開發的一種持續集成工具,用於監控持續重覆的工作,功能包括: 1、持續的軟體版本發佈/測試項目。 2、監控外部調用執行的工作。 安裝環境 操作系統:linux(centOS) 軟體:jdk 軟體:tomcat 軟體:jenkins(2.7.1版) 安裝步 ...
  • image.png 程式計數器 作用:當前線程所執行的位元組碼的行號指示器。 在虛擬機的概念模型里,位元組碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。 註:如果線程正在執行一個java方法,計數器記錄 ...
  • 對於功能變數名稱解析相信很多小伙伴都瞭解過,就是我們在萬網購買一個功能變數名稱,比如hpugs.com,然後呢?我們希望功能變數名稱與我們的伺服器綁定,然後通過功能變數名稱直接訪問我們的項目,這就是本篇要和大家一起探討的問題。下麵開始我們的工作: 1、首先是功能變數名稱,登錄萬維網官網,填寫我們想要購買的功能變數名稱,然後就是查詢是否已被搶註,如 ...
  • substr(string,start,length) 參數:1,string 即你要截取的字元串2,start 即要截取的開始位置(0表示從從前往後數 第一個字元開始,負數表示從從後往前數) eg:start=1,表示從從前往後開始的第二個數開始截取,start=-1,表示從從後往前開始的第一(是 ...
  • 我學習SSE指令的初衷就是為了實現RGB<->RGBA, YUV<->RGBA、RGB,這些轉換的指令優化。 在學習指令優化的過程中總是會看到SIMD(Single Instructions Multi Data), 單指令多數據:在一個指令周期內使用一條指令處理多個數據。這是Intel早期開發MM ...
  • (1)如果只是看i++和++i,這兩個是等價的,都等同於i=i+1,都是變數自身加1。 (2)在一般情況下,它們都是跟賦值聯繫在一起。 比如:int a; a=i++;//將i的值賦值給a,即a=i;然後再執行i=i+1;也就是【a=i++;】與【a=i; i=i+1;】等價 a=++i;//將i+ ...
  • pandas可以讀寫如下格式的數據類型: 具體詳見:http://pandas.pydata.org/pandas docs/version/0.20/io.html 讀取csv文件 我們準備了一個csv文件,格式類似為: 要讀取此csv文件,方法為: 輸出為: 這裡我第一次嘗試運行時,由於沒有設置 ...
  • java 使用metadata-extractor 旋轉圖片 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...