1. 程式人生 > >基於VB 實時資料採集與處理的多執行緒設計

基於VB 實時資料採集與處理的多執行緒設計

0 引言
 在多種視覺化程式語言中,VB 具有介面設計功
能強的特點 ,選擇它作為開發平臺 ,可以快速地建立
應用程式。該特點使其在測控系統的資料採集和處
理中應用比較廣泛 ,但是在資料實時處理時 ,往往出
現執行操作介面的選單命令明顯反應變慢 ,操作不
便 ,實時監控資料時引發了程式阻塞。導致此問題
的原因是僅通過一個任務體系解決大資料量的實時
傳輸與處理 ,而應用多執行緒的程式設計思想 ,把實時資料
的採集與介面的操作通過不同的執行緒來完成 ,就會
解決此問題。然而 ,用 VB 開發多執行緒的實時資料
採集與處理系統有一定的難度。筆者系統地論述了
VB 的多執行緒設計 ,建立了相應的演算法 ,結合數控壓
力校驗系統 ,給出了設計的流程 ,並通過例項說明多
執行緒演算法的可行性。
1 程序與執行緒
 Windows 作業系統既支援多程序 ,又支援多線
程。程序是應用程式的一次執行 ,每個程序是由私有的虛擬地址空間、程式碼、資料和其他系統資源組成
的。而執行緒是比程序更小的能獨立執行的基本單
位 ,是程序的執行路徑 ,它包含獨立的堆疊和 CPU
暫存器狀態 ,每個執行緒是程序內部的可執行路徑 ,是
程序的執行單元。從根本上說 ,執行緒是可由系統調
度的最簡單程式碼單元 ,負責執行包含在程序的地址
空間中的程式程式碼。一個程序一般都要有一個線
程 ,叫做主執行緒 ,程序也可以包括多個執行緒 ,所有屬
於該程序的執行緒都共享程序的資源 ,如 CPU、地址空
間以及物件控制代碼等。
在多執行緒程式中 ,每一個執行緒都有自己的堆疊 ,
並獨立於應用程式內的其他執行緒而執行 ,多個執行緒
可以同時執行。利用多執行緒機制可以實現程序內的
各個子任務並行執行 ,從而提高系統的實時效能。
把實時資料的讀取與處理資料的介面操作交給不同
的兩個執行緒併發執行 ,即可解決上面提到的問題。
多執行緒模式的工作原理和程式設計機制對於 VB 並
不完全適合 ,在VB 中較少涉及到多執行緒的問題 ,這
是因為VB 並不具備執行緒安全性。通過 VB 實現多
執行緒應用程式時 ,應用程式必須滿足放棄使用者互動 ,
即不能有類似於視窗之類的使用者介面。因此不能用
VB 的串列埠通訊控制元件 MSComm 來進行實時資料的採
集 ,可以通過動態連結庫 DLL 的函式呼叫實現序列
通訊。
與VB 相比較 ,VC 的MFC 庫支援 Windows 所提
供的輔助執行緒和使用者介面執行緒 ,使用者介面執行緒通常
有視窗 ,因此它具有自己的訊息迴圈 ,這是 VB 所不
能及的。關於執行緒間通訊 ,VB 和VC 都可以通過全
局變數實現 ,但 VC 還可以利用執行緒同步技術來實
現。相比之下 ,VC 的多執行緒機制要比 VB 安全 ,功
能也強大。
2 VB 多執行緒的設計
 VB 多執行緒的建立需要在通用模組中宣告
Win32API 動態連結庫 ,而此動態連結庫具有建立線
程的函式 ,建立執行緒的流程圖如圖1 所示。

圖1 建立執行緒
 根據執行緒函式的地址定義執行緒體名 ,關於此線
程體的應用程式碼加入到公用模組中 ,由建立執行緒到
停止執行緒的流程如圖2 所示。
3 某壓力校驗系統實時資料採集與處理
 執行緒的設計
  壓力指示表、壓力變送器和壓力開關是工業上

圖2 實時資料採集與
處理執行緒工作流程

使用最為廣泛的儀表 ,工
業生產很多都是高溫高壓
的過程 ,且很多裝置處於
極限執行狀態。因此壓力
儀表的穩定性和準確性就
顯得尤為重要。此數控壓
力校驗系統按照無紙化管
理和網路共享來實現集壓
力測量、壓力儀表校驗、誤
差自動處理、校驗表格和
證書自動生成、歷史資料自動儲存和可分類查詢的
標準校驗系統。
311 建立實時資料採集與處理的執行緒演算法
  在通用模組中宣告建立執行緒的函式:
Public Declare Function Create Thread Lib″ker2
nel32″(ByVal 1pThreadAttributes As long , By Val dw2
StackSize As Long ,ByVal 1pStartAddress As Long ,ByVal
1pParameter As Any , ByVal dwCreationFlags As Long ,
1pThreadId As Long) As Long
引數含義:
1pThreadAttributes 如果傳遞 NULL ,該執行緒使用
預設安全屬性。如果希望所有的子程序能夠繼承該
執行緒物件的控制代碼 ,必須將它的 bInheritHandle 成員被
初始化為 TRUE。
dwStackSize 設定執行緒堆疊的地址空間。如果非
0 ,函式將所有的儲存器保留並分配給執行緒的堆疊。
如果是 0 ,Create Thread 就保留一個區域 ,並且將鏈
接程式嵌入. exe 檔案的/ STACK 連結程式 ,開關信
息指明的儲存器容量分配給執行緒堆疊。
1pStartAddress 執行緒函式的地址。
1pParameter 傳遞給執行緒函式的引數。
dwCreationFlags 如果是 0 ,執行緒建立後立即進行
排程。如果是 CREATE- SUSPENDED ,系統對它進行
初始化後暫停該執行緒的執行。
lpThreadId 用來存放系統分配給新執行緒的 ID。
接下來再宣告兩個 API 函式 ,是用來退出執行緒
的。
Public Declare Sub ExitThread Lib″kernel32″(ByVal
hThread As Long ,1pExitCode As Long) As Long
Public Declare Function GetExitCodeThread Lib″ker2
nel32″(ByVal dwExitCode As Long)
定義兩個變數 ,變數 hThread 是執行緒的控制代碼。
Dim hThread As Long ,idThread As Long
建立執行緒的程式碼如下:
Public Sub StartThread (ByVal i As Long)
 idThread = 0
 hThread = CreateThread ( 0 &, 0 &, AddressOf
thread1proc ,i &,0 &,idThread)
 If hThread = 0 Then MsgBox″建立執行緒失敗″
End Sub
停止執行緒的程式碼如下:
Public Function Stop Thread () As Long
  Do
 Call GetExitCodeThread (hThread ,StopThread)
  DoEvents
Loop While StopThread = STILL - ACTIVE
 CloseHandle hThread
 hThread = 0
End Function
在建立執行緒的程式碼中用了AddressOf 語法 ,所創
建的 線 程 從 thread1proc 處 開 始 , 線 程 體 名 是
thread1proc ,在公用模組中加入應用程式碼;
Public Function thread1proc () As Long
在此加入實時資料採集和處理的應用程式碼End Function
在除錯執行的時候應該注意 , 在編譯環境和
EXE 模式下效果會不同 ,在編譯模式下容易非法操
作。還有線上程中 ,不能用 DoEvents ,可以多次呼叫
StartThread 來達到多執行緒 ,區域性變數各自獨立。
312 實時資料採集與處理的實現
選擇四零四科技公司所出品的 Pcomm Pro 軟體
中的通訊用動態連結庫的DLL 檔案 Pcomm. dll 進行
串列埠通訊。首先要進行宣告 ,所宣告的函式包括通
信埠的開啟( sio - open) / 關閉( sio - close) 、傳輸參
數設定(sio - ioct1) 及硬體線路控制(sio - DTR) 等。
在VB 環境下使用 Pcomm Pro 函式庫先要引入函
數宣告,讓程式知道函式所在的位置。此通訊函式庫
已經預先準備了常用的模組,只要引入到所建立的工
程中即可。該程式用到的模組是 Pcomm. bas (常數定
義及函式宣告模組) ,當函式庫安裝後,這個模組就存
在於計算機中,將其複製到工程目錄中,在工程使用
中加入模組功能即可。部分重要的程式碼如下:
· 開啟 COM1 埠
Public Sub COMOpen ()
 Call sio - open (1)
 Call sio - ioct1 (1 ,B9600 ,BIT- 8)
End Sub
· 讀埠資料
Public Function COMRead () As Boolean
 Dim TT&
 Dim result As Long
 Dim ReceiveData (5) As Byte
 On Error Resume Next
 TT = GetTickCount ()
R0 :result = sio - read (1 ,ReceiveData (0) ,1)

If result = 0 Then
 If GetTickCount () - TT < = 1000 Then Go To

R0

End if
⋯⋯Eng Function
· 處理讀取資料並根據執行方式輸出:
 db1H = ReceiveData (3) ’高位元組
 db1L = ReceiveData (4) ’低位元組
 ReadData = db1H 3 256 + db1L
在程式設計時 ,要注意上位機與壓力錶之間的
通訊協議。其中波特率:9 600 bit/ s ;資料格式:1 位
起始位 ,8 位資料位 ,無校驗位 ,一位停止位;校驗和
演算法:校驗和 = 所發數求和除以 256 取餘。介面菜
單的操作放在主執行緒中 ,實現壓力儀表校驗、誤差自
動處理、校驗表格和證書自動生成、歷史資料自動存
儲和可分類查詢等功能。
4 結論
  通過在程序中建立一個新的執行緒實現實時資料
採集與處理,即構成獨立的分支 ,完善了 VB 多執行緒
處理任務的功能 ,在很大程度上簡化了程式的複雜
性 ,使VB 高效、快速以及強大的介面設計功能最大
程度上得到了應用。