14.使用VBNET創(chuàng)建應(yīng)用程序_第1頁(yè)
14.使用VBNET創(chuàng)建應(yīng)用程序_第2頁(yè)
14.使用VBNET創(chuàng)建應(yīng)用程序_第3頁(yè)
14.使用VBNET創(chuàng)建應(yīng)用程序_第4頁(yè)
14.使用VBNET創(chuàng)建應(yīng)用程序_第5頁(yè)
已閱讀5頁(yè),還剩58頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、使用使用VB.Net創(chuàng)建一個(gè)應(yīng)用程序創(chuàng)建一個(gè)應(yīng)用程序概述概述 使用我們之前保存的CogJobManager(CJM)可以在6個(gè)簡(jiǎn)單的步驟中開(kāi)發(fā)我們的應(yīng)用程序。 每個(gè)步驟將教您VisionPro編程的一個(gè)方面的內(nèi)容q步驟1:創(chuàng)建并且運(yùn)行最簡(jiǎn)單的應(yīng)用程序。q步驟2: 處理CJM“停止”事件。q步驟3: 正確地處理CJM 事件。q步驟4: 獲取CJM結(jié)果。q步驟5: 使用一個(gè)顯示控件。q步驟6: 執(zhí)行自定義行為。步驟步驟1 重要的事情先做重要的事情先做 打開(kāi)VisualStudio 2005 創(chuàng)建一個(gè)VB.NET Windows應(yīng)用程序并命名為 “VBSampleApp”。 添加參數(shù)到.NET 集:

2、qCognex.VisionPro 定義低級(jí)別對(duì)象qCognex.VisionPro.Core 更多低級(jí)別的東西qCognex.VisionPro.QuickBuild.Core CogJobManager 位于此處。步驟步驟1 回顧參數(shù)回顧參數(shù)我們?yōu)槭裁刺砑幽切﹨?shù)?因?yàn)槟仨毭鞔_地引用定義您想要使用的VisionPro類對(duì)象的任何集。您需要知道哪些集包含哪些對(duì)象。有兩種方式可以幫助您了解:q文件:每個(gè)類頁(yè)列出所需要的集。q常識(shí):用于斑點(diǎn)工具的對(duì)象在Cognex.VisionPro.Blob.dll中。用于斑點(diǎn)的控件在Cognex.VisionPro.Blob.Controls.dll中步驟

3、步驟1 名稱空間名稱空間記住所有.NET對(duì)象在名稱空間中定義 。例如,低級(jí)別的VisionPro對(duì)象在 Cognex.VisionPro名稱空間中。CogJobManager 位于Cognex.VisionPro.QuickBuild名稱空間中。要了解VisionPro名稱空間有多種方法:q文件:每個(gè)類頁(yè)列出所有的名稱空間。qVisualStudio 對(duì)象瀏覽器顯示所有的名稱空間。q常識(shí):用于斑點(diǎn)類和控件的名稱空間是Cognex.VisionPro.Blob。步驟步驟1 導(dǎo)入您的名稱空間導(dǎo)入您的名稱空間 我們將“導(dǎo)入”我們想要使用的對(duì)象的名稱空間。 這會(huì)減少輸入并且使得代碼更清潔。 在Visu

4、alStudio中打開(kāi)“Form1.vb”的代碼窗口并在頂部鍵入:Imports Cognex.VisionProImports Cognex.VisionPro.QuickBuildPublic Class Form1End Class步驟步驟1 聲明對(duì)象變量聲明對(duì)象變量 另外在您的 “Form1”類中鍵入三個(gè)實(shí)例變量的聲明:Public Class Form1 Private myJobManager As CogJobManager Private myJob As CogJob Private myIndependentJob As CogJobIndependentEnd Class

5、 很快將使用到這些變量。步驟步驟1 準(zhǔn)備加載一個(gè)文件準(zhǔn)備加載一個(gè)文件 復(fù)制AE_QBSample.vpp文件到您的“VBSampleApp”目錄下。 我們的應(yīng)用程序?qū)⒃陂_(kāi)始時(shí)加載該文件并且萃取所保存的CogJobManager。 以下為實(shí)現(xiàn)方法:q回到VisualStudio,切換標(biāo)簽到 GUI 設(shè)計(jì)器并在您的窗體上雙擊。q這會(huì)創(chuàng)建一個(gè)“Form1_Load()”方法,當(dāng)首次加載您的應(yīng)用程序時(shí)會(huì)調(diào)用。q在迅速?gòu)?fù)習(xí)事件操作者之后,我們會(huì)在該函數(shù)中加載我們的.vpp文件。步驟步驟1 復(fù)習(xí)事件操作者復(fù)習(xí)事件操作者記住 .NET事件允許對(duì)象在發(fā)生特殊事情時(shí)通知其他對(duì)象。事件作為一個(gè)函數(shù)調(diào)用來(lái)執(zhí)行。要接

6、受通知的對(duì)象必須:q定義一個(gè)方法在事件發(fā)生時(shí)調(diào)用。q為該“操作者”提供一個(gè)指針指向發(fā)出通知的對(duì)象。Form1_Load() 是一個(gè)事件操作者: 它處理窗體的加載事件。當(dāng)您在窗體上雙擊時(shí),VisualStudio自動(dòng)執(zhí)行必要的動(dòng)作:q定義Form1_Load()操作者,并且q告知窗體在加載時(shí)調(diào)用該方法。步驟步驟1 加載您的加載您的.vpp文件文件 現(xiàn)在讓我們填寫(xiě)新的操作者。 將以下代碼添加到Form1_Load: Depersist通過(guò)QuickBuild保存CogJobManagermyJobManager = CType(CogSerializer.LoadObjectFromFile( _

7、 .AE_QBSample.vpp), CogJobManager) 該代碼使用CogSerializer加載給定的.vpp文件作為一個(gè).NET對(duì)象。 我們知道返回的對(duì)象實(shí)際上是一個(gè)CogJobManager,而且我們?cè)趯⑵滟x予我們的局部變量之前使用 “CType” 將其適當(dāng)?shù)貜?qiáng)制轉(zhuǎn)換。步驟步驟1 變量初始化變量初始化 另外將以下代碼也添加到Form1_Load:myJob = myJobManager.Job(0)myIndependentJob = myJob.OwnedIndependent 第一行初始化變量“myJob”引用CogJobManager中的(并且只限)第一件工作。 第二行

8、初始化一個(gè)參數(shù)引用包含更多關(guān)于CogJobManager的信息的一個(gè)不同對(duì)象。 現(xiàn)在不必?fù)?dān)心“獨(dú)立的”東西。其為需要的但不是很重要。步驟步驟1 刷新所有刷新所有CJM隊(duì)列隊(duì)列 現(xiàn)在將以下代碼添加到Form1_Load: 刷新隊(duì)列myJobManager.UserQueueFlush()myJobManager.FailureQueueFlush()myJob.ImageQueueFlush()myIndependentJob.RealTimeQueueFlush() 這些行代碼清空所有CogJobManager隊(duì)列,刷新陳舊的圖像和結(jié)果。 將這些行作為樣板代碼處理:只是將它們逐字地添加到使用所

9、存儲(chǔ)的CogJobManager的任何應(yīng)用程序。 Form1_Load方法現(xiàn)在已經(jīng)完成 。步驟步驟1 完美地關(guān)閉完美地關(guān)閉在窗體加載時(shí)我們只是初始化了我們的CJM,現(xiàn)在當(dāng)關(guān)閉窗體時(shí)我們也需要關(guān)閉CJM。以下為操作步驟:q在VisualStudio中,從位于代碼窗口頂部的右手下拉框中選擇 “FormClosing”事件。q這會(huì)創(chuàng)建一個(gè)Form1_FormClosing方法,在關(guān)閉窗體時(shí)調(diào)用。q將以下代碼添加到方法中: 確信關(guān)閉了CogJobManager!myJobManager.Shutdown()將該代碼添加到使用CogJobManager的任何應(yīng)用程序。步驟步驟1 無(wú)聲的試驗(yàn)無(wú)聲的試驗(yàn) #

10、1現(xiàn)在您已經(jīng)建立一個(gè)加載所保存的CogJobManager并且能適當(dāng)?shù)仃P(guān)閉它的應(yīng)用程序。進(jìn)行實(shí)驗(yàn)時(shí):q在命令行中添加一個(gè)調(diào)用LoadObjectFromFile()的斷點(diǎn)。q運(yùn)行您的應(yīng)用程序。q(現(xiàn)在可以是調(diào)整任何編譯錯(cuò)誤的最佳時(shí)間。)q當(dāng)達(dá)到斷點(diǎn)時(shí),瀏覽“線程”窗口。q有多少線程?q將調(diào)試程序進(jìn)行到代碼的下一行。q現(xiàn)在您能看到多少線程?步驟步驟1 為什么能完美地關(guān)閉?為什么能完美地關(guān)閉? 正如您所看到的,CJM 建立了多個(gè)線程:CJM線程 您必須調(diào)用您必須調(diào)用CJM Shutdown()方法將它們適當(dāng)?shù)厍宄椒▽⑺鼈冞m當(dāng)?shù)厍宄?。掉。步驟步驟1 創(chuàng)建您的創(chuàng)建您的GUI運(yùn)行您的應(yīng)用程序?有點(diǎn)煩

11、,嗯?決不要運(yùn)行CJM。停止運(yùn)行應(yīng)用程序,添加一個(gè)“運(yùn)行一次(Run Once)”按鈕。以下為實(shí)現(xiàn)方法:q在VisualStudio中瀏覽 GUI設(shè)計(jì)器窗口。q 將一按鈕從工具箱的”常用控件”處拖到窗體上。q將按鈕的文本改為“運(yùn)行一次”。q修改按鈕的名稱為“運(yùn)行一次按鈕(RunOnceButton)”。q在按鈕上雙擊自動(dòng)生成RunOnceButton_Click 方法。步驟步驟1 添加按鈕代碼添加按鈕代碼 我們想要RunOnceButton_Click運(yùn)行的CogJobManager。 因此需要添加以下代碼:Try myJobManager.Run()Catch ex As Exception

12、 MessageBox.Show(ex.Message)End Try 注意使用一個(gè)Try/Catch代碼塊以確保錯(cuò)誤被適當(dāng)?shù)靥幚?。步驟步驟1 完成完成我們現(xiàn)在已經(jīng)完成了步驟1。我們建立了一個(gè)簡(jiǎn)單的應(yīng)用程序,使用我們保存的CJM并且可以自行運(yùn)行。運(yùn)行您的應(yīng)用程序來(lái)測(cè)試它。點(diǎn)擊“運(yùn)行一次”按鈕。享受成功帶來(lái)的喜悅吧?,F(xiàn)在盡可能快地點(diǎn)擊運(yùn)行一次按鈕注意您很快會(huì)從 “CogJobManager1”得到一個(gè)錯(cuò)誤。享受夠了吧。在步驟2中,我們將學(xué)習(xí)這是什么樣的錯(cuò)誤,以及使用來(lái)自CJM的事件來(lái)校正它。步驟步驟2 校正錯(cuò)誤校正錯(cuò)誤在步驟1中我們通過(guò)調(diào)用以下函數(shù)運(yùn)行我們的CJM: myJobManager.R

13、un()問(wèn)題在于我們忘記閱讀一下手冊(cè):qRun() 是一個(gè)非同步方法:它開(kāi)始運(yùn)行我們的工作并且立即返回。q如果您試圖運(yùn)行一個(gè)還沒(méi)有完成的工作,Run() 會(huì)拋出一個(gè)錯(cuò)誤。校正方法:我們的應(yīng)用程序應(yīng)該使得“運(yùn)行一次”按鈕失效,直到完成此前的運(yùn)行。要使得該按鈕失效,在調(diào)用Run()之前需添加以下這行代碼:RunOnceButton.Enabled = False步驟步驟2 CJM停止事件停止事件 當(dāng)所有工作已經(jīng)完成運(yùn)行時(shí),CJM啟動(dòng)一個(gè)“停止”事件。 當(dāng)該事件啟動(dòng)時(shí)我們將再次激活該按鈕。 以下為實(shí)現(xiàn)方法:q在我們級(jí)別的最后,鍵入以下停止事件的操作者:Private Sub myJobManager

14、_Stopped(ByVal sender As Object, _ ByVal e As CogJobManagerActionEventArgs) RunOnceButton.Enabled = TrueEnd Sub End Class步驟步驟2 注冊(cè)操作者注冊(cè)操作者 除了聲明我們的操作者之外,我們還必須確保我們的CJM能調(diào)用它。 按照以下方法注冊(cè)操作者:q在Form1_Load()的最后鍵入: 為停止事件注冊(cè)操作者 AddHandler myJobManager.Stopped, _ AddressOf myJobManager_StoppedEnd SubqAddHandler的第一

15、個(gè)參數(shù)是我們想要處理的事件。q其第二個(gè)參數(shù)是指向操作者的指針。步驟步驟2 注銷操作者注銷操作者 在關(guān)閉之前注銷CJM事件操作者總是個(gè)好主意。 按照以下方法注銷操作者:q在Form1_FormClosing()的頂部鍵入:為停止事件注銷操作者RemoveHandler myJobManager.Stopped, _ AddressOf myJobManager_Stopped 確保關(guān)閉CogJobManager!步驟步驟2 關(guān)于關(guān)于VB.NET的一個(gè)警告的一個(gè)警告一些VB用戶不使用添加/刪除操作者。VisualStudio為VB應(yīng)用程序中的事件提供不同的方法創(chuàng)建和注冊(cè)操作者。如果您聲明一個(gè)變量為

16、“WithEvents”,VisualStudio將顯示該對(duì)象可用的事件下拉列表。從列表中選擇一個(gè)事件將自動(dòng):q為其定義一個(gè)操作者,并且q注冊(cè)操作者和該對(duì)象。這種技巧很“容易”但是不允許您控制注冊(cè)或者注銷操作者的時(shí)間。在我們的應(yīng)用程序中,停止事件必須在關(guān)閉CogJobManager之前注銷。步驟步驟2 完成完成現(xiàn)在我們完成了步驟2。我們使用了CJM 停止事件確保用戶不會(huì)運(yùn)行工作,除非其已被停止。運(yùn)行您的應(yīng)用程序測(cè)試一下。點(diǎn)擊“運(yùn)行一次”按鈕。您會(huì)立即得到一個(gè)無(wú)效操作異常( InvalidOperationException )提示“交叉線程運(yùn)算無(wú)效” 。開(kāi)始對(duì)本課程的教員持有嚴(yán)重的懷疑。在步驟

17、3中我們將學(xué)習(xí)這是什么錯(cuò)誤以及如何使用標(biāo)準(zhǔn).NET函數(shù)來(lái)校正它。步驟步驟3 現(xiàn)在什么出錯(cuò)了呢?現(xiàn)在什么出錯(cuò)了呢?我們又一次忘記閱讀文件了。這次我們需要看看微軟的文件: qhttp:/ 校正大綱校正大綱Microsoft有一個(gè)標(biāo)準(zhǔn)技巧用于校正該問(wèn)題。以下為其工作的方法:q將其添加到您的停止事件操作者的頂部:If InvokeRequired Then 創(chuàng)建一個(gè)指針指向該函數(shù) 在正確的線程上調(diào)用同一個(gè)函數(shù) ReturnEnd Ifq很快我們將使用真實(shí)代碼替換注釋。q現(xiàn)在,注意“InvokeRequired”是每個(gè)控件的魔術(shù)屬性。如果您處于錯(cuò)誤的線程上它會(huì)返回到“正確( True)”。q如果我們處于

18、錯(cuò)誤的線程上,其計(jì)劃是切換到適當(dāng)?shù)木€程并且遞歸調(diào)用同一個(gè)函數(shù)。步驟步驟3 創(chuàng)建一個(gè)委托創(chuàng)建一個(gè)委托在.NET中有一個(gè)被稱為“委托(delegate)”的函數(shù)指針。在我們可以在正確的線程上調(diào)用我們的事件操作者之前,必須創(chuàng)建一個(gè)指向它的委托。以下為實(shí)現(xiàn)方法:q就在您的停止事件操作者之前添加該委托: 簽名必須匹配CJM事件的委托。Delegate Sub myJobManagerDelegate(ByVal sender As Object, _ ByVal e As CogJobManagerActionEventArgs)q這定義了一個(gè)有預(yù)期簽名的委托。q在您的事件操作者中適當(dāng)?shù)奈恢蒙蟿?chuàng)建該委托

19、的一個(gè)實(shí)例:創(chuàng)建一個(gè)指向該函數(shù)的指針Dim myDel As New myJobManagerDelegate( _ AddressOf myJobManager_Stopped)步驟步驟3 使用適當(dāng)?shù)木€程使用適當(dāng)?shù)木€程 我們最終的方法是在適當(dāng)?shù)木€程上調(diào)用我們的委托實(shí)例(即我們的事件操作者)。 以下為實(shí)現(xiàn)方法::q在您的事件操作者的正確地方添加以下這兩行代碼:在正確的線程上調(diào)用同一個(gè)函數(shù)Dim eventArgs() As Object = sender, eInvoke(myDel, eventArgs)q第一行為調(diào)用定義了一個(gè)數(shù)組參數(shù)。q第二行使用控件的魔術(shù)“調(diào)用( Invoke )”方法

20、在GUI線程上調(diào)用我們的委托。步驟步驟3 完成完成現(xiàn)在我們完成了步驟3。我們使用不到10行的代碼確保我們的按鈕只可由創(chuàng)建它的線程訪問(wèn)。我們使用的技巧是一個(gè)標(biāo)準(zhǔn)的微軟做法。您應(yīng)該徹底學(xué)習(xí)它,并且在GUI項(xiàng)目可能被非適當(dāng)線程調(diào)用的地方使用。運(yùn)行您的應(yīng)用程序測(cè)試一下。點(diǎn)擊“運(yùn)行一次”按鈕。注意不會(huì)有更多的錯(cuò)誤。對(duì)本課程開(kāi)始感覺(jué)好些了吧。在步驟4中我們將開(kāi)始讓我們的GUI更加有意思。步驟步驟4 優(yōu)化優(yōu)化GUI在步驟4中我們將以兩種方式更新GUI:q我們將添加一個(gè)“連續(xù)運(yùn)行”按鈕,并且q我們將在我們工作運(yùn)行時(shí)顯示其運(yùn)行狀態(tài)。我們先從“連續(xù)運(yùn)行”按鈕開(kāi)始。我們想要該按鈕在兩個(gè)狀態(tài)之間切換:“按下”和“未按

21、”。在“按下”狀態(tài)我們的CJM應(yīng)該處于運(yùn)行中,而在“未按”狀態(tài)我們的CJM應(yīng)該被停止。得到這一動(dòng)作的好辦法是使用復(fù)選框控件來(lái)制作該按鈕。步驟步驟4 連續(xù)運(yùn)行連續(xù)運(yùn)行以下為實(shí)現(xiàn)方法: 添加復(fù)選框:q在設(shè)計(jì)器中,將復(fù)選框拖放到您的窗體上。q修改“外觀”屬性為“按鈕”。q修改按鈕文本為“連續(xù)運(yùn)行”。q修改按鈕名稱為“運(yùn)行內(nèi)容檢驗(yàn)盒( RunContCheckBox )”。q在復(fù)選框上雙擊并且在其創(chuàng)建的“CheckedChanged”方法中鍵入下列各行代碼:If (RunContCheckBox.Checked) Then Try RunOnceButton.Enabled = False myJob

22、Manager.RunContinuous() Catch ex As Exception MessageBox.Show(ex.Message) End TryElse . . . 下頁(yè)幻燈片繼續(xù). . .步驟步驟4連續(xù)運(yùn)行(續(xù))連續(xù)運(yùn)行(續(xù))q繼續(xù)鍵入:另外 Try RunContCheckBox.Enabled = False myJobManager.Stop() Catch ex As Exception MessageBox.Show(ex.Message) End TryEnd If該代碼告訴我們CJM在復(fù)選框被勾選時(shí),執(zhí)行RunContinuous() 或者Stop() 。在我

23、們開(kāi)始運(yùn)行時(shí),它還使得“運(yùn)行一次”按鈕失效,而在我們等待CJM停止時(shí)使得“連續(xù)運(yùn)行”按鈕失效。步驟步驟4 連續(xù)運(yùn)行(結(jié)束)連續(xù)運(yùn)行(結(jié)束) 我們只需要再添加兩行代碼:q在停止事件操作者底部添加一行:RunOnceButton.Enabled = TrueRunContCheckBox.Enabled = True 在停止時(shí)激活q在RunOnceButton_Clicked方法添加另一行如下代碼:RunOnceButton.Enabled = FalseRunContCheckBox.Enabled = False 如果運(yùn)行就失效 我們的新按鈕已經(jīng)完成。 花一分鐘時(shí)間測(cè)試一下。步驟步驟4避免死鎖

24、避免死鎖 注意:我們現(xiàn)在可以在應(yīng)用程序運(yùn)行期間關(guān)閉它。 但很快如果用戶關(guān)閉正在運(yùn)行的應(yīng)用程序,我們添加的代碼將會(huì)死鎖。 要避免死鎖,我們將防止用戶在應(yīng)用程序運(yùn)行時(shí)關(guān)閉它。 在運(yùn)行時(shí),我們將刪除允許用戶關(guān)閉應(yīng)用程序的“X”按鈕。 以下為實(shí)現(xiàn)方法::q在RunOnceButton_Click() 中添加:ControlBox = FalseRunOnceButton.Enabled = Falseq在RunContCheckBox_CheckedChanged()中添加:ControlBox = FalseRunOnceButton.Enabled = Falseq在myJobManager_St

25、opped()中添加:ControlBox = True RunOnceButton.Enabled = True “ControlBox”是您窗體的一個(gè)屬性。它控件名稱欄按鈕是否可見(jiàn)。步驟步驟4 避免死鎖(續(xù))避免死鎖(續(xù))步驟步驟4 顯示運(yùn)行狀態(tài)(顯示運(yùn)行狀態(tài)( RunStatus )現(xiàn)在我們將更新 GUI顯示運(yùn)行狀態(tài)。在您的窗體上添加一個(gè)文本框控件,將其命名為“RunStatusTextBox”。現(xiàn)在GUI 可能看起來(lái)有如下圖:步驟步驟4 運(yùn)行狀態(tài)在使用者列隊(duì)中運(yùn)行狀態(tài)在使用者列隊(duì)中步驟步驟4 事件和線程處理事件和線程處理 我們要從使用者列隊(duì)中調(diào)取運(yùn)行狀態(tài)并在我們的新文本框中顯示。 這一

26、切必須在我們將要編寫(xiě)的新事件操作者中將進(jìn)行。 該操作者將用于UserResultAvailable事件。 什么線程會(huì)激活該事件? 什么線程被允許接觸文本框? 沒(méi)有關(guān)系。我們將不得不使用標(biāo)準(zhǔn)技巧避免交叉線程調(diào)用。步驟步驟4 編寫(xiě)操作者的代碼編寫(xiě)操作者的代碼在我們級(jí)別的最后,添加一個(gè)新操作者:Private Sub myJobManager_UserResultAvailable( _ ByVal sender As Object, _ ByVal e As CogJobManagerActionEventArgs) If InvokeRequired Then 創(chuàng)建一個(gè)指針指向該函數(shù) Dim m

27、yDel As New myJobManagerDelegate( _ AddressOf myJobManager_UserResultAvailable) 在正確的線程上調(diào)用同一個(gè)函數(shù) Dim eventArgs() As Object = sender, e Invoke(myDel, eventArgs) Return End IfEnd Sub End Class這確保適當(dāng)?shù)木€程處理(但是沒(méi)有作用)?,F(xiàn)在給操作者添加“真實(shí)”代碼:Dim topRecord As Cognex.VisionPro.ICogRecord = _ myJobManager.UserResultRunSta

28、tusTextBox.Text = _ topRecord.SubRecords(UserResultTag).Content & : _ & topRecord.SubRecords(JobName).Content & - _ & topRecord.SubRecords(RunStatus).Content.ToString在第一行調(diào)取下一個(gè)結(jié)果包。注意您必須完全給予ICogRecord資格。其他行代碼創(chuàng)建包含以下內(nèi)容的字符串:q結(jié)果包的序列號(hào),q公布該包的工作的名稱,以及q目標(biāo)運(yùn)行狀態(tài)(作為一個(gè)字符串)。該字符串被放置在文本框中。步驟步驟4編寫(xiě)操作者的代

29、碼(續(xù))編寫(xiě)操作者的代碼(續(xù))步驟步驟4 注冊(cè)操作者注冊(cè)操作者如以前一樣,我們需要注冊(cè)操作者:q在Form1_Load()的底部鍵入: 為UserResultAvailable事件注冊(cè)操作者 AddHandler myJobManager.UserResultAvailable, _ AddressOf myJobManager_UserResultAvailableEnd Sub按照以下方法注銷操作者:q在Form1_FormClosing() 中鍵入: 為UserResultAvailable事件注銷操作者 RemoveHandler myJobManager.UserResultAvai

30、lable, _ AddressOf myJobManager_UserResultAvailable 確保關(guān)閉CogJobManager! 現(xiàn)在我們完成了步驟4。 我們更新了我們的GUI使其更加“真實(shí)”。 我們學(xué)習(xí)了如何從使用者結(jié)果列隊(duì)獲得運(yùn)行狀態(tài) (以及其他信息)。 我們?cè)俅慰吹皆诰帉?xiě)GUI應(yīng)用程序代碼時(shí)必須細(xì)心考慮線程。 運(yùn)行您的應(yīng)用程序測(cè)試一下。 在步驟5中,我們將使GUI更好。步驟步驟4 完成完成在步驟5將通過(guò)添加一個(gè)顯示圖像的控件來(lái)改進(jìn)我們應(yīng)用程序的GUI。這將是我們第一個(gè)非微軟的控件。共有四個(gè) VisionPro顯示控件可供選擇:1)CogToolDisplay2)CogReco

31、rdsDisplay3)CogRecordDisplay4)CogDisplay讓我們看看它們每個(gè)都能做些什么。步驟步驟5 添加一個(gè)顯示控件添加一個(gè)顯示控件1)CogToolDisplay:這是您在QuickBuild中能夠看見(jiàn)的“標(biāo)準(zhǔn)”控件。 它是四個(gè)控件中最復(fù)雜的一個(gè)。它知道如何連接到VisionPro工具以及如何調(diào)取該工具的所有檢查記錄。它通過(guò)顯示區(qū)上方的一個(gè)下列框允許用戶選擇瀏覽哪些圖像記錄。步驟步驟5 CogToolDisplay2)CogRecordsDisplay:該控件看起來(lái)與CogToolDisplay相同。和CogToolDisplay一樣,它允許用戶通過(guò)下拉列表選擇一個(gè)圖

32、像記錄。而且和CogToolDisplay一樣, 它顯示所選圖像的任何圖形子記錄。但是它對(duì)VisionPro工具一無(wú)所知。該控件不能從相關(guān)的VisionPro工具獲得一 個(gè)CogRecords樹(shù);您必須使用編程的方法提供。步驟步驟5 CogRecordsDisplay3)CogRecordDisplay:該控件將顯示單個(gè)圖像記錄及其圖形的子記錄。該控件沒(méi)有下拉列表框,不允許用戶選擇圖像。CogRecordDisplay對(duì) VisionPro 工具一無(wú)所知。您必須為該控件提供一個(gè)包含單個(gè)圖像的CogRecord樹(shù)。步驟步驟5 CogRecordDisplay4)CogDisplay:CogDis

33、play是最低級(jí)別的顯示控件。由所有其他顯示控件來(lái)使用。該控件對(duì)VisionPro工具或 CogRecords一無(wú)所知。它不允許用戶選擇不同的圖像。該控件只顯示一個(gè)圖像和一組圖形。圖像和圖形必須通過(guò)編程來(lái)提供。步驟步驟5 CogDisplay 對(duì)于我們自定義的應(yīng)用程序我們將使用CogRecordDisplay。 沒(méi)有下拉框,因此我們的代碼將控制在顯示區(qū)顯示的內(nèi)容。 我們將顯示 “LastRun.CogFixtureTool1.OutputImage”記錄,因?yàn)樗芯嚯x圖形。 在VisualStudio中我們的第一步是引用包含我們控件的集: Cognex.VisionPro.Controls,

34、和Cognex.VisionPro.Display.Controls步驟步驟5 選擇選擇CogRecordDisplay步驟步驟5 添加添加CogRecordDisplay 現(xiàn)在:q將CogRecordDisplay拖放到窗體上。q在它正下方放置CogDisplayStatusBar。記住在關(guān)閉應(yīng)用程序時(shí)要處理所有VisionPro控件q在Form1_FormClosing() 底部添加: 明確地處理所有VisionPro控件 CogDisplayStatusBar1.Dispose() CogRecordDisplay1.Dispose()End Sub連接CogDisplayStatusB

35、ar 到顯示區(qū):q在Form1_Load() 的底部鍵入: 連接狀態(tài)欄 CogDisplayStatusBar1.Display = CogRecordDisplay1End Sub步驟步驟5 開(kāi)始編碼開(kāi)始編碼 在UserResultAvailable操作者的最后添加: Dim tmpRecord As Cognex.VisionPro.ICogRecord 假定所需記錄存在并且取得。 tmpRecord = topRecord.SubRecords(ShowLastRunRecordForUserQueue) tmpRecord = tmpRecord.SubRecords(LastRun)

36、 tmpRecord = tmpRecord.SubRecords(CogFixtureTool1.OutputImage) CogRecordDisplay1.Record = tmpRecord CogRecordDisplay1.Fit(True) End Sub 這些代碼進(jìn)入結(jié)果包取得我們想要的圖像記錄。 然后記錄被傳遞到顯示區(qū)。步驟步驟5 完成編碼完成編碼 現(xiàn)在我們完成了步驟5。 我們學(xué)習(xí)了顯示控件并在我們應(yīng)用程序GUI中添加了一個(gè)。 運(yùn)行您的應(yīng)用程序測(cè)試一下。 在步驟6中我們將添加更多的功能。步驟步驟5 完成完成步驟步驟6 定制您的應(yīng)用程序定制您的應(yīng)用程序 在VisualStudi

37、o中創(chuàng)建應(yīng)用程序的主要原因在于提供自定義動(dòng)作。 我們將定制我們的應(yīng)用程序這樣用戶可以從GUI中重新訓(xùn)練PatMax 模型。 我們將添加一個(gè)復(fù)選框式按鈕,允許用戶看見(jiàn)訓(xùn)練圖像并操縱訓(xùn)練區(qū)域。 我們將添加一個(gè)單獨(dú)的“重新訓(xùn)練”按鈕,可以在顯示訓(xùn)練圖像的時(shí)候按下。您已經(jīng)知道:每個(gè)Windows窗體控件只可以通過(guò)創(chuàng)建它的線程來(lái)訪問(wèn)。 在您執(zhí)行自定義動(dòng)作時(shí)您還必須記?。海◣缀酰┟總€(gè)VisionPro 對(duì)象每次只能由一個(gè)線程使用。例如,這意味著在視覺(jué)工具的工作運(yùn)行期間您不得試圖訪問(wèn)它。您不可以讀寫(xiě)屬性或者調(diào)用方法。這條規(guī)則的一個(gè)顯著例外是:CogJob和CogJobManager中的隊(duì)列可以“同時(shí)”由多個(gè)

38、線程使用。步驟步驟6 再說(shuō)說(shuō)線程再說(shuō)說(shuō)線程 我們需要確保我們的應(yīng)用程序遵守VisionPro的線程要求。 我們的計(jì)劃是確保用戶在應(yīng)用程序運(yùn)行期間不能重新訓(xùn)練PatMax圖案。 并且確保用戶在他們重新訓(xùn)練圖案時(shí)不能運(yùn)行應(yīng)用程序。 我們一次將只激活一組按鈕。步驟步驟6 關(guān)于線程關(guān)于線程 首先添加一個(gè)新的復(fù)選框到您的窗體上:q修改其“外觀”屬性為“按鈕”。q修改按鈕的文本為“顯示訓(xùn)練圖像”。q修改按鈕名稱為“顯示訓(xùn)練檢查盒( ShowTrainCheckBox )”。 另外還添加一個(gè)新按鈕到您的窗體上:q修改按鈕的文本為“重新訓(xùn)練”。q修改按鈕名稱為“ 再訓(xùn)練按鈕( RetrainButton )”

39、。q修改“激活”屬性為“錯(cuò)誤( False )”。 默認(rèn)狀態(tài)下我們已經(jīng)使得我們的重新訓(xùn)練按鈕失效。步驟步驟6 添加自定義按鈕添加自定義按鈕 現(xiàn)在我們來(lái)添加一些代碼,這樣我們的復(fù)選框在運(yùn)行CJM時(shí)會(huì)失效:q在RunOnceButton_Click()中添加:RunContCheckBox.Enabled = False Disable if runningShowTrainCheckBox.Enabled = Falseq在RunContCheckBox_CheckedChanged()中添加:RunOnceButton.Enabled = FalseShowTrainCheckBox.Enab

40、led = Falseq在myJobManager_Stopped()中添加:RunContCheckBox.Enabled = True Enable when stoppedShowTrainCheckBox.Enabled = True步驟步驟6 在運(yùn)行時(shí)失效在運(yùn)行時(shí)失效步驟步驟6 更多的按鈕邏輯更多的按鈕邏輯下一步,我們將確保用戶在他們?yōu)g覽訓(xùn)練圖像時(shí)不能運(yùn)行CJM。在“顯示訓(xùn)練圖像”復(fù)選框上雙擊并且添加以下代碼:If (ShowTrainCheckBox.Checked) Then RunOnceButton.Enabled = False RunContCheckBox.Enabled = False RetrainButton.Enabled = TrueElse RunOnceButton.Enabled = True RunContChec

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論