程序采用VisualC++的多線程編程來實現(xiàn)對數(shù)控雕銑機操作時實性和動態(tài)性要求。所謂線程是指一個獨立的過程,是系統(tǒng)分配處理器時間資源的基本單位。線程機制使得系統(tǒng)具有多任務(wù)功能,。
PCNC軟件系統(tǒng)一般執(zhí)行過程為:讀取處理后的NC文件→譯碼→軌跡插補計算→伺服控制,這樣一個基本的加工循環(huán),在未運行完最后一條NC語句前,該循環(huán)將一直進行,。如果應(yīng)用程序僅有一個線程即用戶界面線程,一旦程序執(zhí)行仿真,它將獨占CPU一直運行下去直到結(jié)束,無法接受和處理用戶消息和事件。也就無法實現(xiàn)實時性的要求,而多線程就可以解決這個問題,。
VisualC++中線程可分為用戶界面線程(UserInterfaceThread)和工作線程(WorkerThread),。用戶界面線程的特點是擁有單獨的消息隊列,具有自己的窗口界面能夠?qū)τ脩糨斎胧录拖⒆鞒鲰憫?yīng)。工作線程一般用于處理后臺任務(wù),僅由函數(shù)體實現(xiàn),不處理窗口消息,。采用多線程后,用戶界面線程主要用來顯示當(dāng)前指令,、更新狀態(tài)參數(shù)(X,Y,Z軸坐標(biāo)值,主軸進給速度、加工時間等),以及接受用戶輸入指令,。將實現(xiàn)仿真的程序放在一個工作線程中,。這樣盡管工作線程忙個不停,但用戶線程卻“空閑”可以隨時響應(yīng)用戶輸入事件和消息。用戶線程和工作線程之間通過事件對象Cevent來負責(zé)線程之間的通信,。
設(shè)置“暫停仿真”和“開始仿真”兩個按鈕,當(dāng)按下在“暫停仿真”后程序暫停用戶可以觀察指令和相應(yīng)狀態(tài);按下“開始仿真”后又斷點處重新開始執(zhí)行,。其實現(xiàn)的具體方法如下:在“暫停仿真”按鈕的單擊事件響應(yīng)函數(shù)中設(shè)置停止事件有信號,“開始仿真”按鈕的單擊事件響應(yīng)函數(shù)中設(shè)置啟動事件有信號,工作進程在循環(huán)體中檢測相應(yīng)事件是否有信號,從而執(zhí)行相應(yīng)的程序。需要做的工作是定義兩個事件停止事件和啟動事件,創(chuàng)建一個工作者線程,并建立工作線程的控制函數(shù)體,。其程序流程如圖2所示,。用戶界面線程和工作線程的狀態(tài)參數(shù)和圖象緩沖區(qū)首地址通過全局變量來傳遞。用戶界面線程首先建立圖象緩沖區(qū),將緩沖區(qū)初始化后,通過全局變量將緩沖區(qū)首地址和繪制圖象的窗口句柄傳遞給工作進程,。工作進程將譯碼后的數(shù)據(jù)轉(zhuǎn)化成圖像數(shù)據(jù),不斷刷新緩沖區(qū),調(diào)用MFC類庫中的CDC類BitBlt()來重繪屏幕,這樣就形成加工動畫過程,。在重繪屏幕時加入延時,這個延時由每條指令所走的步距總和和對應(yīng)插補的速度決定。通過比例延時可以較為精確地獲得實際加工時間,。
狀態(tài)參數(shù)的刷新則由WINDOW下計時器Timer實現(xiàn),在達到設(shè)定時間后由計時器Timer發(fā)出WM-TIMER系統(tǒng)消息到用戶界面線程消息隊列中,由其對應(yīng)的消息處理函數(shù)OnTimer來刷新狀態(tài)參數(shù),。