none
CPU 跟 ManualResetEvent 多執行緒的問題 RRS feed

  • 問題

  • CPU 跟 ManualResetEvent 多執行緒的問題

    我自己的桌機跟筆電都是雙核心的CPU

    寫的程式給大陸方面 他們使用到自動化程式 我用ManualResetEvent 多執行緒去寫的 到了這裡就會當掉不執行

    我今天自己拿一台比較舊的電腦P4 2G的電腦

    沒想到真的當掉不會動 

    我之後把原始程式拿到那台舊的電腦從新編譯就能用了

    請問一下怎麼會這樣呢 真的是差在這嗎

    我是把編譯後 產生在BIN\DEBUG 資料夾內的檔案給大陸  還是這樣是不行的

    2010年3月19日 上午 03:15

解答

  • 沒看到Code只能猜一下, 因為我曾經成功地寫出使用  ManualResetEvent 讓兩個執行緒都鎖死回不來的狀況 . 簡單地說就是執行緒因為 WaitHandle位置的錯誤導致根本不會 Set 回信號狀態, 所以可能你需要用筆去模擬一下你的程式是如何呼叫 Wait 和 Set 的. 找出鎖死的原因.
    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    2010年3月23日 下午 12:06
    版主

所有回覆

  • HI,

    建議包裝成安裝程式再拿給對方用看看

    2010年3月19日 上午 07:14
  • 看不懂...

    你是呼叫 Process 還是建立執行緒去跑函式?

    P4 2G 的 CPU 有無 HT ?

    CPU 是否滿載 100% ?


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

    我之前說把程式拿到舊的電腦編譯一次就能正常 是錯的 還是一樣不正常

    我是開兩個FORM  一個是單純讀一個通訊儀器的值   另一個因為有時也會用到同一個儀器

    所以我兩個都使用ManualResetEvent  當FORM2要使用時 就會讓FORM1 停下來

    我試過 你只要先啟動FORM1的ManualResetEvent   FORM2的就會停著不動(程式並不會當掉)

    反過來先啟動FORM2    FORM1就一樣不會動

    它是跑到下面那行程式 理論上應該會跑到 SUB RUNNING 裡 但它都不會動了

     ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf Running), I2C_READ_VALUE)

    包裝程式也沒用 看起來應該是電腦問題

    P4 2G 的 CPU 無 HT

    效能滿載 100%在跑

    2010年3月23日 上午 07:28
  • 沒看到Code只能猜一下, 因為我曾經成功地寫出使用  ManualResetEvent 讓兩個執行緒都鎖死回不來的狀況 . 簡單地說就是執行緒因為 WaitHandle位置的錯誤導致根本不會 Set 回信號狀態, 所以可能你需要用筆去模擬一下你的程式是如何呼叫 Wait 和 Set 的. 找出鎖死的原因.
    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    2010年3月23日 下午 12:06
    版主
  • 應該是硬體的關係  三台電腦都正常 程式碼也都一樣

    只有那台舊的電腦看到這問題

    2010年3月23日 下午 12:28
  • 我的自動化程式也在不少的老電腦跑過, 但從來沒見過這種事情. 所以基本上我不認為是硬體的問題, 而是程式架構有問題的嫌疑比較大.
    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    2010年3月24日 上午 09:19
    版主
  • 可是心冷熱情熄講的現象都有發生

    我本來是以為我速度太快

    我把它調成五秒執行一次 結果也一樣

    而且程式有問題 也不可能換新的電腦就正常

    2010年3月24日 上午 09:36
  • CPU 滿載的那一支執行檔迴圈內是否有固定呼叫 Sleep ?
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年3月24日 下午 12:28
  •  有喔

    兩者的架構都一樣是這樣

     

    While 1

                Auto_Ctrl_Execute.WaitOne()
                Application.DoEvents()
                System.Threading.Thread.Sleep(50)   

    .......

     Me.Refresh()

    end while

    2010年3月25日 上午 06:54
  • 如果用了 WaitOne() ,就不用迴圈,也不用 DoEvents/Sleep,因為是等到死

    如果是 WaitOne(50) ,就可以省掉 sleep(50) ,但仍然要回圈。

    你這樣寫實在讓人看不懂。


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

    第二個  它寫  多載解析失敗,因為沒有可存取的 'WaitOne' 接受此引數數目。

    2010年3月26日 上午 03:16
  • 你用的是 .Net Framework 2.0對不對 ?  心冷大的用法要 .Net Framework 3.5才能用

    2.0要用 WaitHandle.WaitOne 方法 (Int32, Boolean )

    難道你寫程式都不先參考文件的嗎 ?


    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    2010年3月26日 上午 04:08
    版主
  • 不是喔

    我灌的是VS2008 那應該是 .Net Framework 3.5

     

    WaitHandle.WaitOne 方法 (Int32, Boolean)  應該要有個TRUE OR FALSE
    我KEY I2C_READ_VALUE.WaitOne(20000, False)  I2C_READ_VALUE.WaitOne(20000, True)
    結果都不會有等待
    • 已編輯 x32 2010年3月26日 上午 06:23
    2010年3月26日 上午 04:30
  • WaitHandle. WaitOne 方法 (Int32)支援版本:3.5 SP1、3.0 SP1、2.0 SP1

    這樣有看懂了嗎 ?


    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    2010年3月26日 上午 04:54
    版主
  •     如果要存取一個非多工裝置
        建議寫一個函式 將通訊全部包在此
        程式透過此函式來與外部裝置溝通 就不會有執行緒安全問題
        Function ReadEquip() As Boolean
            Static LockObject As New Object
            SyncLock LockObject
                ' ...
            End SyncLock
            Return True
        End Function
    2010年3月31日 上午 03:44
  • 要能等待的前提是那個 Handle 本身要有效,妳有用 Spy++ / Process Explorer 等軟體檢查過你的 Handle 還存在嗎?
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年3月31日 下午 03:44
  • 沒有耶  要怎麼使用那個軟體

    2010年4月1日 上午 10:33
  • Spy++ 在 Visual Studio 專業版中內建

    Process Explorer 在微軟 TechNet 網站中下載

    Google 就會告訴你東西在哪跟怎麼用了


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

    結果竟然還是不會動

    我最後看它停到  Application.DoEvents()

    這程式兩個sub 的確每跑一個迴圈就呼叫Application.DoEvents() 

    我把兩個迴圈的Application.DoEvents()都刪掉才正常

    2010年4月7日 上午 06:18