想要達到的狀態是:點選開始按鈕,進度條跑完之前,資料表資料瘋狂的顯示變化,進度條也一直更進,且form表單拖動不卡頓,像德芙一樣絲滑。
點選開始按鈕,label 出現字型提示
1 private void btnstart_click(object sender, eventargs e)
2 5 public void loaddata()
6
button 可以操作lable 控制項,但為啥子呢?接下來操作出現假死,form 表單拖不動
1 private void btnstart_click(object sender, eventargs e)
2 5 public void loaddata()
6 ,剩餘量:,完成比例:%", currentindex, maxindex - currentindex,
15 (convert.todecimal(currentindex) / convert.todecimal(maxindex) * 100).tostring("f0"));
16 datarow dr = dt.newrow();
17 dr["id"] = currentindex;
18 dr["name"] = "connor";
19 dr["age"] = "32";
20 dt.rows.add(dr);
21 }
22 }
from 拖不動,我們來加乙個執行緒,主線程管窗體,子執行緒做顯示的任務
1 private void btnstart_click(object sender, eventargs e)
2 6 public void loaddata()
7 ,剩餘量:,完成比例:%", currentindex, maxindex - currentindex,
16 (convert.todecimal(currentindex) / convert.todecimal(maxindex) * 100).tostring("f0"));
17 datarow dr = dt.newrow();
18 dr["id"] = currentindex;
19 dr["name"] = "connor";
20 dr["age"] = "32";
21 dt.rows.add(dr);
22 }
23 }
不出所料,系統直接報錯,button開啟的執行緒不能訪問label.text ,報錯截圖
報錯不可怕,真正可怕的是放任不管,若干年後還是得回頭弄明白
1. button 可以操作label 顯示?
親可知,winform主線程,從main開始,button點選事件是主線程操作,label修改text也是主線程操作。
2.ui介面假死,拖不動,那是主線程太忙了,又要在後台運算操作,還得操作form介面移動,忙死了,也煩死了。
3.button 新建執行緒不能操作label, 子執行緒只能幹自己任內的事,label 和button 平級,label是主線程才能操作的,label畢竟是主線建立的,子執行緒就不要瞎操這個心啦!
解決方法
子執行緒調動label ,需要搬來委託,委託主線程來操作label,相當於搬救兵啦。
1 public void setlabelinfo(string strinfo)
2 );
8 }
9 else
10
13 }
來看看啊,label 先看看這個執行緒是不是建立我的執行緒,label只聽主線程呼叫,其他執行緒就別有想法了
其他子執行緒呼叫label ,沒有這個許可權啊,委託control 來呼叫,那麼自然能展示順利嘍。
action 泛型委託 沒必要每個委託都自己寫吧
WinForm串列埠操作
生產中經常會使用到串列埠來處理資料,在此做一下記錄 串列埠選擇框 波特率選擇框 開啟 關閉按鈕 大致如下 注意 紅色的表示的是串列埠開啟的狀態,為了便於區分當前串列埠狀態。紅色表示關閉,綠色表示開啟 自動載入獲取串列埠 private void getcomlist if cbbcom.proper...
C 操作CAD 呼叫winform
個人認為用命令操作cad會比較便捷,但是鑑於好多人喜歡通過滑鼠點選的方式操作cad,在此講一下如何呼叫winform。前期準備請看上篇文章。1 在新建好專案並引用介面dll的前提下,新建乙個winform或者使用者控制項。直接呼叫winform會在電腦上直接生成乙個獨立於cad的窗體,我感覺很不舒服...
winform 跨執行緒操作控制項
當進行winform的開發時,經常遇到用時比較久的操作,在傳統的單執行緒程式中,使用者必須等待這個耗時操作完成以後才能進行下一步的操作,這個時候,多執行緒程式設計就派上用場了,將這個耗時的操作放到乙個新的子執行緒中,啟動子執行緒完成操作,而不影響主線程的正常工作。那麼這個時候問題來了,當在子執行緒中...