時間:2008-04-21 13:11:00來源:zhangting
 圖1 操作系統(tǒng)以輪轉(zhuǎn)方式安排每個線程的CPU方式[/align]
多線程操作
線程的啟動 
    創(chuàng)建一個用戶界面線程,首先要從類CwinThread產(chǎn)生一個派生類,同時必須使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE來聲明和實現(xiàn)這個CwinThread派生類。 而后,根據(jù)需要重載該派生類的一些成員函數(shù)如ExitInstance()、InitInstance()、OnIdle()、PreTranslateMessage()等,最后啟動該用戶界面線程,調(diào)用AfxBeginThread()函數(shù)的一個版本:
    CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass,
    int nPriority = THREAD_PRIORITY_NORMAL,
    UINT nStackSize = 0,
    DWORD dwCreateFlags = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
    其中第一個參數(shù)為指向定義的用戶界面線程類指針變量,第二個參數(shù)為線程的優(yōu)先級,第三個參數(shù)為線程所對應(yīng)的堆棧大小,第四個參數(shù)為線程創(chuàng)建時的附加標(biāo)志,缺省為正常狀態(tài),如為CREATE_SUSPENDED則線程啟動后為掛起狀態(tài)。
    對于工作線程來說,啟動一個線程,首先需要編寫一個希望與應(yīng)用程序的其余部分并行運行的函數(shù)如exec(),接著定義一個指向CwinThread對象的指針變量*pThread,調(diào)用AfxBeginThread(exec,param,priority)函數(shù),返回值付給pThread變量的同時一并啟動該線程來執(zhí)行上面的exec()函數(shù),其中exec是線程要運行的函數(shù)的名字,也是上面所說的控制函數(shù)的名字,param是準(zhǔn)備傳送給線程函數(shù)exec的任意32位值,priority則是定義該線程的優(yōu)先級別,它是預(yù)定義的常數(shù)。
線程的終止
    終止線程有三種途徑,線程可以在自身內(nèi)部調(diào)用AfxEndThread()來終止自身的運行;可以在線程的外部調(diào)用BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode )來強(qiáng)行終止一個線程的運行,然后調(diào)用CloseHandle()函數(shù)釋放線程所占用的堆棧;第三種方法是改變?nèi)肿兞浚咕€程的執(zhí)行函數(shù)返回,則該線程終止。
線程的同步
    使用多線程開發(fā)用戶程序時,經(jīng)常需要協(xié)調(diào)兩種或多種動作,這種過程就稱作同步(Synchronization)。需要利用同步的原因是:(1)當(dāng)兩個或多個線程需要訪問一個共享的資源,而此資源一次只能被一個線程所使用; (2)當(dāng)一個線程正在等候由另一個線程所引起的事件。
    Win32操作系統(tǒng)提供了幾種同步對象允許線程來同步它們之間的行為。這些同步對象包括臨界區(qū)(criticalse ction)、互斥量(mutexe)、信號量(semaphore)和事件(event)等。
    (1)臨界區(qū)
    臨界區(qū)是一小段代碼,它要求在執(zhí)行以前取得對某些共享數(shù)據(jù)的獨占訪問權(quán)。
    (2)互斥量
    互斥和臨界區(qū)非常相似,只不過它們可被用來同步多個進(jìn)程間的數(shù)據(jù)訪問。
    (3)信號量
    信號量內(nèi)核對象用于系統(tǒng)的資源計數(shù)。它們?yōu)榫€程提供了查詢可用資源數(shù)目的能力,對某個線程如果有一個或者多個資源可用,可用資源計數(shù)就減1。只有在資源計數(shù)加1之后,系統(tǒng)才會讓別的進(jìn)程訪問此資源。
    (4)事件
    事件對象是同步對象的最基本形式,它與互斥量和信號量大不相同?;コ饬亢托盘柫客ǔS脕砜刂茖?shù)據(jù)的訪問,但事件是用來發(fā)信號以表示某一操作己經(jīng)完成。
壓藥機(jī)控制系統(tǒng)多任務(wù)的實現(xiàn)
線程的分配
    由于軟件的工作比較復(fù)雜,軟件設(shè)計時采用了4個線程完成。除了第一個主界面線程外還有執(zhí)行線程、顯示線程、A/D轉(zhuǎn)換監(jiān)視線程。
1.主線程的主要功能:
(1)創(chuàng)建兩個定時器,一個為50ms Windows定時器,其功能是向顯示線程發(fā)送消息,驅(qū)動顯示線程,另一個為20ms多媒體定時器,功能是向執(zhí)行線程發(fā)送消息,驅(qū)動執(zhí)行線程。
(2)主線程產(chǎn)生一個用戶線程,用于監(jiān)視A/D轉(zhuǎn)換事件。
(3)接收用戶從鍵盤輸入的信息,執(zhí)行相應(yīng)過程。
主線程流程圖如圖2所示。
[align=center]
圖1 操作系統(tǒng)以輪轉(zhuǎn)方式安排每個線程的CPU方式[/align]
多線程操作
線程的啟動 
    創(chuàng)建一個用戶界面線程,首先要從類CwinThread產(chǎn)生一個派生類,同時必須使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE來聲明和實現(xiàn)這個CwinThread派生類。 而后,根據(jù)需要重載該派生類的一些成員函數(shù)如ExitInstance()、InitInstance()、OnIdle()、PreTranslateMessage()等,最后啟動該用戶界面線程,調(diào)用AfxBeginThread()函數(shù)的一個版本:
    CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass,
    int nPriority = THREAD_PRIORITY_NORMAL,
    UINT nStackSize = 0,
    DWORD dwCreateFlags = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
    其中第一個參數(shù)為指向定義的用戶界面線程類指針變量,第二個參數(shù)為線程的優(yōu)先級,第三個參數(shù)為線程所對應(yīng)的堆棧大小,第四個參數(shù)為線程創(chuàng)建時的附加標(biāo)志,缺省為正常狀態(tài),如為CREATE_SUSPENDED則線程啟動后為掛起狀態(tài)。
    對于工作線程來說,啟動一個線程,首先需要編寫一個希望與應(yīng)用程序的其余部分并行運行的函數(shù)如exec(),接著定義一個指向CwinThread對象的指針變量*pThread,調(diào)用AfxBeginThread(exec,param,priority)函數(shù),返回值付給pThread變量的同時一并啟動該線程來執(zhí)行上面的exec()函數(shù),其中exec是線程要運行的函數(shù)的名字,也是上面所說的控制函數(shù)的名字,param是準(zhǔn)備傳送給線程函數(shù)exec的任意32位值,priority則是定義該線程的優(yōu)先級別,它是預(yù)定義的常數(shù)。
線程的終止
    終止線程有三種途徑,線程可以在自身內(nèi)部調(diào)用AfxEndThread()來終止自身的運行;可以在線程的外部調(diào)用BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode )來強(qiáng)行終止一個線程的運行,然后調(diào)用CloseHandle()函數(shù)釋放線程所占用的堆棧;第三種方法是改變?nèi)肿兞浚咕€程的執(zhí)行函數(shù)返回,則該線程終止。
線程的同步
    使用多線程開發(fā)用戶程序時,經(jīng)常需要協(xié)調(diào)兩種或多種動作,這種過程就稱作同步(Synchronization)。需要利用同步的原因是:(1)當(dāng)兩個或多個線程需要訪問一個共享的資源,而此資源一次只能被一個線程所使用; (2)當(dāng)一個線程正在等候由另一個線程所引起的事件。
    Win32操作系統(tǒng)提供了幾種同步對象允許線程來同步它們之間的行為。這些同步對象包括臨界區(qū)(criticalse ction)、互斥量(mutexe)、信號量(semaphore)和事件(event)等。
    (1)臨界區(qū)
    臨界區(qū)是一小段代碼,它要求在執(zhí)行以前取得對某些共享數(shù)據(jù)的獨占訪問權(quán)。
    (2)互斥量
    互斥和臨界區(qū)非常相似,只不過它們可被用來同步多個進(jìn)程間的數(shù)據(jù)訪問。
    (3)信號量
    信號量內(nèi)核對象用于系統(tǒng)的資源計數(shù)。它們?yōu)榫€程提供了查詢可用資源數(shù)目的能力,對某個線程如果有一個或者多個資源可用,可用資源計數(shù)就減1。只有在資源計數(shù)加1之后,系統(tǒng)才會讓別的進(jìn)程訪問此資源。
    (4)事件
    事件對象是同步對象的最基本形式,它與互斥量和信號量大不相同?;コ饬亢托盘柫客ǔS脕砜刂茖?shù)據(jù)的訪問,但事件是用來發(fā)信號以表示某一操作己經(jīng)完成。
壓藥機(jī)控制系統(tǒng)多任務(wù)的實現(xiàn)
線程的分配
    由于軟件的工作比較復(fù)雜,軟件設(shè)計時采用了4個線程完成。除了第一個主界面線程外還有執(zhí)行線程、顯示線程、A/D轉(zhuǎn)換監(jiān)視線程。
1.主線程的主要功能:
(1)創(chuàng)建兩個定時器,一個為50ms Windows定時器,其功能是向顯示線程發(fā)送消息,驅(qū)動顯示線程,另一個為20ms多媒體定時器,功能是向執(zhí)行線程發(fā)送消息,驅(qū)動執(zhí)行線程。
(2)主線程產(chǎn)生一個用戶線程,用于監(jiān)視A/D轉(zhuǎn)換事件。
(3)接收用戶從鍵盤輸入的信息,執(zhí)行相應(yīng)過程。
主線程流程圖如圖2所示。
[align=center] 圖2 主線程流程圖[/align]
2.執(zhí)行線程負(fù)責(zé)執(zhí)行自動壓藥,及停止自動壓藥等功能,本程序的大部分工作由執(zhí)行線程完成。執(zhí)行線程流程圖如圖3所示。
[align=center]
圖2 主線程流程圖[/align]
2.執(zhí)行線程負(fù)責(zé)執(zhí)行自動壓藥,及停止自動壓藥等功能,本程序的大部分工作由執(zhí)行線程完成。執(zhí)行線程流程圖如圖3所示。
[align=center] 圖3 執(zhí)行線程流程圖[/align]
3.參數(shù)實時顯示線程負(fù)責(zé)實時顯示壓力值、保壓時間以及錯誤信息。
4. A/D轉(zhuǎn)換監(jiān)視線程用于監(jiān)視A/D轉(zhuǎn)換。
執(zhí)行線程的實現(xiàn)
    如圖3所示,在本系統(tǒng)軟件中執(zhí)行線程完成系統(tǒng)的大部分工作,執(zhí)行線程函數(shù)的定義如下:
  LRESUL
  CJmqyView::OnTimerProc(WPARAM wParam, LPARAM lParam)
 ?。?
  if( !bfPCL812PG ) //數(shù)據(jù)采集卡不存在
  return( 1 );
  InputFromPCL812PG(); //數(shù)據(jù)采集卡PCL-812PG 輸入操作
  if(inBit.start && !inBit0.start )//啟動按鈕按下
  OnStart();
  else if( inBit.stop && !inBit0.stop ) //停止按鈕按下
  OnStop();
  execTask();             //執(zhí)行任務(wù)
  OutputToPCL812PG();   //數(shù)據(jù)采集卡PCL-812PG 輸出操作
 ?。?
    某壓藥機(jī)控制系統(tǒng)有豐富的人機(jī)界面來接受用戶的鍵盤以及鼠標(biāo)操作,系統(tǒng)正是通過這些操作來完成整個控制系統(tǒng)的任務(wù)。當(dāng)控制系統(tǒng)啟動時,首先建立起主線程接受用戶的鍵盤、鼠標(biāo)操作,完成用戶的工藝參數(shù)的輸入,啟動A/D轉(zhuǎn)化監(jiān)視線程,同時主線程也創(chuàng)建兩個定時器用以驅(qū)動執(zhí)行線程、顯示線程。主線程相應(yīng)定時器發(fā)送的定時時間到達(dá)消息,并分別發(fā)送消息驅(qū)動執(zhí)行線程或顯示線程。顯示線程將壓藥機(jī)的實時壓力、及保壓時間呈現(xiàn)在用戶界面上,方便用戶的下一步操作。
結(jié) 語
    在傳統(tǒng)的DOS環(huán)境下開發(fā)的控制系統(tǒng)軟件為了實現(xiàn)并行多任務(wù),采用基于中斷的調(diào)度和循環(huán)輪流的方式,CPU的利用率較低,而在Windows環(huán)境下則可以利用Windows提供的多線程技術(shù),既可以方便的實現(xiàn)上述并行多任務(wù),又充分利用了CPU時間。實踐證明,采用多線程技術(shù)開發(fā)的某型壓藥機(jī)控制系統(tǒng)軟件,較好的保證了系統(tǒng)在多任務(wù)環(huán)境下的實時性和穩(wěn)定性。隨著工業(yè)控制系統(tǒng)的日益復(fù)雜,系統(tǒng)在同一時間所要執(zhí)行的任務(wù)不斷增加,多線程編程技術(shù)將會越來越明顯的體現(xiàn)出它的優(yōu)點。
參考文獻(xiàn):
1.  葛景國,陳立功,倪純珍,焊縫偏差實時監(jiān)控軟件的開發(fā)[J],算機(jī)工程,2004(4)
2.  何其昌,Windows下工控軟件的研制[J].制造業(yè)自動化,2002(24)
3.  鄭連清,劉榮,王玨,劉其坤,火工品壓藥工藝方法的改進(jìn)[J],火工品,1999(1)
4.  廖春蘭,基于多線程的實時測控系統(tǒng)研究[J].機(jī)電工程技術(shù),2006(35)
5.  邱仲潘,柯渝,謝燕華等,Visual C++6從入門到精通[M],電子工業(yè)出版社,2005
圖3 執(zhí)行線程流程圖[/align]
3.參數(shù)實時顯示線程負(fù)責(zé)實時顯示壓力值、保壓時間以及錯誤信息。
4. A/D轉(zhuǎn)換監(jiān)視線程用于監(jiān)視A/D轉(zhuǎn)換。
執(zhí)行線程的實現(xiàn)
    如圖3所示,在本系統(tǒng)軟件中執(zhí)行線程完成系統(tǒng)的大部分工作,執(zhí)行線程函數(shù)的定義如下:
  LRESUL
  CJmqyView::OnTimerProc(WPARAM wParam, LPARAM lParam)
 ?。?
  if( !bfPCL812PG ) //數(shù)據(jù)采集卡不存在
  return( 1 );
  InputFromPCL812PG(); //數(shù)據(jù)采集卡PCL-812PG 輸入操作
  if(inBit.start && !inBit0.start )//啟動按鈕按下
  OnStart();
  else if( inBit.stop && !inBit0.stop ) //停止按鈕按下
  OnStop();
  execTask();             //執(zhí)行任務(wù)
  OutputToPCL812PG();   //數(shù)據(jù)采集卡PCL-812PG 輸出操作
 ?。?
    某壓藥機(jī)控制系統(tǒng)有豐富的人機(jī)界面來接受用戶的鍵盤以及鼠標(biāo)操作,系統(tǒng)正是通過這些操作來完成整個控制系統(tǒng)的任務(wù)。當(dāng)控制系統(tǒng)啟動時,首先建立起主線程接受用戶的鍵盤、鼠標(biāo)操作,完成用戶的工藝參數(shù)的輸入,啟動A/D轉(zhuǎn)化監(jiān)視線程,同時主線程也創(chuàng)建兩個定時器用以驅(qū)動執(zhí)行線程、顯示線程。主線程相應(yīng)定時器發(fā)送的定時時間到達(dá)消息,并分別發(fā)送消息驅(qū)動執(zhí)行線程或顯示線程。顯示線程將壓藥機(jī)的實時壓力、及保壓時間呈現(xiàn)在用戶界面上,方便用戶的下一步操作。
結(jié) 語
    在傳統(tǒng)的DOS環(huán)境下開發(fā)的控制系統(tǒng)軟件為了實現(xiàn)并行多任務(wù),采用基于中斷的調(diào)度和循環(huán)輪流的方式,CPU的利用率較低,而在Windows環(huán)境下則可以利用Windows提供的多線程技術(shù),既可以方便的實現(xiàn)上述并行多任務(wù),又充分利用了CPU時間。實踐證明,采用多線程技術(shù)開發(fā)的某型壓藥機(jī)控制系統(tǒng)軟件,較好的保證了系統(tǒng)在多任務(wù)環(huán)境下的實時性和穩(wěn)定性。隨著工業(yè)控制系統(tǒng)的日益復(fù)雜,系統(tǒng)在同一時間所要執(zhí)行的任務(wù)不斷增加,多線程編程技術(shù)將會越來越明顯的體現(xiàn)出它的優(yōu)點。
參考文獻(xiàn):
1.  葛景國,陳立功,倪純珍,焊縫偏差實時監(jiān)控軟件的開發(fā)[J],算機(jī)工程,2004(4)
2.  何其昌,Windows下工控軟件的研制[J].制造業(yè)自動化,2002(24)
3.  鄭連清,劉榮,王玨,劉其坤,火工品壓藥工藝方法的改進(jìn)[J],火工品,1999(1)
4.  廖春蘭,基于多線程的實時測控系統(tǒng)研究[J].機(jī)電工程技術(shù),2006(35)
5.  邱仲潘,柯渝,謝燕華等,Visual C++6從入門到精通[M],電子工業(yè)出版社,2005標(biāo)簽:
                                 
                            
傳動網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為傳動網(wǎng)(www.surachana.com)獨家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉(zhuǎn)載使用時須注明來源“傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。
產(chǎn)品新聞
更多>2025-10-31
2025-10-22
2025-10-17
2025-10-11
「一體機(jī)性價比王者」NK290M普及型數(shù)控...
2025-10-09
2025-09-23