看板 Visual_Basic 關於我們 聯絡資訊
請輸入專案類型(網站專案或者應用程式專案):應用程式專案 因為希望我做的這個程式在執行模擬運算時 整個程式不要像當掉一樣沒有回應 也希望能看到執行的進度 不管是以後給人用還是我自己偵錯時都比較方便觀察 所以我弄了一個執行緒 專門執行這個可能會耗上長時間的運算 然後透過Delegate和判斷Me.InvokeRequired的值 將目前進度,以及要顯示的訊息使用Me.Invoke傳回到Form上顯示給使用者看 (因為原本直接修改控制項的值,會顯示跨執行緒存取的錯誤, 所以在網路上找到這個方法,可以解決這個跨執行緒存取的問題) 然後現在的問題是 假如在執行緒執行時,尚未結束前就關閉程式 就會留下一個沒有關閉的執行緒 還得要打開工作管理員手動關閉這個執行緒(的程式) 我試著在Form的關閉事件中 檢查執行緒的狀態之後,假如為執行中就使用.Abort的方法想關閉執行緒 但是此時就會出現錯誤,發生在我的Delegate連結的Sub中(還是應該要反過來說才對?) 錯誤內容是"無法存取已處置的物件" 看起來應該是表示說,因為我已經把Form1給關閉了 所以沒辦法執行它的Invoke方法? 我上網稍微看了一下關於執行緒的關閉處理 有看到一篇內容是說後面還要加上該執行緒的.Join方法 封鎖該執行緒,會比較容易關閉 但是這樣一來,執行緒好像會卡著無法關閉,雖然不會出現錯誤啦 我想問題沒有解決 應該還是卡在 無法在已關閉的Form上 執行.Invoke方法的問題上 想請問,有什麼方法可以正確的終止整個程式呢? -- 早先在練習寫可以透過TcpClient和TcpHost傳遞訊息的程式時 也是為了讓程式可以順暢點而使用了執行緒 結果也是遇上這個問題,執行緒沒有執行完成會沒法子正常終止 當時還沒有使用Delegate呢,情況單純多了 但是在Form的關閉事件中加入.Abort方法也是無法終止該執行緒 只是當時反正是自己寫有趣的,沒真的去解決這問題 現在不知怎麼解決了... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.163.87
Marty:我想可能是該Thread中有其他的物件還沒有正確的釋放.. 04/24 07:55
Marty:例如TcpClinet還沒有斷線之類的... 04/24 07:56