Windows核心編程:第10章 同步設備IO與非同步設備IO

来源:https://www.cnblogs.com/gongluck/archive/2018/07/19/9335299.html
-Advertisement-
Play Games

Github https://github.com/gongluck/Windows Core Program.git C++ //第10章 同步設備IO與非同步設備IO.cpp: 定義應用程式的入口點。 // include "stdafx.h" include "第10章 同步設備IO與非同步設備I ...


Github

https://github.com/gongluck/Windows-Core-Program.git

//第10章 同步設備IO與非同步設備IO.cpp: 定義應用程式的入口點。
//

#include "stdafx.h"
#include "第10章 同步設備IO與非同步設備IO.h"

//可提醒IO回調
VOID WINAPI funComplete(
    _In_    DWORD dwErrorCode,
    _In_    DWORD dwNumberOfBytesTransfered,
    _Inout_ LPOVERLAPPED lpOverlapped
)
{

}

//IO完成埠工作線程
DWORD WINAPI workthread(LPVOID lpThreadParameter)
{
    DWORD NumberOfBytesTransferred;
    DWORD CompletionKey;
    OVERLAPPED* pOverlapped;
    BOOL bres = GetQueuedCompletionStatus(lpThreadParameter, &NumberOfBytesTransferred, &CompletionKey, &pOverlapped, INFINITE);
    //GetQueuedCompletionStatusEx可獲取多個IO請求結果
    DWORD dres = GetLastError();

    return 0;
}

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    //打開(創建)文件
    HANDLE hFile = CreateFile(TEXT("第10章 同步設備IO與非同步設備IO.cpp"), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        MessageBox(nullptr, TEXT("打開文件失敗!"), TEXT("error"), MB_OK);
        return 0;
    }

    //文件類型
    DWORD dres = GetFileType(hFile);
    //dres == FILE_TYPE_DISK

    //文件大小
    LARGE_INTEGER li;
    BOOL bres = GetFileSizeEx(hFile, &li);//邏輯大小
    li.LowPart = GetCompressedFileSize(TEXT("第10章 同步設備IO與非同步設備IO.cpp"), (DWORD*)&li.HighPart);//物理大小

    //文件指針
    li.QuadPart = 0;
    bres = SetFilePointerEx(hFile, li, nullptr, FILE_END);
    bres = SetFilePointerEx(hFile, li, &li, FILE_CURRENT);
    bres = SetEndOfFile(hFile);
    li.QuadPart = 0;
    bres = SetFilePointerEx(hFile, li, nullptr, FILE_BEGIN);

    //同步IO
    char* buf = new char[100];
    bres = ReadFile(hFile, buf, 100, &dres, nullptr);
    delete []buf;
    buf = nullptr;

    //刷新緩衝區
    bres = FlushFileBuffers(hFile);

    //CancelSynchronousIo
    //取消線程未完成的同步IO請求

    //關閉文件
    CloseHandle(hFile);
    hFile = nullptr;

    //非同步IO
    HANDLE hFile2 = CreateFile(TEXT("第10章 同步設備IO與非同步設備IO.cpp"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr);
    OVERLAPPED ol;
    ol.Offset = 1024;
    ol.OffsetHigh = 0;
    ol.hEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
    char* buf2 = new char[1024];
    bres = ReadFile(hFile2, buf2, 1024, nullptr, &ol);//非同步方式總是返回FALSE
    dres = GetLastError();
    switch (dres)
    {
    case ERROR_IO_PENDING:
        //IO請求添加成功
        //WaitForSingleObject(hFile2, INFINITE);
        WaitForSingleObject(ol.hEvent, INFINITE);
        break;
    case ERROR_INVALID_USER_BUFFER:
    case ERROR_NOT_ENOUGH_MEMORY:
        break;
    case ERROR_NOT_ENOUGH_QUOTA:
        break;
    default:
        break;
    }

    //取消隊列中的IO請求
    //bres = CancelIo(hFile2);
    bres = CancelIoEx(hFile2, &ol);
    //bres = CancelIoEx(hFile2, nullptr);
    //bres = CloseHandle(hFile2);

    if (ol.hEvent != nullptr)
    {
        CloseHandle(ol.hEvent);
        ol.hEvent = nullptr;
    }

    //可提醒IO
    OVERLAPPED ol2;
    ol2.Offset = 1024;
    ol2.OffsetHigh = 0;
    ol2.hEvent = nullptr;
    dres = ReadFileEx(hFile2, buf2, 1024, &ol2, funComplete);//回調函數在同一個線程空間
    //置為可提醒狀態
    //APC隊列中只要有一個,線程就不會進入睡眠
    dres = SleepEx(INFINITE, TRUE);
    //WaitForSingleObjectEx
    //WaitForMultipleObjectsEx
    //SignalObjectAndWait
    //GetQueuedCompletionStatusEx
    //MsgWaitForMultipleObjectsEx
    dres = GetLastError();//WAIT_IO_COMPLETION

    //手動添加一項到APC隊列
    //可以讓目標線程結束睡眠
    dres = QueueUserAPC((PAPCFUNC)funComplete, GetCurrentThread(), NULL);

    //IO完成埠
    HANDLE iocp = CreateIoCompletionPort(hFile2, nullptr, 1, 2);
    HANDLE hts[2];
    for (int i = 0; i < 2; ++i)
        hts[i] = CreateThread(nullptr, 0, workthread, iocp, 0, nullptr);
    bres = PostQueuedCompletionStatus(iocp, 100, 1, &ol); //模擬發送IO請求完成
    bres = ReadFile(hFile2, buf2, 1024, nullptr, &ol2);
    dres = GetLastError();

    WaitForMultipleObjects(2, hts, TRUE, INFINITE);
    for (int i = 0; i < 2; ++i)
    {
        CloseHandle(hts[i]);
        hts[i] = nullptr;
    }
    CloseHandle(iocp);
    iocp = nullptr;

    CloseHandle(hFile2);
    hFile2 = nullptr;
    delete[]buf2;
    buf2 = nullptr;

    system("pause");
    return 0;
}

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

-Advertisement-
Play Games
更多相關文章
  • 工作中有這樣一個需求,有N張不同的報表,每張報表對應一個數據源,統計數據採用記憶體方式,首先在內在里定義了數據源對應實體。統計條件用lamdba表達式式實現,通過工具對單元格進行定義。在實現過程中針對每一張表來寫取數顯示是很Low的了,取數條件定義都是規則的,統計實現就是一段C#代碼,但是要針對不同的 ...
  • 起因:一臺伺服器中部署的程式,停電後未按照計劃任務正常啟動。 一、創建並配置Windows服務程式 開發工具VS2015 Framework版本2.0 1.新建Windows服務 2.在Service.cs中編寫服務程式所需要執行的操作 服務運行時會自動載入Service1中的代碼,亦有OnStar ...
  • 直接上乾貨簡單易懂 //磁碟監控(遠程/本地) //需要引用System.Management.dll public class RemoteMonitoring { private static string strMsg = ""; private static long freesize = ...
  • 在前文[基於.net core 微服務的另類實現]結尾處,提到瞭如何方便自動的生成微服務的客戶端代理,使對於調用方透明,同時將枯燥的東西使用框架集成,以提高使用便捷性。在嘗試了基於 Emit 中間語言後,最終決定使用生成代碼片段然後動態編譯的模式實現。背景:其一在前文中,我們通過框架實現了微服務面向... ...
  • 程式集版本 一個程式集會有三個版本,每個版本都是做什麼的呢,我們來看一下,每個版本號的用途及正確用法: 版本號 示例版本號: Major(主版本號)|Minor(次版本號)|Build(內部版本號)|Revision(修訂號) | | | 2 | 3 | 719 | 5 前兩個編號構成了公眾對版本的 ...
  • //使用時需要將配置里的內容換成自己的; ...
  • 概要 書簽的設置可以幫助我們快速的定位某段文字,使用起來很方便,也很節省時間。在前一篇文章“C# 如何添加/刪除Word書簽”中介紹了插入、刪除書簽的方法,本篇文章將對C# 操作Word書簽的功能做進一步介紹。示例內容將包含以下要點: 在現有書簽位置插入圖片 在現有書簽位置插入表格 讀取書簽位置的文 ...
  • 關於這類問題網上搜索會有很多解決方案,但基本的意思都相差不大,大致問題出於啟用線程時調用類似剪貼板Clipboard.SetDataObject出錯,我把我的測試代碼展現下: 解決方案:只需將thread.SetApartmentState(ApartmentState.STA);反註釋就可以了。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...