none
thread.abord例外 RRS feed

  • 一般討論

  • 我有form1 與form2

    form2 給他用另一個執行續跑(B.START)

    form2內容  是timer內含有大量sleep

    我form1內含有一個timer作為執行熱鍵的開關

    FORM1內容如下

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

    Try
                Dim key1 As Boolean
                key1 = GetAsyncKeyState(Keys.F10)
                If key1 = True Then
                    B.Abort()
                End If
            Catch ex As Exception


            End Try

    理論上這已經用try catch 把abort包起來了 為何建製出來的exe檔 執行後  依然會拋出例外

    就算改成下面這樣

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

    Try
                Dim key1 As Boolean
                key1 = GetAsyncKeyState(Keys.F10)
                If key1 = True Then
                    B.Abort()
                End If

    Catch exabort As System.Threading.ThreadAbortException

           

    Catch ex As Exception


            End Try

    都無法順利將例外做處理請問是位甚麼呢?


    2015年11月1日 下午 01:34

所有回覆

  • 您好,

    您可以參考msdn的用法哦!

    ThreadAbortException 類別


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2015年11月1日 下午 03:02
  • 你好,你可以用 Worker 和 Thread。

    先建立一個Worker,再建一個 Thread with Worker.DoWork,跟著便可以用 Thread.Start 和 Thread.Sleep,但現在你可以呼叫 Worker.RequestStop去停。

    例子在這

    https://msdn.microsoft.com/en-us/library/7a2f3ay4%28v=vs.90%29.aspx?f=255&MSPPError=-2147217396


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    2015年11月2日 上午 01:49
  • 程式會抛出什麼型態的例外?
    2015年11月2日 上午 02:31
  • 小弟我是用 vb.net寫的 不是c# 不好意思@@
    2015年11月2日 下午 01:06
  • System.Threading.ThreadAbortException: 執行緒已經中止。

    msdn上面是說一定會拋出這個例外達到中止線程的效果

    在vb debug會有例外發生 但不會跳出來

    建製的exe檔 就是會跳出例外  我利用try catch 包起來處理一樣會跳出來

    由於這個例外  不影響整個程式功能  

    但是跳出來沒點繼續  會導致執行緒沒結束(滑鼠事件依然還在執行)

    所以我才想能不能 自動把他忽略 

    就像vb debug模式一樣


    • 已編輯 garyl62327 2015年11月2日 下午 01:25
    2015年11月2日 下午 01:12
  • 這我之前有看到  今天又拿來研究 整個早上依然沒有成功 
    2015年11月2日 下午 01:17
  • 有這一行應該可以捕捉到ThreadAbortException, 不過您的程式好像有點複雜, Form1有Timer, Form2也有Timer, 會不會是Form2的Timer1_Tick事件處理程序也需要利用Try..Catch處理ThreadAbortException?
    2015年11月3日 上午 02:41
  • 試過囉  無法  依舊會拋出例外ThreadAbortException
    2015年11月3日 上午 10:19
  • Public Class Form1
    
     Dim a As Threading.Thread = New Threading.Thread(AddressOf test)
    
     Private Sub Start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Try
                a.Start()
            Catch ex As Exception
    
            End Try
        End Sub
    
    Public Sub test()
            Dim f2 As New Form2
            Application.Run(f2)
        End Sub
    
    
     Private Sub Abort_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
            Try
                a.Abort()
    
            Catch exa As System.Threading.ThreadAbortException
    
    
            Catch ex As Exception
    
            End Try
        End Sub
    End Class


    Public Class Form2 Private Sub TimerEnbled_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Enabled = True End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick PictureBox1.Left = PictureBox1.Left + 5 Threading.Thread.Sleep(1000) End Sub

    End Class

    換成這樣的解釋不曉得各位大大  能否更了解小弟的意思了

    按下form1  Start按鈕 執行新的執行緒 form2

    在form2 TimerEnbled按鈕還沒按下前按下Abort按鈕  

    測試還沒沒啟動form2的timer前是否正常

    確實可以關閉form2且不跳出例外

    =============================

    ok關閉程式從開  因為沒從開無法再次啟動執行緒

    這次

    按下form1  Start按鈕 執行新的執行緒 form2

    按下form2   TimerEnbled按鈕

    在按下form1 Abort按鈕

    狀況發生了  

    拋出ThreadAbortException例外

    按下繼續  即可繼續使用程式

    現在的目標就是 想要在timer執行的狀況下  將執行緒關閉且不跳出例外

    這只是舉例  所以別說把sleep拿掉  sleep拿掉也能執行沒錯但是我需要用到sleep達到暫停秒數



    • 已編輯 garyl62327 2015年11月3日 下午 01:51
    2015年11月3日 上午 11:50
    • 已編輯 阿尼 2015年11月3日 下午 12:53
    2015年11月3日 下午 12:53
  • 你誤會我意思了 竟然我form2內有timer 代表著我想要讓事件 一直重複執行

    我上面的例子是延遲1秒鐘

    如果我將他改程延遲5分鐘

    我就不可能使用timer.Enabled = False

    因為要等很久他才會結束tick事件

    更不可能使用定時器 因為該執行緒  已經被暫停5分鐘 要使用定時器也要等5分鐘過後才會發生效果  這樣回饋方是太差了

    我使用多執行緒 主要是想 要馬 按下按鈕後 把執行緒關掉  要馬  就是把執行緒內已觸發的timer事件停掉這樣

    2015年11月3日 下午 01:43
  • 您的程式已經啟動執行了, 所以這一行:

    Application.Run(f2)

    應該寫成

    f2.Show()

    才對

    2015年11月4日 上午 04:17
  • 麻煩大大看一下小弟我所問的問題 

    主要在於{例外}部分  

    在說  改為f2.show 是會閃退 form2的 這我之前有試過了!!!

     

    2015年11月4日 上午 09:52
  • 可以把Form2的TopMost屬性設定成true
    2015年11月5日 上午 07:44
  • 他的例外是因為Form2的Timer控制項還在執行,但你卻強行把產生表單的執行緒關閉。

    執行緒關閉了,控制項卻還在運作。

    解決方法是在Form2設個按鈕,先把Form2的timer.enabled=False

    然後等Timer確實關閉了(如果間隔時間設很長),再按a.Abort按鈕(但按下去也要等待時間,Form2才會關閉,我用小筆電大概要等10秒,因為這個動作等同關閉一個應用程式的表單)。

    但是你為什麼要把表單用工作執行緒來產生呢?

    這樣做所產生的Form2和Form1完全沒有關係,Form1就很難操控Form2,Form2也難以使用Form2的變數

    不能用其他控制項來代替嗎?

    2015年11月5日 上午 11:44
  • 他的例外是因為Form2的Timer控制項還在執行,但你卻強行把產生表單的執行緒關閉。

    執行緒關閉了,控制項卻還在運作。

    解決方法是在Form2設個按鈕,先把Form2的timer.enabled=False

    然後等Timer確實關閉了(如果間隔時間設很長),再按a.Abort按鈕(但按下去也要等待時間,Form2才會關閉,我用小筆電大概要等10秒,因為這個動作等同關閉一個應用程式的表單)。

    但是你為什麼要把表單用工作執行緒來產生呢?

    這樣做所產生的Form2和Form1完全沒有關係,Form1就很難操控Form2,Form2也難以使用Form2的變數

    不能用其他控制項來代替嗎?

    另一個方法,在Form2加入

     Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            Timer1.Enabled = False
        End Sub

    也就是當Form2關閉前,就先關閉Timer控制項

    2015年11月5日 上午 11:59
  • 使用執行續  就是因為sleep 回呈現假死  所以用執行續  去獨立執行讓他在背景運作

    如果要讓timer停掉  要叫你等5分鐘  你會願意嗎  

    所以用abort的意義在此

    2015年11月5日 下午 02:17
  • 使用執行續  就是因為sleep 回呈現假死  所以用執行續  去獨立執行讓他在背景運作

    如果要讓timer停掉  要叫你等5分鐘  你會願意嗎  

    所以用abort的意義在此

    1.在背景運作為什麼要開新的表單(form2)?直接在Form1內寫一些背景程序無法達成嗎?

    2.計時方法有很多,也不一定要用到Timer控制項

    3.用sleep讓程式暫停一段時間,不會有當機的感覺嗎?

    不過,這是你的程式,你高興就好。

    2015年11月5日 下午 02:35