|
|
多線程編程一直是讓鄙人不愿提起的傷心往事。
需要太多的耐心,和足夠的編程基本功及對操作系統(tǒng)的了解。在運動控制編程中,有許多骨灰級編程高手,常對此故作深沉,一般會這樣回答: “呵呵,多線程編程,好哇,不錯…” 要是你再問他自己用不用多線程編程方法去作運動控制軟件,他會這樣說: “是啊,不過,好像用不著吧!”
若有幸得到他的耐心指導(dǎo),則省下許多為多線程付出的痛苦。我何嘗不曾經(jīng)歷…
當(dāng)然,多線程又不是絕癥,當(dāng)然有解決方法。故在您真的想動手之前聽聽下面的經(jīng)驗之談,或許有參考作用。
每一個進(jìn)程都含有一個主線程,若再開辟一個線程作某些事情,則至少為兩個或兩個以上的線程在作業(yè)。 下面引用名家言-----Gevorg Ter-Saakov(呵呵,是老外,我不認(rèn)識的)。
在多線程環(huán)境中存在一個潛在問題:就是創(chuàng)建多線程應(yīng)用程序時,有一個意外的優(yōu)化問題,會導(dǎo)致你的程序有不可預(yù)期的行為。 如果你定義了一些可以被兩個或兩個以上線程訪問的變量,則必須使用關(guān)鍵字volatile。否則,如果一個線程更改了變量,第二個線程不能注意到該變化,因為變量被優(yōu)化,編譯器可能使用一個CPU寄存器。 一般情況下,在調(diào)式模式下不會發(fā)生問題,在發(fā)行模式下,就可能導(dǎo)致行為不可預(yù)期。
根據(jù)以上的思想,回過頭來看看控制卡的編程。 一般控制卡的操作都含有一套動態(tài)庫,動態(tài)庫內(nèi)部定義的變量對于多線程的訪問就存在上述問題,而絕大部分動態(tài)庫在發(fā)布版中,都不會加上volatile關(guān)鍵字。以下面的形式為例:
void GoToPoistion( long nPulse )//指定移動絕對位置 { d3000_start_t_move( XCH, nPulse-d3000_get_command_pos(0), speed ); }
d3000_start_t_move為DMC3000控制卡的相對移動函數(shù) d3000_get_command_pos為DMC3000控制卡讀取指令位置函數(shù)。
當(dāng)脈沖距離發(fā)出時,客戶往往需要動態(tài)的以圖形方式顯示當(dāng)前位置,或者直接用文字顯示出來,若此實現(xiàn)在另一個多線程內(nèi)是這樣的: char string[0x100]; sprintf( string, “Xposition=%ld”, d3000_get_command_pos(0)) ;
GetDlgItem( IDC_STATIC_MSG )->SetWindowText( string );//顯示到屏幕上
由此可見,d3000_get_command_pos在兩個線程當(dāng)中都被調(diào)用,它內(nèi)部則會訪問同一變量。故,在一定速度頻率下,或某一特定環(huán)境下,讀取出來的脈沖計數(shù)不可預(yù)期,顯示出來的圖形或坐標(biāo)位置也將出錯。
故,本人在《DMC3000控制卡的多任務(wù)編程》,對位置的讀取采用較為謹(jǐn)慎的態(tài)度。
多線程編程的同步問題也較為復(fù)雜,一時難以言盡,大凡以高手的見地,最好以簡單的方式作穩(wěn)定的事情,有興趣的朋友不妨閱讀一下DoEvents的實現(xiàn)還來得有效率一些。
|
|
狀 態(tài):
離線
公司簡介
產(chǎn)品目錄
|
|
公司名稱:
|
深圳市雷賽智能控制股份有限公司
|
聯(lián) 系 人: |
梁邦敏
|
電 話: |
755-26401178
|
傳 真: |
|
地 址: |
深圳市南山區(qū)登良路天安南油工業(yè)區(qū)2棟3樓 |
郵 編: |
518000 |
主 頁: |
|
|
|
|
|