|
|
以愚人之見,運動控制的編程使用多任務確實令人不可理解,因本人的理論是在數(shù)控行業(yè)編程,越是簡單就越好操作。但既有客戶的需求,那也得進行編程測試一下,畢竟實踐出真知嘛。 從理論上講,Window比較大牌的編譯都是支持多任務編程(即多線程)。以下,為了使事情更簡化,本人從VC6.0環(huán)境下寫成一段小小代碼,配上一些注釋,望能了以解明。 本例程序基本思路是這樣的,開辟一個新的線程,在線程中不斷顯示位置。以下列出相關步聚:
1、在可視類(如Cdialog)聲明兩個變量 CWinThread *pThread; //線程變量 BOOL bActive; //狀態(tài),用于終止線程
2、給變量初始化,至于構(gòu)造函數(shù)中 pThread = NULL; bActive = FALSE; 3、在初始化控制成功后,分配并激活線程工作 以下部分是在OnInitDialog()中完成的 if( d3000_board_init() <= 0 ) MessageBox(Fail initial ); Else { pThread = AfxBeginThread( //創(chuàng)建一個線程 (AFX_THREADPROC)TaskFunc, //這是線程的工作內(nèi)容,一個函數(shù)指針 (LPVOID)&m_hWnd, //傳入當前可視類的句柄 THREAD_PRIORITY_NORMAL,//優(yōu)先級正常 0, //無堆棧 CREATE_SUSPENDED//線程被創(chuàng)建時即刻掛起 ); if( pThread != NULL ) { bActive = TRUE;//允許線程工作 pThread->ResumeThread();//開始工作 } } 若需要更多了解AfxBeginThread函數(shù),可參見MSDN說明
4、為線程分配一個工作 這個工作就是讀取板卡的位置,注意此函數(shù)為靜態(tài)函數(shù) UINT CTaskDlg::TaskFunc(LPVOID lParam) { CTaskDlg * pDlg = (CTaskDlg *)FromHandle(*((HWND *)lParam));//將句柄恢復成可視類 if( pDlg == NULL ) return 0;
static CString string; long nStart = ::GetTickCount(),nEnd(nStart); while( pDlg->bActive )//當bActive為FALSE工作結(jié)束 { nEnd = ::GetTickCount(); if( labs(nEnd - nStart) >= 100 )//100毫米刷新一次,因為線程執(zhí)行速度比定時要快很多,頻繁高速的刷新反而讓人看不清,要不去掉else continue即可。 { nStart = nEnd; } else continue;
string.Format("Position:%ld, %ld, %ld, %ld", long(d3000_get_command(0)), long(d3000_get_command(1)), long(d3000_get_command(2)), long(d3000_get_command(3))); //取得四軸的脈沖位置,并刷新到一個ID名為IDC_STATIC_COUNT控件上 pDlg->GetDlgItem( IDC_STATIC_POSITION )->SetWindowText( string ); } return 1; }
5、結(jié)束線程 此段代碼放置于OnDestroy()函數(shù)中 bActive=FALSE; //停止線程工作 delete pThread; //刪除線程(可以不需要此語句,創(chuàng)建線程時若不特別指定,線程會自動被刪除)。 d3000_board_close();//關閉控制卡須放大線程結(jié)束后,否則線程讀到的位置會不正確
6、后記補充 據(jù)我所知,要是用線程來作實時性強的過程控制將是個不錯的選擇,因為定時器的響應速度太慢,不及線程執(zhí)行速度快。若想更多了解過程控制編程的特點,可參見另一篇《過程控制編程探計》。
|
|
狀 態(tài):
離線
公司簡介
產(chǎn)品目錄
|
|
公司名稱:
|
深圳市雷賽智能控制股份有限公司
|
聯(lián) 系 人: |
梁邦敏
|
電 話: |
755-26401178
|
傳 真: |
|
地 址: |
深圳市南山區(qū)登良路天安南油工業(yè)區(qū)2棟3樓 |
郵 編: |
518000 |
主 頁: |
|
|
|
|
|