none
執行檔沒有任何錯誤就直接消失的奇怪問題 RRS feed

  • 問題

  • winxp+VS2008

    各位大大小弟遇到了一個奇怪的問題

    有一個執行檔有做時序控制

    一分鐘會去撈資料一次

    我利用Thread去做

    最近常常執行到一半莫名奇妙就自己消失了(工作管理員中處理程序)

    沒有任何錯誤訊息

    為了排除問題

    我將執行的步驟一一寫到Log File中

    找到了一個共通點

    因為我是一分鐘執行一次所以我會在下一分鐘去判斷上一個執行緒是否ThreadState = ThreadState.Stopped

    如果不是我會強制關掉執行緒

    從新連線設備

    並且再啟動一個新的執行緒

    發現都是在啟動執行緒後

    執行檔就會直接消失或是我按下停止(偶而發生消失)

    發生時間很不一定有時候好幾天有時候馬上消失

    想詢問各位大大

    看看有沒有一些方向來DEBUG

    麻煩各位大大提供小弟一些意見

    謝謝各位大大了

     

     補上程式碼

    StartTimer.Enabled = False
            If G_Quit = True Then Exit Sub
            Try
                ThreadErr = False
                If G_Invoke.ThreadState <> ThreadState.Stopped Then
                    ThreadErr = True
                    Call wFile(ThreadState.Stopped.ToString)
               End If
            Catch ex As Exception
                ThreadErr = True
                Call wFile("0 Error")
                Call wFile(ThreadState.Stopped.ToString)
            End Try
    
            Try
                G_Invoke.Abort()
                G_Invoke = Nothing
            Catch ex As Exception
                ThreadErr = True
                Call wFile("1 Error")
            End Try
            GC.Collect()
            If Satrt1St = True And ThreadErr = True Then
                Call wFile("Error 從新連線")
                Call TCPConnect(True, 0)
            End If
            If Satrt1St = False Then
                Satrt1St = True
                Call wFile("第一次連線")
                Call TCPConnect(True, 0)
            ElseIf Satrt1St = True And Now.Minute = 0 Then
                Call wFile("整點Rest連線")
                Call TCPConnect(True, 0)
            End If
    
            Call wFile("執行緒啟動")'固定在這裡 這行秀出後執行檔就消失
             G_Invoke = New Thread(New ThreadStart(AddressOf TCP.AutoRead))
            G_Invoke.IsBackground = True
            G_Invoke.Start()
    
            If G_Quit = True Then Exit Sub
    
            ST1 = G_WithdrawTime - Now.Second 'G_WithdrawTime * Multiplier) - Now.Second
    
            StartTimer.Interval = IIf(ST1 < 10, IIf(ST1 + G_WithdrawTime < 10, (ST1 + (G_WithdrawTime * 2)) * 1000, (ST1 + G_WithdrawTime) * 1000), ST1 * 1000)
            Call wFile("下次啟動時間 " & StartTimer.Interval)
            If G_Quit = True Then Exit Sub
            StartTimer.Enabled = True
    
    • 已編輯 動不了 2010年4月6日 上午 09:50
    2010年4月6日 上午 09:18

解答

  • 所以我說要每次送資料之前都要重新連線, 然後接收完就斷線, 這樣才能避免這樣的問題. 除非你用非同步寫法, 而且已經Invoke了BeginReceive, 否則在同步的狀態下Server 一旦斷線就得等到 Send時才會發現.

    結論: 你的架構一定有某種問題存在


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    • 已標示為解答 動不了 2010年4月21日 上午 12:48
    2010年4月10日 下午 07:12
    版主

所有回覆

  • 執行檔消失 ? 是指程式跑一跑會自己把自己的.exe檔案刪除嗎 ?
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月6日 上午 09:44
    版主
  • Bill Chung大大

    小弟敘述不好讓大大誤會了

    消失的意思是指工作管理員中的處裡程序消失

    2010年4月6日 上午 09:46
  • 嚇我一跳, 原來是指處理序 (執行緒)

    你的程式碼是 Timer Tick的委派函式嗎 ? 有試著用Try--Catch抓看看有沒有什麼Execption出現嗎 ?

     


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月6日 上午 10:01
    版主
  • 看過事件檢視器嗎?
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年4月6日 下午 02:46
  • 心冷大大

    事件檢視器沒有任何有關的程式事件

    天呀到底發生啥麼事了

    Bill Chung大大

    我用Try--Catch直接包住

    還是一樣沒有任何錯誤

    直接都消失了

     

    2010年4月7日 上午 01:35
  • 把防毒軟體關掉再試試看
    2010年4月7日 上午 02:11
  • 阿尼大大

    沒有防毒軟體

    2010年4月7日 上午 02:37
  • 確認一下是在哪跳出Timer Tick的

            Call wFile("執行緒啟動")' <--雖然你看起來是在這邊

            '但也有可能是進了以下三行, 另一個可能是進了TCP.AutoRead 函式
            G_Invoke = New Thread(New ThreadStart(AddressOf TCP.AutoRead))
            G_Invoke.IsBackground = True
            G_Invoke.Start()

         你要確認所有會結束Tick條件的位置, 而且在Tick前要檢查Timer的Enabled狀況.

         以你的片段, 在If G_Quit = True Then Exit Sub 時Timer的Enabled屬性似乎還是False的

     


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月7日 上午 03:05
    版主
  • Bill 大大

    我在TCP.AutoRead裡面一進去就寫一個標記

    發現當消失的時候,沒有這個進入的標記

    所以因該並沒有進入G_Invoke = New Thread(New ThreadStart(AddressOf TCP.AutoRead))

    不過消失前還有印出後面這一行       

    Call wFile("下次啟動時間 " & StartTimer.Interval)

    有再想是不是Invoke 的時候出了問題

    還有一點換一台電腦是正常的(已經在想是不是硬體也有問題)

    不過在之前AP已經連續不中斷的跑了快兩個月了

    2010年4月7日 上午 05:53
  • (1) 有用工作管理員看一下Thread數量會一直增加嗎 ? 會不會爆了.

    (2) 可以用 NetState 瞧瞧你的Thread  結束後會不會將TCP所佔有的Port歸還 ?


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月7日 上午 06:06
    版主
  • to  Bill大大

    (1)有用工作管理員看一下Thread數量大概都從69~74左右變動

    (2)Port歸還?我設備上都有固定IP及Port只要沒有錯誤發生,我會一直讓連線存在

    之前有遇過AP不知道連線中斷的問題AP會一直停在那裡,所以改成利用THREAD

    只要TIMER時間到了THREAD的狀態不是已經執行結束(一分鐘一定可跑完(大約7秒完成整個讀取))

    如過不是我會將THREAD ABOUT,並且將TCP通通CLOSE並重新建立TCP連線

    經大大提醒後

    有利用NetStat 指令去監看 除非我中斷連線不然PORT的狀態都是ESTABLISHED 

    2010年4月7日 上午 07:01
  • 其實這種最好不要讓TCP Socket一直保持開啟. (因為會有更多的偵測要處理). 你可以在每次要讀取資料時都啟用一個新的TCP Client Socket (用Any Port), 程序結束前就將此Client Socket給Close.

    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月7日 上午 07:13
    版主
  • 沒錯誤訊息、沒事件,那我偏向正常結束。

    建議你檢討你的邏輯,比如說 Try Catch 碰上錯誤跳出來後,沒東西可執行而結束...

    .Net 防呆做的很好了,想要繞過這些防呆直接結束,很難...


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年4月7日 下午 02:59
  • 心冷大大

    <建議你檢討你的邏輯,比如說 Try Catch 碰上錯誤跳出來後,沒東西可執行而結束...>

    如果是這樣還比較好解決

    我程式中除了EXIT那個按鈕擺了END以外(手動按以後會結束程式)

    其他地方都沒有所以如果跳出後程式因該繼續跑

    不會整個AP沒有錯誤訊息沒有事件記錄就消失在螢幕上

    Bill大大

    我現在有改成每次做完後就斷線,需要在連線。

    不過狀況依舊

     

    目前我在AutoRead中擺了很多個DEBUG.PRINT(本來想說是看看做到哪裡出問題)

    暈倒= =竟然就不會了

    昨天加上去後,到目前都沒有自行結束過

    2010年4月8日 上午 01:07
  • 心冷大大

    <建議你檢討你的邏輯,比如說 Try Catch 碰上錯誤跳出來後,沒東西可執行而結束...>

    如果是這樣還比較好解決

    我程式中除了EXIT那個按鈕擺了END以外(手動按以後會結束程式)

    其他地方都沒有所以如果跳出後程式因該繼續跑

    不會整個AP沒有錯誤訊息沒有事件記錄就消失在螢幕上

    Bill大大

    我現在有改成每次做完後就斷線,需要在連線。

    不過狀況依舊

     

    目前我在AutoRead中擺了很多個DEBUG.PRINT(本來想說是看看做到哪裡出問題)

    暈倒= =竟然就不會了

    昨天加上去後,到目前都沒有自行結束過

    2010年4月8日 上午 01:07
  • 終於找到原因了

    原來是Client的問題

    因為在傳送資料的過程還是連線的

    在等待回應的時候Client已經斷線

    但是AP還是不知道

    當程式跑道那段就會直接消失

    不過很納悶怎麼會沒有錯誤訊息呢?

    2010年4月8日 上午 05:38
  • 你的AP端是Client還是Server ?

    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月8日 上午 05:43
    版主
  • Bill大大

    AP端 利用TcpClient去跟所有的設備連線

    在我的理解上AP端我是認為Server

    但是卻不是設備來連我,而是我去連線所有設備。

    因為設備上都有一張網卡做為通道。

    並沒有能力來與AP連線

    我說的斷線因該是設備已經中斷我對他的連線

    但是我的AP卻不知道

     

     

    2010年4月8日 上午 07:18
  • 所以我說要每次送資料之前都要重新連線, 然後接收完就斷線, 這樣才能避免這樣的問題. 除非你用非同步寫法, 而且已經Invoke了BeginReceive, 否則在同步的狀態下Server 一旦斷線就得等到 Send時才會發現.

    結論: 你的架構一定有某種問題存在


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    • 已標示為解答 動不了 2010年4月21日 上午 12:48
    2010年4月10日 下午 07:12
    版主
  • BILL 大大

    目前已經要改成非同步的方式來處理通訊的問題

    雖然每次傳送前就重新連線,但是還是常常出現莫名奇妙的斷線

    如圖

    常常出現這個屬性評估失敗

    也謝謝大大的幫忙

    發現那麼多的問題

    2010年4月12日 上午 01:28
  • 把 catch 那部份分類一下, 變成

         Try

        Catch abortEx As ThreadAbortException

        Catch Ex as Exception

        End Try

     


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月14日 上午 02:10
    版主
  • TO Bill

    了解

    測試過後,如果還有問題,在上來跟大大請教

    不過時間可能會有些長

    2010年4月15日 上午 02:11
  • to Bill大大

    真的有一些架構上的問題

    目前依照大大給我的一些建議

    整個改寫目前都很正常了

    謝謝大大陪我測試那麼久

    感恩了

    2010年4月21日 上午 12:49