台灣最大程式設計社群網站
線上人數
936
 
會員總數:246713
討論主題:190131
歡迎您免費加入會員
討論區列表 >> C# >> 關於Form控制像在thread內的數值更新顯示
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
關於Form控制像在thread內的數值更新顯示
價值 : 5 QP  點閱數:817 回應數:5
樓主

一人團
門外漢
0 3
65 6
發送站內信

各位先進好

我設計了兩個Form,一個Class
Frm_Main => 程式執行時開啟的首頁
Frm_A => 由Frm_Main觸發顯示
Frm_A 上有拉一個 GroupBox 名為 Grp_A

Cls_A 內會實做一些TextBox等控制項,也會宣告一些變數給相對應的控制像顯示
實作時需傳入Grp_A,並且將控制像增加進去
設計了一個Thread無線迴圈的跑,主要一直更新控制項顯示最新的的變數

目前操作上
程式執行顯示Frm_Main時,控制項.InvokeRequired狀態為flase
開啟Frm_A時,控制項.InvokeRequired狀態會變為true
以上兩個狀況都正常,Thread會一直持續更新控制項的顯示
但是當關閉了Frm_A時,這個Thread會永久卡在如下程式碼==>這一行
也不是錯誤,也沒有異常就是此執行緒一直在等待這行做完
初步判定是關閉Frm_A的時間差問題(不確定,也不知道怎麼證明)
就算我在顯示Frm_A也沒有用

// 此為Thread中某一段更新的程式碼...
if (Text.InvokeRequired)
{
==> Text.Invoke(new Action(() => Text.Text = Ptms.Value.ToString()), null);
}
else
{
Text.Text = _Ptms.Value.ToString();
}

目前的問題是
1.invoke有辦法可以設定像timeout一樣的方法嗎?
有什麼方法可以不要讓它卡住,用TryCatch也沒用?

謝謝!!

搜尋相關Tags的文章: [ Invoke ] , [ InvokeRequired ] , [ Thread ] , [ Control ] ,
本篇文章發表於2017-05-25 11:19
1樓
回應

小魚
檢舉此回應
如果我沒有搞錯,
你應該是要先將Thread解除掉,
然後再關閉視窗吧。
本篇文章回覆於2017-05-27 13:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

小兔斑比
捐贈 VP 給 小兔斑比 檢舉此回應
你的Thread有設定成Background嗎?
本篇文章回覆於2017-05-31 09:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

一人團
檢舉此回應
Hi 小魚大大

首先感謝您的回覆
Form尚未Show或ShowDialog前,可以先執行或關閉Thread
但前提是要先把Form實做出來才行,這部分是沒問題的
目前的問題是Thread內顯示Form控制項的部分無法很容易的區分
是不是在同個執行緒上,進而選擇欲控制Form控制項的手法

我的問題已經解決了,方法如下
Action<object>宣告執行緒的方法,然後搭配lock來實現想要的功能
目前使用起來是不會再出錯,也會隨時更新顯示或者輸入數值
僅供大家參考,謝謝!!
本篇文章回覆於2017-05-31 09:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

一人團
檢舉此回應
Hi 小兔大大

有設成Background模式,回復如上所述,
感謝您的解答!!
本篇文章回覆於2017-05-31 09:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

小魚
檢舉此回應
喔喔,原來你是要用Thread去控制主執行緒啊,
我都是用委派的方式,Action較少用、不熟。
本篇文章回覆於2017-05-31 19:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.