Windows下即時行式列印系統設計

來源:互聯網
上載者:User

眾所周知,Windows系統的頁式列印系統有許多好的特性,比如所見即所得 (WYSIWYG)、裝置無關等等。但是,在一些即時性要求很高的工業控制系統中,需要將系統隨機出現的資訊即時地列印出來,要求來一行打一行,而不能來一行打一頁,而Windows系統的頁式列印系統卻很難滿足這樣的應用需求。鑒於這個原因,為了滿足即時系統的列印要求,有必要設計一個新的即時行式列印系統。下面詳細介紹如何在Windows 2000/NT上實現這樣一個系統。

總體設計

即時系統的基本要求是即時性。本文採用以共用記憶體為中轉的列印假離線技術,所有的列印操作在記憶體中提交完成,保證了應用系統對列印操作的及時響應。

另一要求是裝置無關性,使提交列印的操作儘可能地做到與裝置無關。程式不會因為印表機裝置的不同,導致程式有較大的修改。如果印表機不同,只需載入相應的列印驅動程式即可。

總體上即時行式列印系統的設計分為兩個部分,一個是以記憶體為基礎的列印假離線部分的設計;另一個是即時列印驅動層部分的設計。系統的概要設計圖如下:

即時行列印假離線部分

這個部分的基本原理是使用一個基於共用記憶體技術的先入先出隊列,用來儲存其他應用程式提交的即時列印請求。列印進程從先入先出的環形隊列取出列印請求,經過必要的處理之後,提交給列印驅動部分,由列印驅動部分負責驅動相應的印表機輸出。

為滿足其他應用程式提交列印請求的需要,在此使用了Windows作業系統提供的共用記憶體技術。共用記憶體是進程之間通訊時用的一種技術,是一種更為標準、更為核心的技術,而且它在不同作業系統平台之間的移植性也比較好(Unix系列作業系統也有這種技術)。另一個好處是提高了即時效能,因為避免了多次記憶體複製的系統空間和時間上的開銷。

Windows系統中與建立共用記憶體相關的系統函數有CreateFileMapping和MapViewOfFile。

第一個函數用來在系統中建立一塊共用記憶體,並返回共用記憶體的控制代碼。其參數說明如下:

HANDLE WINAPI CreateFileMapping (
HANDLE hFile,
LPSECURITY _ATTRIBUTES lpsa,
DWORD dwPROTECT,
DWORD dwMaxSizeHigh,
DWORD dwMaxSizeLow,
LPCSTR lpszMapName);

hFile為檔案控制代碼,要建立共用記憶體,該參數必須為0xffffffff; lpsa為安全屬性結構指標; dwPROTECT是頁保護標識,如PAGE_READONLY,PAGE_READWRITE等; dwMaxSizeHigh和dwMaxSizeLow共同定義了共用記憶體的尺寸,分別為共用記憶體大小的高32位和低32位; lpszMapName定義了共用記憶體的名字,必須確保其在系統範圍內的惟一性。

第二個函數用來將建立的共用記憶體映射到調用進程的地址空間,並返回該地址空間的首地址。其參數說明如下:

MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap);
hFileMappingObject定義了CreateFileMapping

函數返回的共用記憶體控制代碼; dwDesiredAccess定義了共用記憶體的訪問模式,如:FILE_MAP_ALL_ACCESS

等; dwFileOffsetHigh和dwFileOffsetLow共同定義了共用記憶體起始位置的位移量,分別為該位移量的高32位和低32位,通常情況下二者都為零值; dwNumberOfBytesToMap定義了映射到本進程地址空間的共用記憶體的位元組數,如果該值為零,則映射所有的共用記憶體。

這裡定義即時列印系統所用共用記憶體的名字為g_szRealTimePrintSystemShareMemName。REALTIMEPRINT_DB是一個結構類型,定義了共用記憶體的內部結構,它是即時列印系統的資料核心,包括了要列印的資訊、寫入指標、讀出指標等資訊。 具體步驟如下(示意性代碼):

REALTIMEPRINT_DB *g_pRealTimePrint-
SystemDb ;
HANDLE hShareMemHandle = NULL;
DWORD dwRTPSShmLen = sizeof(REALTIMEPRINT_DB);
//REALTIMEPRINT_DB 結構的長度
hShareMemHandle =
//產生共用記憶體,並返回其控制代碼
CreateFileMapping((HANDLE)0xffffffff,NULL,PAGE_READWRITE,0,
dwRTPSShmLen, //共用記憶體的大小 “g_szRealTimePrintSystemShareMemName”);
g_pRealTimePrintSystemDb =
//將共用記憶體映射到本進程的地址空間
(REALTIMEPRINT_DB *)MapViewOfFile(hShareMemHandle,FILE_MAP_ALL_ACCESS,0,0,0);

相關文章

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.