none
在連線情況下,new視窗沒有回應,UI線程阻塞? RRS feed

  • 問題

  • 目前有一個程式(Form A)他是以TCP的方式,一直不斷接收另一個程式(B)的訊息

    ※確定可以收到來自B的訊息有用Messagebox顯示過 "接收到了"

    而程式A現在接收到一個指令是 執行函式 : displayform(); 

    public static void displayform()

    {

        Display form = new  Display();

        form.Show();

    }

    但當他接收到這個指令時 , 要執行show Display 這個form

    Display這個form有跳出來,但是卡在一半就沒有回應了,一片白色無法移動。

    另外還有一個情況就是當我接收到執行show Display form這個指令 然後馬上中斷連線

    Display這個視窗就跳出來了,我知道可能是線程阻塞,訊息一直被卡住,導致介面假死,是它一直使用到UI的線程?

    也有想過new一個線程出來,來執行show Display form 但是還是行不通

    類似這樣:

    ThreadStart myRun = new ThreadStart(displayform);
    Thread myThread = new Thread(myRun);
    myThread.Start();

    也有用過非同步的辦法,但也又可能是自己寫的方法錯了

    想請問各位前輩這個問題大致上是該如何解決

    能否給予方向或著是簡單的例子關於show form

    謝謝各位前輩!

    2020年6月23日 上午 02:21

所有回覆

  • 你是不是在 UI Thread 中用無限迴圈做 Tcp 接收 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2020年6月23日 上午 04:54
    版主
  • Tcp那邊是new一個線程 並用timer的方式 每0.1秒 接收傳過來的東西

    在Tcp連上後,介面可以做任何操作,包括用button呼叫Display form出來

    只是不能用送指令的方式

    2020年6月23日 上午 05:13
  • 另外form.Show();

    改成

    form.ShowDialog();就能開啟Display form

    但是原來的表單就不能動作了

    能否能達到能開啟Display form 又不會影響原表單的操作呢?


    • 已編輯 Jmzeh 2020年6月23日 上午 06:08
    2020年6月23日 上午 06:05
  • 你還用了 Forms.Timer 是嗎? 那就很有可能卡住了。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2020年6月24日 上午 02:33
    版主
  • 想問一下~一般來說如果遇到Tcp那邊不斷地在接收 導致執行緒阻塞

    那要如何用指令的方式去執行像是form.show()的動作呢?

    因為目前來說有試過另開一個Thread給它,但也不能

    可是當改成form.showDialog()卻可以,雖然form.showDialog()可以將Form秀出來

    但它卻又影響到主表單的操作,因為不能操作

    希望達到的目的能像form.showDialog()一樣,但卻保有主表單的操作

    2020年6月24日 上午 05:46
  • 先貼一下你 TCP 那邊的程式碼來看看

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2020年6月25日 上午 04:48
    版主
  • 你有用到回呼嗎?

    回呼通常是用 Main Thread 跑,也就是 GUI Thread ,不是用 WorkThread 跑。

    所有畫面更新都是由 GUI Thread 更新,一個 Process 只能有一個 GUI Thread 。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2020年6月25日 下午 12:13