多線程技術在校園“一卡通”系統中的應用
文章出處:http://www.nyfzw.net 作者: 人氣: 發表時間:2011年09月09日
⒈ 引言
校園“一卡通”系統為“數字化校園”提供了全面的數據采集網絡平臺,是“數字化校園”建設的重要組成部分和基礎工程。所謂“一卡通”,即在學校內,凡有現金、票證或需要識別身份的地方均采用卡來完成,它既是數字校園的數據信息存儲和處理中心,也是整個數字校園的核心引擎,是一個跨平臺、跨數據庫的可自我發展的數字化校園信息系統平臺,既可為學校已有的各管理系統建立接口,連接各個管理子系統,又可實現整個數字校園的數據無重復、無冗余的存儲與共享,真正實現“一卡在手,走遍校園”。
在校園“一卡通”系統中引入Delphi提供的多線程技術,使得系統程序結構更加合理,避免了程序運行時單一線程瓶頸所造成的系統資源的極大浪費,最大限度地提高了系統資源的存儲及共享效率。
⒉ 多線程編程
2.1 線程概述
線程(Thread)是個動態的對象,它是處理器調度的基本單位,表示進程中的一個控制點,執行一系列的指令。在操作系統中引入線程的概念,可減小并發執行的時間和空間開銷,允許通過在系統中建立更多更好的線程來提高并發性。
2.2 多線程編程技術
所有進程至少都擁有一個執行線程,我們稱該執行線程為主線程。在一個程序中,除了主線程之外,可能還創建有一個或更多的執行線程。通常,一個線程一旦創建即開始執行。
2.3 線程類的特性及方法
線程類包括FreeOnTerminate、Thandle、Priority、ReturnValue、 Suspended、Terminated、ThreadID等特性。
線程類主要包括DoTerminate過程、Execute過程、Resume過程、Suspend過程、Synchronize過程、Terminate過程等幾種方法。
⒊ 多線程編程在“一卡通”系統中的應用
在“一卡通”系統中有四個線程共同使用平臺服務器的資源一起工作,即:平臺服務器主線程、子系統流水處理線程、中間件接收子系統流水線程、中間件轉發收到的流水線程。
3.1 多線程技術在平臺服務器中的應用
當整個一卡通系統運作起來時,平臺服務器、中間件、接收流水線程同時運行,平臺服務器完成統計和查詢的任務,中間件實現與各個子系統之間數據的通信,接收子系統處理的數據并下發給其它子系統,接收流水的線程完成對各個子系統的數據處理,提交到中心數據服務器。
中間件接收子系統的流水,接收到后就轉發到其它子系統。子系統上傳來流水的處理,是通過流水處理線程單獨完成的。平臺服務器主程序不參與流水的處理,只上傳處理后的數據進行統計和查詢。子系統隨時有流水產生就隨時發送,中間件隨時接收,處理線程隨時處理,主程序就能隨時查詢到卡的消費情況。四個線程一起工作,保證整個“一卡通”的實時性、高效性。
3.2 多線程技術在子系統中的應用
在各個子系統的服務器中,同樣運行著子系統服務器線程、中間件發送線程、中間件接收線程和接收流水處理線程等四個線程。四個線程同時運行保證子系統與服務器數據同步。子系統產生流水,中間件發送,中間件接收平臺服務器發出的流水,處理線程對接收到的流水進行處理。多線程運行原理與平臺服務器是一樣的,實現方式略有不同。平臺服務器對上傳來的流水保存流水記錄,并修改帳戶余額,而在子系統中不保存流水記錄,只修改帳戶余額。
3.3 中間件的主要線程
中間(middleware)件是位于平臺(硬件和操作系統)和應用之間的通用服務,這些服務具有標準的程序接口和協議。針對不同的操作系統和硬件平臺,它們可以有符合接口和協議規范的多種實現。
在中間件服務器端靜態放置一個ServerSocet組件,用于提供動態分配客戶連接端口的代理服務。客戶端向服務器請求鏈接時,客戶端向服務器發請求連接。服務器端響應OnConn及OnAccept事件。客戶端連接服務器成功后,向服務器端發送分配新端口指令。服務器端在客戶機連接映射表中搜索此客戶機,有返回已分配的端口號,無分配一新的端口號。端口分配成功后,動態創建兩個ServerSocet組件,一個用于發送數據,一個用于接收數據。
線程主要語句如下:
Socket.ReceiveBuf(S_Buf, Socket.ReceiveLength); //取緩沖區數據
S_Num := CalculateCRC(S_Buf, Socket.ReceiveLength - 4);
if not ((S_NumBuf[0]=S_Buf[S_ReceiveLen-4])and
(S_NumBuf[1]=S_Buf[S_ReceiveLen-3])and (S_NumBuf[2]=S_Buf[S_ReceiveLen-2])and
(S_NumBuf[3]=S_Buf[S_ReceiveLen-1] )) then
begin //CRC校驗錯誤,退出
exit;
end;
if copy(S_Buf, 0, 5) = ‘00000’then
begin
S_ZIPCode := Trim(copy(S_Buf, 6, 5)); //工作站編碼
S_Host := Trim(copy(S_Buf, 11, 20)); //機器名稱
S_Addr := Trim(copy(S_Buf, 31, 15)); //IP地址
//查詢此客戶機器是否連接過服務器
S_ClientNO := G_ClientHostList.IndexOf(S_ZIPCode);
if S_ClientNO >= 0 then
begin
//找到,給客戶返回端口號碼等信息
S_Str := AddLeftZero(IntToStr(G_ServerSocketInfo[S_ClientNO].ServerUp.Port),5);
//客戶上傳端口
S_Str:=S_Str+AddLeftZero(IntToStr(G_ServerSocketInfo [S_ClientNO].ServerDown.Port), 5);
//下傳端口
OnSendBackClient(10033, ‘00001’, S_Str, Socket);
End;
Try
S_ClientNO := G_ClientHostList.Add(S_ZIPCode);
G_ServerSocketInfo[S_ClientNO].ServerDown :=
TServerSocket.Create(nil);
G_ServerSocketInfo[S_ClientNO].ServerUp :=
TServerSocket.Create(nil);
//客戶上傳端口
S_ClientPort := GetNewPort;
G_ServerSocketInfo[S_ClientNO].ServerUp.Port := S_ClientPort
//下傳端口
S_ClientPort := GetNewPort;
G_ServerSocketInfo[S_ClientNO].ServerDown.Port :=
S_ClientPort;
//開始監聽
G_ServerSocketInfo[S_ClientNO].ServerUp.Active := true;
G_ServerSocketInfo[S_ClientNO].ServerDown.Active := True;
except
OnSendBackClient(10038, ‘00002’, ‘90001’, Socket);
//服務器分配端口失敗
end;
OnSendBackClient(100033, ‘00001’, S_Str, Socket);
//服務器分配端口成功
End;
3.4 多線程技術實現的難點
雖然多線程可以提高系統效率,但存在很大的危險性。在程序編寫時一定要注意在多線程環境下運行可能會出現的情況:
(1) 當對某一帳戶進行把余額賦值成某個值的補貼操作時,其它子系統也有對這個帳戶的余額操作時,就會出現帳目上的不平衡。解決這個問題的辦法就是對余額的操作只能對加減不能直接賦值,這樣就避免了這個問題的出現。
(2) 當接收到流水和本地要同時對某個帳戶進行操作時,就會出現數據庫中帳戶余額表的某條記錄被鎖的情況。在接收流水的處理線程中,若一次處理不成功,可多處理幾次,等待本地釋放被鎖記錄。
⒋ 結束語
在“一卡通”系統中采用多線程編程技術,可以提高數據處理的速度,充分利用系統資源,有效提高整個“一卡通”系統的效率,實現整個數字校園的數據無重復、無冗余的存儲與共享,真正實現高度數據共享的數字化校園系統。
參考文獻:
[1] 王學敏.基于數字化校園的一卡通系統的設計與實現[D].廈門大學學報,2008.
[2] 張升平.數字化校園之校園一卡通的建設[J].重慶工商大學學報,2008,01.
收稿日期:2010-03-03
作者簡介:王玲(1965-),女,遼寧鞍山人,鞍山市第三中等職業技術專業學校高級講師。研究方向:計算機網絡。沈霞(1966-),女,遼寧鞍山人,遼寧科技大學計算機科學與工程學院副教授。研究方向:計算機網絡。