none
如何使用執行緒 RRS feed

  • 問題

  • 我的問題是在於
    程式中應該有一個執行緒在執行的情況下
    在執行另一個執行緒
    這時候發生錯誤
    我知道是我沒有使用多執行緒的結果

    請問一下
    多執行緒要如何使用,才不會發生問題
    謝謝
    2008年2月18日 上午 07:45

解答

  • ... 程式是你寫的嗎?

     

    我覺得你的描述跟程式碼有很大的差異~

     

    比如說

    Code Snippet

    this.WebCamCapture.Start(0);<----------這個應該也是執行緒吧

     

     

    我是判斷這是你外掛的控制項開始攝影,跟執行緒沒關係。

     

    還有既然有錯誤,錯誤訊息是非常重要的,不論是編譯錯誤還是執行錯誤,依據錯誤訊息的內容,對應你程式碼錯誤的那幾行才有價值,隨便亂貼一段程式碼誰知道是哪邊錯誤?

     

    .Net 2.0 以後,通用性的規則不允許跨執行緒存取控制項,也就是說要操控控制項時,若與建立的執行緒不同時,將會發生錯誤,可搜尋 BackGroundWorker ,裡面的討論也有不使用這個控制項的方法:

    http://forums.microsoft.com/MSDN-CHT/Search/Search.aspx?words=BackGroundWorker&localechoice=31748&SiteID=14&searchscope=allforums
    2008年2月19日 上午 01:53

所有回覆

  • 老實說,有看沒有懂,不是很清楚你的問題是什麼,或許可以從下面這篇參考看看相關資料或是搜尋討論區

    執行緒 (C# 程式設計手冊)

    http://msdn2.microsoft.com/zh-tw/library/ms173178(VS.80).aspx

    2008年2月18日 上午 08:03
  • 這個文章的內容,我已經知道了
    這是指單一個執行緒的製作方法

    但是我的問題是說
    在一個執行緒「已經」在執行的狀況下
    在「執行」一個不同的執行緒

    舉例來說,我有兩個執行緒「a」和「b」
    程式經由事件觸發執行緒「a」
    執行緒「a」在執行的過程中,會觸發執行緒「b」
    二個執行緒要同時進行(我的程式,就是在這時候發生錯誤 )

    所以,我想知道,要如何去控制在這種情況下的執行緒
    2008年2月18日 上午 08:24
  • 能說明一下錯誤是發生在什麼樣的狀況嗎?或是錯誤訊息?

     

    一般來說像是下面這樣的程式碼就會建立一個新的執行緒,而呼叫Start方法便會讓執行緒開始執行

    Thread InstanceCaller = new Thread(
                new ThreadStart(serverObject.InstanceMethod));

     

    而要在不同執行緒間處理資料,為防止非預期的情形發生,一般是用鎖定(SyncLock)的方式,但有幾個部分要注意

    1.鎖定是針對參考型別,實質型別不支援鎖定

    2.注意死結的問題

    執行緒間的錯誤是不好去除錯的,還要搭配檢查你程式的邏輯,只能給你比較一般性的建議。

     

    2008年2月18日 上午 08:51
  •  吳炯德 寫信:
    這個文章的內容,我已經知道了
    執行緒「a」在執行的過程中,會觸發執行緒「b」
    二個執行緒要同時進行(我的程式,就是在這時候發生錯誤 )

     

    無碼何以解碼

     

    可否提供   " 執行緒「a」在執行的過程中,會觸發執行緒「b」"   之程式碼

    2008年2月18日 上午 08:54
  • 好像可以使用BackGroundWorker控制項來達到你要的效果

    Code Snippet

    backgroundWorker1.RunWorkerAsync(); //觸發

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {

    執行緒要執行的程式碼

               }

     

     

    2008年2月18日 下午 05:02
  • 下面是我部份程式碼,有問題的部份,我會用紅包來標示

     

    private void Form1_Load(object sender, System.EventArgs e)
      {
                this.WebCamCapture.Start(0);<----------這個應該也是執行緒吧

                soundDetector = new Detector.SoundDetector();
                soundDetector.SoundDetected += new Detector.__SoundDetector_SoundDetectedEventHandler(soundDetector_SoundDetected);
      }

     

    void soundDetector_SoundDetected(int audioLevel)
     {

                Thread soundeend = new Thread(SoundEnd);
                soundeend.Start();<------------執行緒「a」
     }

     

    private void WebCamCapture_ImageCaptured(object source, WebCam_Capture.WebcamEventArgs e)
    {
                GameStart(BackImage);
    }

     

    public void GameStart(Bitmap BackImage)
     {
                GameImageShow(BackImage, 0, 64, 192, 240);
    }

     

    public void GameImageShow(Bitmap BackImage, int x1, int x2, int y1, int y2)
    {
                Sound();<----------想把這個也改成執行緒寫法,注解一
    }

     

    void Sound()
    {
               Thread listenThread = new Thread(StartListening);
                listenThread.Start();<------------------執行緒「b」
    }

     

    void StartListening()
    {
               soundDetector.Listen(2);
    }

     

    void SoundEnd()
    {
                soundDetector.StopListening();
    }

     

    以上的程式碼都只是部份(因為我的程式太多了,不方便全部貼上)

    如果不足的地方,請告訴我,我會在補上的

    這樣的寫法不會產生錯誤,但是會產生「等待」的情況

    麻煩各位大大,有沒有辨法解決

     

    如果把「注解一」改成執行緒,就會產生錯誤

    2008年2月19日 上午 01:27
  • ... 程式是你寫的嗎?

     

    我覺得你的描述跟程式碼有很大的差異~

     

    比如說

    Code Snippet

    this.WebCamCapture.Start(0);<----------這個應該也是執行緒吧

     

     

    我是判斷這是你外掛的控制項開始攝影,跟執行緒沒關係。

     

    還有既然有錯誤,錯誤訊息是非常重要的,不論是編譯錯誤還是執行錯誤,依據錯誤訊息的內容,對應你程式碼錯誤的那幾行才有價值,隨便亂貼一段程式碼誰知道是哪邊錯誤?

     

    .Net 2.0 以後,通用性的規則不允許跨執行緒存取控制項,也就是說要操控控制項時,若與建立的執行緒不同時,將會發生錯誤,可搜尋 BackGroundWorker ,裡面的討論也有不使用這個控制項的方法:

    http://forums.microsoft.com/MSDN-CHT/Search/Search.aspx?words=BackGroundWorker&localechoice=31748&SiteID=14&searchscope=allforums
    2008年2月19日 上午 01:53
  • 我的程式其實是由兩隻不同的程式組合起的

    因此才會有一些奇奇怪怪的問題

     

    請問一下,在寫完

                        BackgroundWorker soundbackgroundworker = new BackgroundWorker();
                        soundbackgroundworker.DoWork += new DoWorkEventHandler(Sound);
                        soundbackgroundworker.RunWorkerAsync();

    要如何停止 BackgroundWorker

    2008年2月20日 上午 06:21
  • 請問一下各位一個問題

    為什麼我將 BackgroundWorker 加入到程式之中後

    使用「建置方案」(按F6) 後,就會產生一個「exe」

    而且他不自動結束,這樣的話,我就沒有辨法進行下一次的「建置」

    有沒有看過這類的問題

    2008年2月20日 上午 07:55
  • 前面說到這段請先說明,否則根本不知道你碰上啥問題:

    Code Snippet

    還有既然有錯誤,錯誤訊息是非常重要的,不論是編譯錯誤還是執行錯誤,依據錯誤訊息的內容,對應你程式碼錯誤的那幾行才有價值,隨便亂貼一段程式碼誰知道是哪邊錯誤?

     

     

    2008年2月20日 下午 04:44