多線程就是這樣的。界面線程是主線程,你這個Form_Load就是運行在主線程上的線程,而Thread1,Thread2是由主線程啟動的。這個啟動不是線性的。
創新互聯主營左云網站建設的網絡公司,主營網站建設方案,重慶APP開發公司,左云h5小程序制作搭建,左云網站營銷推廣歡迎左云等地區企業咨詢
主線程只是通知系統,請啟動一個線程運行某某函數。
而哪個線程先運行完全在系統決定。甚至可能主線程執行到Thread1.Abort() ,Thread2.Abort()的時候這兩個線程都還沒有啟動起來,所以你會遇到兩個變量都是空值這種情況。
你可以在timer前用if判斷網絡狀態,
如斷開,可用
threading.Thread.Sleep(10000) ‘當前線程掛起10秒
’可以開一個新線程去讀取脫機數據。
如連接,則繼續執行。
補充:
dim i as integer
'超過100次退出,避免死循環
for i=0 to 100
try
'ping你的端口
if ‘ok
exit for
else
threading.Thread.Sleep(10000) ‘當前線程掛起10秒
end
Catch ex As Exception
End Try
next
Sub Main()
Dim thr As Thread
For Pi As Integer=0 To 4 //啟用5線程
MulParams =Pi vbTab sFile vbTab dFile vbTab 1 vbTab DelN vbTab cr vbTab cg vbTab cb vbTab IndexI
GlobalParamas(pi)=MulParams .Split(vbTab)
thr=New Thread(AddressOf MyMulThreadCaller)
thr.Start() //啟動多線程進程
Application.DoEvents
Next
End Sub
雖然你的想法是在 LoginBtn_Click 事件中將復雜的操作分離出去以減輕UI的負擔, 這很好完全沒有問題.
但是問題在于 Me.Invoke(dh)這里,若是ChkLogin里面仍然是大規模的操作呢 你的代碼就又變成將很復雜的操作扔給了UI, 當然會出現窗體無法拖動的情況了.
解決辦法很簡單, 很多種. 將ChkLogin()里的操作直接放在DelegateLogin()里面吧 me.invoke僅僅只是做簡單的輕量的刷新之類的操作就好了.
希望能幫上你的忙.
首先,你把你那些要運行很久的過程。盡量放在一個過程中。
因為線程只能是過程,不能使函數,沒有返回值的。
然后,在某個事件下這樣寫:
**這里我假設你的那個很就的過程叫做 sub aaa()
調用如下:
Dim mythread As New System.Threading.Thread(AddressOf aaa)
mythread.Start()
***********
這樣就是定義一個線程,名字叫 mythread,這個線程會運行aaa這個過程。
start 就是讓線程運行。
網站欄目:vb.net開啟新線程 C#啟動線程
文章網址:http://vcdvsql.cn/article20/hejjco.html
成都網站建設公司_創新互聯,為您提供虛擬主機、標簽優化、App設計、關鍵詞優化、響應式網站、外貿網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯