Windows API一日一練(70)GetSystemTime和GetLocalTime函數

時間是一個非常重要的資訊,比如寫LOG時,就需要把時間輸出來,跟蹤程式是什麼時候出錯的。或者當你開發一個銀行交易系統時,就要記錄當前交易的時間,以便後面可以輸出報表,列印給信用卡使用者。根據不同的需求,可能需要使用不同的時間,目前有UTC和本地時間。UTC是格林威治時間,也就是全球標準時間。本地時間就是相對於UTC而言的,比如中國北京是在東8區,相對於UTC就多了8個小時。一般使用到的時間都是使用本地時間,也就是調用函數GetLocalTime。 函數GetSystemTime和GetLocal

Windows API一日一練(46)GetTickCount

時間計時,也不是越精確越好,有時只需要有一個計時就行了。這樣就可以使用毫秒層級的計時函數GetTickCount。這個函數是記錄了系統啟動以來的時間毫秒,當超過49.7天,這個值變為從0開始,也就是說49.7天是一個周期。當不同的兩次函數調時,就返回兩次時間差值。 函數GetTickCount聲明如下: WINBASEAPIDWORDWINAPIGetTickCount(    VOID    ); 調用函數的例子如下:#001 //一般的時鐘計時。#002  //蔡軍生 2007/11/09

Windows API一日一練(54)WriteFile和ReadFile函數

讀寫檔案是每個Windows軟體開發人員都需要做的工作。可見這項工作是非常重要的,畢竟各種各樣的資料都需要儲存起來,以便作各種各樣的分析,或者通過網路傳送給別人。像大家用BT下載的電影,在那個BT軟體裡,就需要不斷從網路裡接收到資料,然後再把這些資料儲存到檔案裡合適的位置,就可以產生跟發行者那裡一樣的檔案,這樣才可以播放出來。又比如我在玩《征途》的遊戲裡,剛剛開啟遊戲時,它就不斷從伺服器上下載更新的檔案下來,然後儲存到硬碟。WriteFile函數是用來寫資料到檔案,ReadFile函數是從檔案裡

Windows API一日一練(77)VirtualAlloc函數

上一次學習了全域記憶體的分配,在Windows裡記憶體管理是分為兩部份,全域記憶體是系統管理的記憶體,因而所有進程都可以訪問的記憶體,而每一個進程又有自己的記憶體空間,這就是虛擬記憶體空間了,而虛擬記憶體的空間比較大,當實體記憶體不足時,系統會把虛擬記憶體的資料儲存到硬碟裡,這樣只要硬碟的空間足夠大,每個進程就可以使用3G的記憶體。虛擬記憶體分配可以作為程式裡分配記憶體的主要方式,比如大量的資料緩衝區,動態分配記憶體的空間。使用VirtualAlloc函數來分配記憶體的速度要比全域記憶體要快。 

Windows API一日一練(81)FormatMessage函數

在開發軟體的過程裡,經常要做的工作就是偵錯工具,許多問題的出現,不但是邏輯的問題,還有可能是對API的不熟悉,或者某種條件下調用API會出錯的。那麼這些出錯的原因是什麼呢?通常只擷取到錯誤碼,也就是通過函數GetLastError得到。當然可以根據這個錯誤碼去尋找MSDN就可以知道出錯的原因,但有時在客戶那裡並沒有MSDN,那麼就需要把調用API函數出錯的資訊顯示出來,或者寫到LOG裡去。這時就需要調用函數FormatMessage把出錯碼詳細原因顯示出來。 函數FormatMessage聲明如

Windows API一日一練(55)FlushFileBuffers和SetFilePointer函數

在PC硬體體繫結構裡,速度最快的儲存空間是CPU裡面的寄存器,接著到二級緩衝,再到系統RAM記憶體,最後才到硬碟。由於這樣的體繫結構,就決定了作業系統對檔案的操作方式,或者說是最佳化的演算法。比如作業系統接收到寫檔案的資料時,就會先把資料儲存到RAM裡,然後在合適的時間或者合適的資料量時再寫到硬碟裡。但有時候我們希望資料一定要儲存到硬碟裡,而不是儲存在RAM裡,這時就需要使用函數FlushFileBuffers來把RAM裡的資料儲存到硬碟裡。檔案的結構是一個有序的隊列,有頭有尾,當讀寫檔案後,就

Windows API一日一練(58)FindFirstFile和FindNextFile函數

在開發軟體的過程裡,經常需要維護目錄裡的資料。比如在開發銀行的信用卡系統裡,由於每天建立的LOG非常多,那麼一個很大的硬碟,在6個月後,就佔用了很多空間。這時就有這樣的一個需求,把所有超過6個月的LOG資料定期刪除掉。要實現這個功能就得遍曆整個目錄,把檔案名稱和檔案建立的時間都超過6個月時間的檔案刪除掉。因此,就需使用到下面的API函數FindFirstFile和FindNextFile來實現這樣的功能,FindFirstFile函數是尋找到目錄下的第一個檔案或目錄,FindNextFile函數

Windows API一日一練(52)GetCurrentDirectory和SetCurrentDirectory函數

在開發軟體裡,常常碰到要讀取目前的目錄下的配置參數檔案,或者開啟目前的目錄下別的程式來運行,那麼就需要擷取當前進程的目錄位置,這就需要使用函數GetCurrentDirectory擷取當前進程所有在的目錄。同時也可以使用SetCurrentDirectory函數來改變進程的目前的目錄。 函數GetCurrentDirectory和SetCurrentDirectory聲明如下: WINBASEAPIDWORDWINAPIGetCurrentDirectoryA(    __in DWORD

Windows API一日一練(67)SetTimer和KillTimer函數

在前面介紹了一對定時器的API函數使用,現在又介紹另外一對API函數的使用。它使用起來比前的函數要簡單一些,但它一般是使用到有視窗的程式裡,並且它的精度也沒有前面的API函數高,對於一些要求不高的場合還是非常合適的。它是採用訊息通知的方式,每當定時到了就會收到一條訊息。 函數SetTimer和KillTimer聲明如下: WINAPISetTimer(    __in_opt HWND hWnd,    __in UINT_PTR nIDEvent,    __in UINT uElapse, 

Windows API一日一練(47)CreateSemaphore和ReleaseSemaphore函數

在開發軟體的過程中,多線程的程式往往需要實現相互連訊,比如幾個線程添加一個訊息到隊列裡,而另一個線程在睡眠時,就需要喚醒那個線程來處理事情。在這其中,就需要使用到訊號量來進行同步。CreateSemaphore是建立訊號量,ReleaseSemaphore是增加訊號量。 函數CreateSemaphore和ReleaseSemaphore聲明如下:WINBASEAPI__outHANDLEWINAPICreateSemaphoreA(    __in_opt

Windows API一日一練(59)CreateFileMapping和MapViewOfFile函數

在開發軟體過程裡,也經常碰到進程間共用資料的需求。比如A進程建立計算資料,B進程進行顯示資料的圖形。這樣的開發方式可以把一個大程式分開成獨立的小程式,提高軟體的成功率,也可以更加適合團隊一起開發,加快軟體的開發速度。下面就來使用檔案對應的方式進行共用資料。先要使用函數CreateFileMapping來建立一個想共用的檔案資料控制代碼,然後使用MapViewOfFile來擷取共用的記憶體位址,然後使用OpenFileMapping函數在另一個進程裡開啟共用檔案的名稱,這樣就可以實現不同的進程共用

Windows API一日一練(51)CreateDirectory和RemoveDirectory函數

在資訊爆炸的年代裡,把各種資訊分類已經是一種非常必要的功能,比如把股票行情資料儲存到硬碟裡,就需要分開幾個目錄儲存。比如你寫LOG到硬碟時,也需要分成幾個目錄來儲存,這樣讓維護人員很好地找到出錯的資訊,或者有用的資訊。像我在開發銀行的信用卡系統時,就需要把所有通過網路傳送的資料全部產生文字檔儲存到當日的目錄裡,也就是說每天都需要建立一個目錄,把所有交易的資料產生LOG儲存進去。那麼面對這樣的需求,你是怎麼樣去建立目錄的呢?這就需要使用到Windows

Windows API一日一練(66)CreateWaitableTimer和SetWaitableTimer函數

使用者感覺到軟體的好用,就是可以定時地做一些工作,而不需要人蔘與進去。比如每天定時地升級病毒庫,定時地下載電影,定時地更新遊戲裡的人物。要想實現這些功能,就可以使用定時器的API函數CreateWaitableTimer和SetWaitableTimer來實現了,這對API函數建立的時鐘是比較精確的,可以達到100倍的10億分之一秒。 函數CreateWaitableTimer和SetWaitableTimer聲明如下: WINBASEAPI__outHANDLEWINAPICreateWait

Windows API一日一練(45)CreateEvent和SetEvent函數

當你建立一個線程時,其實那個線程是一個迴圈,不像上面那樣只運行一次的。這樣就帶來了一個問題,在那個死迴圈裡要找到合適的條件退出那個死迴圈,那麼是怎麼樣實現它的呢?在Windows裡往往是採用事件的方式,當然還可以採用其它的方式。在這裡先介紹採用事件的方式來通知從線程運行函數退出來,它的實現原理是這樣,在那個死迴圈裡不斷地使用WaitForSingleObject函數來檢查事件是否滿足,如果滿足就退出線程,不滿足就繼續運行。當線上程裡運行阻塞的函數時,就需要在退出線程時,先要把阻塞狀態變成非阻塞狀

Windows API一日一練(15)PostQuitMessage函數

自然介面裡,各種生物都是有其生命週期的。程式也是有其生命週期的,建立時就是它出生了,當它運行工作中就是成年期,最後少不了要死亡的,那麼程式的死亡是怎麼樣出現的呢?像以前介紹函數GetMessage裡是使用一個迴圈不斷地檢測訊息,周止復始的,是不可能出現死亡的,但它會檢測到訊息WM_QUIT就退出來。那現在問題是誰發送WM_QUIT訊息出來呢?這就是PostQuitMessage函數所做的工作。當你點擊視窗右上方的關閉時,Windows就會把視窗從系統裡刪除,這時就會發出訊息WM_DESTROY給

Windows API一日一練(46)EnterCriticalSection和LeaveCriticalSection函數

多個線程操作相同的資料時,一般是需要按順序訪問的,否則會引導資料錯亂,無法控制資料,變成隨機變數。為解決這個問題,就需要引入互斥變數,讓每個線程都按順序地訪問變數。這樣就需要使用EnterCriticalSection和LeaveCriticalSection函數。 函數EnterCriticalSection和LeaveCriticalSection聲明如下: WINBASEAPIVOIDWINAPIEnterCriticalSection(    __inout

Windows API一日一練(50)SuspendThread和ResumeThread函數

作業系統對線程有幾種狀態的變化:執行,掛起和恢複執行。當線程做完任務或者現在想暫停線程運行,就需要使用SuspendThread來暫停線程的執行,當然恢複線程的執行就是使用ResumeThread函數了。這兩個函數使用很簡單的,下面就來看看例子是怎麼樣使用的。 函數SuspendThread和ResumeThread聲明如下:WINBASEAPIDWORDWINAPISuspendThread(    __in HANDLE hThread   

Windows API一日一練(56)SetEndOfFile和GetFileSizeEx函數

有一天,我正在開發BT軟體,它有這樣的一個功能,就是先把檔案的大小分配好,然後再慢慢地往裡面對應的位置寫入相應的資料。這樣的好處,就是可以先把磁碟空間佔用起來,以便後面的下載順利進行。要實現這個功能,就需要建立一個空的檔案,然後把檔案指標設定到相應大小的位置,然後再調用函數SetEndOfFile來設定檔案的結束位置,這樣檔案就有相應的大小了。在BT軟體的開發裡,也發現目錄的處理時需要詳細地記錄目錄裡的檔案大小,這就需要使用GetFileSizeEx函數來擷取檔案的大小。由於BT裡的視頻檔案比較

Windows API一日一練(53)CreateFile函數

在軟體的需求裡,把有用的資料儲存起來是非常重要的功能。比如每天的股票行情資料需要儲存起來,以便產生K線圖。比如遊戲用戶端的LOG需要儲存起,以便用戶端出錯時可以把LOG發送回來分析它出錯的原因。比如銀行每天進行交易時,也需要把所有交易的資料儲存到檔案備份起來,以便進行結算。還有在資料擷取領域更是需要儲存更多的資料,比如從DV裡讀取視頻和語音資料出來,就會產生12G的巨型檔案。比如讀DVD光碟片裡,把光碟片做成虛擬光碟機也有9G大小。因此,建立檔案是非常普通的功能,這個肯定是掌握,並且非常會使用的

Windows API一日一練(60)CreateIoCompletionPort和GetQueuedCompletionStatus函數

在Windows系統裡,使用完成連接埠是高效能的方法之一,比如把完成連接埠使用到線程池和網路伺服器裡。現在就通過線程池的方法來介紹怎麼樣使用完成連接埠,高效能的伺服器以後再仔細地介紹怎麼樣構造它。其實完成連接埠是一個隊列,所有的線程都在等訊息出現,如果隊列裡有訊息,就每個線程去擷取一個訊息執行它。先用函數CreateIoCompletionPort來建立一個訊息佇列,然後使用GetQueuedCompletionStatus函數來從隊列擷取訊息,使用函數PostQueuedCompletionS

總頁數: 1469 1 .... 145 146 147 148 149 .... 1469 Go to: 前往
Tags Index:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。