Powered By Blogger

關於我自己

我的相片
網站經營斷斷續續,現在以分享程式練習為主。 因為工作需要,不時會有練習程式的需要。 所以將自己練習的過程分享給大家。 如果有幫助到各位,那就太好了! 如果針對本人或網站內容有任何問題, 歡迎與我聯絡。

2016年7月30日 星期六

【VB.NET 語言】跨執行序作業無效 問題 (Invoke)

嗨!大家好,居裡貓今天要來跟大家分享一下之前寫小程式遇到的問題進而做的練習,
那就讓我們繼續看下去囉~~~
居裡貓之前在做一些程式作業練習的時候有遇到一些問題,
後來在網路上拜讀了一些先進的教學後,
就寫了這個小程式大略的說明一下問題,跟解決方法。


問題大概是這樣,假設我們今天要使用VB.NET來寫一個程式,
然後我們會用一個按鈕 Button 去控制表單上的 Label 來改變他顯示的 Text 值,
此時 Button Click 裡面又要使用執行序 Thread 來呼叫另一段程式去改變 Label  Text 值~

講的很清楚大家看的很模糊,那就先來看看小寫的小程式截圖吧~

首先是這個小程式的長相啦!!


看到長相大家應該可以稍稍理解我講的問題了吧~
要控制的就是中間那個 Label1 的 Text 值~
而左邊 "Wrong" 這個按鈕 Button 呢,就是會出現錯誤的按鈕,
錯誤之後會有這樣的訊息:



好,這個當然是我另外讓他跳出來的 MessageBox ,
那解決這個問題之後就可以安然的控制 Label1 的 Text 值啦~


就像這樣!居裡貓只是簡單的上他 +1 而已~

廢話那麼多接著就來看看大家關心的程式碼啦!
------------------------------------------------------------------------------------------------------------------------

  1. '接著就是從程式碼中了解大概做了什麼事情可以解決問題  
  2. '  
  3. Imports System.Threading  
  4. Public Class Form1  
  5. '要使用的東西就在這邊先定義好,變動的 count,使用的執行序 threadtest2  
  6.     Dim count As Integer = 0  
  7.     Dim threadtest2 As Thread  
  8.   
  9.     Private Sub labeltext()  
  10. '這段程式就是執行序委派工作的對象,嘗試去把 Label1 的 Text 值做改變  
  11.         Try  
  12.             count += 1  
  13.             Label1.Text = count  
  14.         Catch ex As Exception  
  15.             MessageBox.Show(ex.Message.ToString)  
  16.         End Try  
  17.     End Sub  
  18.   
  19.     Private Sub Wrong_btn_Click(sender As Object, e As EventArgs) Handles Wrong_btn.Click  
  20. '這段就是 "Wrong" 按鈕啟動執行序的部分  
  21.         Try  
  22. '這邊有點特別的,執行序在這邊作定義,應該不會是主要問題點  
  23. '然後在這邊委派工作跟啟動執行序  
  24.             Dim threadtest As New Thread(AddressOf labeltext)  
  25.             threadtest.Start()  
  26.         Catch ex As Exception  
  27.             MessageBox.Show(ex.Message.ToString)  
  28.         End Try  
  29.     End Sub  
  30. '--------我是分割線,上面的部分是錯誤按鈕的內容,下面的部份成功按鈕的內容  
  31.   
  32.     Private Sub Correct_btn_Click(sender As Object, e As EventArgs) Handles Correct_btn.Click  
  33.         Try  
  34. '這裡的執行序在最上面就定義好了 ,所以也是做委派工作跟啟動執行序  
  35.             threadtest2 = New Thread(AddressOf labeltext2)  
  36.             threadtest2.Start()  
  37.         Catch ex As Exception  
  38.             MessageBox.Show(ex.Message.ToString)  
  39.         End Try  
  40.     End Sub  
  41.   
  42.     Private Sub labeltext2()  
  43. '這邊的 If 判斷式就是可不可以成功的關鍵  
  44.         If Label1.InvokeRequired Then  
  45.             Me.Invoke(New MethodInvoker(AddressOf labeltext2))  
  46.         Else  
  47.             count += 1  
  48.             Label1.Text = count  
  49.         End If  
  50.     End Sub  
  51. End Class 

------------------------------------------------------------------------------------------------------------------------


以上就是居裡貓的分享介紹,對於程式語法的一些解釋、說明,
還請大家自己去查一下 MSDN 的說明比較正確!
那希望今天居裡貓這個小練習也可以幫助到大家!
也感謝網路上教學的先進們!
以上!





沒有留言:

張貼留言