国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Windows編程 線程池的具體作用

分類: C/C++

        Windows的"線程池"不僅僅是個(gè)線程管理的池子。它有很多高級作用。
1:以異步方式調(diào)用函數(shù)
2:每隔一段時(shí)間調(diào)用一個(gè)函數(shù)
3:在內(nèi)核對象觸發(fā)時(shí)調(diào)用一個(gè)函數(shù)
4:在異步I/O請求完成時(shí)調(diào)用一個(gè)函數(shù)
        第一個(gè)方式,顯然就是普通的"線程池"都能做到的事情。用QueueUserWorkItem函數(shù)替代CreateThread來創(chuàng)建一個(gè)新的線程(例如socket監(jiān)聽返回一個(gè)客戶端的連接)。
        第二個(gè)方式,是計(jì)時(shí)器的作用。Windows GUI的計(jì)時(shí)器是和HWND綁定的,一次聲明一個(gè)計(jì)時(shí)器,計(jì)時(shí)器結(jié)束的時(shí)候需要重新設(shè)定,用起來麻煩,而且是和消息隊(duì)列綁定,無法用于復(fù)雜的后臺服務(wù)。Windows線程池則解決了這個(gè)問題。
        第三個(gè)方式,類似于Overlapped IO和線程同步編程。當(dāng)然,線程同步的一堆復(fù)雜問題,已經(jīng)由線程池為我們解決了,不再需要頭疼了。
        第四個(gè)方式,類似于AIO(APC),我們不再需要為每個(gè)I/O操作去指定Completion的回調(diào)操作,而是將這個(gè)回調(diào)注冊給線程池統(tǒng)一管理。

        第一個(gè)方式不用再舉例,第四個(gè)方式要放在IOCP里面闡述。本文只討論二,三兩種方式。
        第二個(gè)方式顯然可以用于某種時(shí)間觸發(fā)----下面這個(gè)例子聲明了兩個(gè)定時(shí)器,一個(gè)1s,一個(gè)2.5s。和直接用Sleep有什么不同呢? Sleep不管之前之后消耗了多少時(shí)間,都Sleep一個(gè)固定的區(qū)間,而Timer則是在精確的時(shí)間點(diǎn)喚醒回調(diào)函數(shù),不受系統(tǒng)負(fù)載和程序cpu占用情況的影響。

#include "stdafx.h"
#include<windows.h>
#include<stdio.h>
int count=0;
HANDLE hEvent,tq,timer1,timer2;
void __stdcall f1(PVOID,BOOL){
    printf("計(jì)時(shí)器1: 1s %d\n",++count);
    if(count>20)SetEvent(hEvent);
}
void __stdcall f2(PVOID,BOOL){
    printf("計(jì)時(shí)器2: 2.5s %d\n",++count);
    if(count>20)SetEvent(hEvent);
}
int _tmain(int argc, _TCHAR* argv[])
{
    if(NULL==(hEvent=CreateEvent(NULL,FALSE,FALSE,"myevent"))){
        printf("CreateEvent失敗:%d\n",GetLastError());
        return 1;
    }
    ResetEvent(hEvent);
    if(NULL==(tq=CreateTimerQueue())){
        printf("CreateTimerQueue失敗:%d\n",GetLastError());
        return 1;
    }
    if(!(CreateTimerQueueTimer(&timer1,tq,(WAITORTIMERCALLBACK)f1,0,1000,1000,0)
     &&CreateTimerQueueTimer(&timer2,tq,(WAITORTIMERCALLBACK)f2,0,2500,2500,0))){
         printf("CreateTimerQueueTimer失敗:%d\n",GetLastError());
         return 1;
    }
    printf("開始計(jì)時(shí)\n");
    WaitForSingleObject(hEvent,INFINITE);
    DeleteTimerQueueTimer(tq,timer1,INVALID_HANDLE_VALUE);
    DeleteTimerQueueTimer(tq,timer2,INVALID_HANDLE_VALUE);
    DeleteTimerQueueEx(tq,INVALID_HANDLE_VALUE);
    return 0;
}

程序運(yùn)行輸出:
開始計(jì)時(shí)
計(jì)時(shí)器1: 1s 1
計(jì)時(shí)器1: 1s 2
計(jì)時(shí)器2: 2.5s 3
計(jì)時(shí)器1: 1s 4
計(jì)時(shí)器1: 1s 5
計(jì)時(shí)器2: 2.5s 6
計(jì)時(shí)器1: 1s 7
計(jì)時(shí)器1: 1s 8
計(jì)時(shí)器1: 1s 9
計(jì)時(shí)器2: 2.5s 10
計(jì)時(shí)器1: 1s 11
計(jì)時(shí)器1: 1s 12
計(jì)時(shí)器1: 1s 13
計(jì)時(shí)器2: 2.5s 14
計(jì)時(shí)器1: 1s 15
計(jì)時(shí)器1: 1s 16
計(jì)時(shí)器2: 2.5s 17
計(jì)時(shí)器1: 1s 18
計(jì)時(shí)器1: 1s 19
計(jì)時(shí)器1: 1s 20
計(jì)時(shí)器2: 2.5s 21
Press any key to continue . . .


        第三種情況,可以在上面的程序基礎(chǔ)上改,把SetEvent的事件對象計(jì)數(shù)器,放到線程池里面去,讓RegisterWaitForSingleObject來處理:

#include "stdafx.h"
#include<windows.h>
#include<stdio.h>
int count=0;
HANDLE hEvent,tq,timer1,hWait;
void __stdcall f(PVOID,BOOL){
    printf("計(jì)時(shí)器1: 1s %d\n",++count);
}
void __stdcall reg(PVOID pParam,BOOL){
    HANDLE hEvent=*(HANDLE*)(pParam);
    SetEvent(hEvent);
}
int _tmain(int argc, _TCHAR* argv[])
{
    if(NULL==(hEvent=CreateEvent(NULL,FALSE,FALSE,"myevent"))){
        printf("CreateEvent失敗:%d\n",GetLastError());
        return 1;
    }
    ResetEvent(hEvent);
    if(NULL==(tq=CreateTimerQueue())){
        printf("CreateTimerQueue失敗:%d\n",GetLastError());
        return 1;
    }
    if(!CreateTimerQueueTimer(&timer1,tq,(WAITORTIMERCALLBACK)f,0,1000,1000,0)){
         printf("CreateTimerQueueTimer失敗:%d\n",GetLastError());
         return 1;
    }
    printf("開始計(jì)時(shí)\n");
    RegisterWaitForSingleObject(&hWait,hEvent,(WAITORTIMERCALLBACK)reg,&hEvent,4000,0);
    WaitForSingleObject(hEvent,INFINITE);
    DeleteTimerQueueTimer(tq,timer1,INVALID_HANDLE_VALUE);
    DeleteTimerQueueEx(tq,INVALID_HANDLE_VALUE);
    return 0;
}

        程序輸出是:
開始計(jì)時(shí)
計(jì)時(shí)器1: 1s 1
計(jì)時(shí)器1: 1s 2
計(jì)時(shí)器1: 1s 3
計(jì)時(shí)器1: 1s 4
Press any key to continue . . .
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Overlapped I/O模型深入分析
C++實(shí)現(xiàn)線程同步的四種方式總結(jié)
System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的 區(qū)別和用法
多線程技術(shù)在VC++串口通信程序中的應(yīng)用研究
Windows進(jìn)程、線程之間同步方式概述
多線程與串行通信
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服