久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質的職業(yè)教育機構

        手機站
        千鋒教育

        千鋒學習站 | 隨時隨地免費學

        千鋒教育

        掃一掃進入千鋒手機站

        領取全套視頻
        千鋒教育

        關注千鋒學習站小程序
        隨時隨地免費學習課程

        當前位置:首頁  >  技術干貨  > queueuserapc詳解

        queueuserapc詳解

        來源:千鋒教育
        發(fā)布人:xqq
        時間: 2023-11-23 14:05:39 1700719539

        一、queueuserapc概述

        queueuserapc是Windows系統(tǒng)中常用的函數(shù)之一,用于異步執(zhí)行一個回調函數(shù),該函數(shù)采用的機制是向指定線程插入一個APC(Asynchronous Procedure Call)對象,使得該線程可以在特定的時機異步執(zhí)行該函數(shù),從而避免了線程等待和阻塞等問題,提高了系統(tǒng)的響應性。

        二、queueuserapc函數(shù)說明

        三、queueuserapc函數(shù)示例代碼

        1、使用queueuserapc實現(xiàn)線程通信

        在下面的示例代碼中,我們將演示通過使用queueuserapc函數(shù)實現(xiàn)線程間的通信。

        首先,我們創(chuàng)建兩個線程,一個線程用于發(fā)送消息,一個線程用于接收消息。我們將發(fā)送消息的線程的句柄作為參數(shù)傳遞給queueuserapc函數(shù),在該函數(shù)中定義接收消息的回調函數(shù)進行消息的接收處理。

        
        DWORD WINAPI ThreadProc1(LPVOID lpParam)
        {
            HANDLE hThread2 = (HANDLE)lpParam;
            while (TRUE)
            {
                Sleep(1000);
                QueueUserAPC((PAPCFUNC)APCFunc, hThread2, (ULONG_PTR)1);
            }
            return 0;
        }
        
        DWORD WINAPI ThreadProc2(LPVOID lpParam)
        {
            while (TRUE)
            {
                SleepEx(INFINITE, TRUE);
            }
            return 0;
        }
        
        void CALLBACK APCFunc(ULONG_PTR dwData)
        {
            printf("Thread 1 sends message to Thread 2\n");
        }
        

        2、使用queueuserapc異步執(zhí)行函數(shù)

        下面的示例代碼演示了如何使用queueuserapc函數(shù)異步執(zhí)行一個函數(shù),以避免阻塞和等待。

        
        DWORD WINAPI ThreadProc(LPVOID lpParam)
        {
            while (TRUE)
            {
                SleepEx(INFINITE, TRUE);
            }
            return 0;
        }
        
        void CALLBACK APCFunc1(ULONG_PTR dwData)
        {
            printf("APC function 1 is called\n");
        }
        
        void CALLBACK APCFunc2(ULONG_PTR dwData)
        {
            printf("APC function 2 is called\n");
        }
        
        int main()
        {
            HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, CREATE_SUSPENDED, NULL);
            if (hThread == NULL)
            {
                return 0;
            }
        
            ResumeThread(hThread);
            QueueUserAPC((PAPCFUNC)APCFunc1, hThread, (ULONG_PTR)1);
            QueueUserAPC((PAPCFUNC)APCFunc2, hThread, (ULONG_PTR)2);
        
            WaitForSingleObject(hThread, INFINITE);
        
            return 0;
        }
        

        3、實現(xiàn)基于事件回調的框架

        下面的示例代碼演示了如何使用queueuserapc函數(shù)實現(xiàn)一個基于事件回調的框架。

        
        #include 
        #include 
        
        #define WM_COMPLETE  WM_APP+1
        
        void CALLBACK APCFunc(ULONG_PTR dwData);
        
        class EventFrame
        {
        public:
            EventFrame(HWND hWnd) :m_hWnd(hWnd) {}
        
            void OnComplete()
            {
                PostMessage(m_hWnd, WM_COMPLETE, 0, 0);
            }
        
            void Wait()
            {
                while (TRUE)
                {
                    SleepEx(INFINITE, TRUE);
                }
            }
        private:
            HWND m_hWnd;
        };
        
        LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
        {
            switch (message)
            {
            case WM_COMPLETE:
                printf("WM_COMPLETE\n");
                return 0;
        
            case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
            }
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        
        int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
        {
            TCHAR szClassName[] = _T("Sample Window Class");
            MSG msg = { 0 };
            WNDCLASSEX wc = { 0 };
            wc.cbSize = sizeof(WNDCLASSEX);
            wc.hInstance = hInstance;
            wc.lpszClassName = szClassName;
            wc.lpfnWndProc = WndProc;
            wc.style = CS_HREDRAW | CS_VREDRAW;
        
            RegisterClassEx(&wc);
        
            HWND hWnd = CreateWindowEx(
                WS_EX_APPWINDOW, szClassName, _T("Sample Window"), WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                HWND_DESKTOP, NULL, hInstance, NULL);
        
            if (hWnd == NULL)
            {
                return 0;
            }
        
            ShowWindow(hWnd, nCmdShow);
            UpdateWindow(hWnd);
        
            EventFrame frame(hWnd);
        
            HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)APCFunc, (LPVOID)&frame, CREATE_SUSPENDED, NULL);
            if (hThread == NULL)
            {
                return 0;
            }
        
            ResumeThread(hThread);
        
            frame.Wait();
        
            return msg.wParam;
        }
        
        void CALLBACK APCFunc(ULONG_PTR dwData)
        {
            EventFrame* pFrame = (EventFrame*)dwData;
            pFrame->OnComplete();
        }
        

        tags: pid文件
        聲明:本站稿件版權均屬千鋒教育所有,未經(jīng)許可不得擅自轉載。
        10年以上業(yè)內強師集結,手把手帶你蛻變精英
        請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
        免費領取
        今日已有369人領取成功
        劉同學 138****2860 剛剛成功領取
        王同學 131****2015 剛剛成功領取
        張同學 133****4652 剛剛成功領取
        李同學 135****8607 剛剛成功領取
        楊同學 132****5667 剛剛成功領取
        岳同學 134****6652 剛剛成功領取
        梁同學 157****2950 剛剛成功領取
        劉同學 189****1015 剛剛成功領取
        張同學 155****4678 剛剛成功領取
        鄒同學 139****2907 剛剛成功領取
        董同學 138****2867 剛剛成功領取
        周同學 136****3602 剛剛成功領取
        相關推薦HOT
        玉屏| 盐源县| 盖州市| 来安县| 景泰县| 武宣县| 兴山县| 靖边县| 合江县| 邵武市| 德化县| 涞源县| 高清| 黄梅县| 东丰县| 西城区| 扎囊县| 清河县| 策勒县| 蒲城县| 江阴市| 云南省| 荔波县| 怀安县| 斗六市| 启东市| 宿松县| 丰原市| 错那县| 屯昌县| 泰来县| 开江县| 蓬安县| 长岛县| 玉龙| 文水县| 子洲县| 奎屯市| 漠河县| 宁波市| 乌什县|