然後再把抓到的值塞到同一個DataTable中
最後再把DataTable的東西即時show到DataGridView上
目前的做法是把DataTable加到DataGridView.DataSource中
再透過多執行緒更新各自對應欄位儲存格的值
來達到畫面即時更新的效果
但目前測試下來畫面不是很卡就是容易整個卡死
因此想問問各位大大
如果在需要即時更新DataGridView畫面的前提下
有什麼更好的做法嗎?
下面是執行緒裡面唯一有更新DataTable的地方
private void SetStatus()
if (Form1.form1.InvokeRequired)
Form1.form1.Invoke(new Action(SetStatus), new object[] { });
if (bool_AutoRun)
// -------------------------------
// 這邊跟DataTable無關就先刪掉了
// -------------------------------
MPU.dt_MainTable.Rows[int_ThreadNum + index]["Static"] = str_Data[index];
Application.DoEvents();
catch (Exception ex)
throw ex;
japhenchen 大大你好,我是用微軟的SQL Server,但我這邊都還沒有連到資料庫,只是單純讀取本機txt設備清單,並在抓值後更新DataTable和更新DataGridView,是最後處理完SQL語法才會由主執行緒去回寫資料庫
canrong 大大也就是說我設備數據更新後先把值用變數存起來,再由form的timer把值接回來去做畫面更新對嗎?
可以使用 Control.Invoke 方法來在執行緒中即時更新 DataTable,如果您希望在 DataTable 更新時立即刷新 DataGridView 畫面,您可以在更新完 DataTable 後使用 DataGridView.Refresh 方法來立即刷新畫面。
private void SetStatus()
if (Form1.form1.InvokeRequired)
Form1.form1.Invoke(new Action(SetStatus), new object[] { });
if (bool_AutoRun)
// 更新 DataTable
MPU.dt_MainTable.Rows[int_ThreadNum + index]["Static"] = str_Data[index];
// 刷新 DataGridView 畫面
dataGridView1.Refresh();
catch (Exception ex)
throw ex;
你也可以使用 Control.BeginInvoke 方法:
private void SetStatus()
if (Form1.form1.InvokeRequired)
IAsyncResult result = Form1.form1.BeginInvoke(new Action(SetStatus), new object[] { });
Form1.form1.EndInvoke(result);
if (bool_AutoRun)
// 更新 DataTable
MPU.dt_MainTable.Rows[int_ThreadNum + index]["Static"] = str_Data[index];
// 刷新 DataGridView 畫面
dataGridView1.Refresh();
catch (Exception ex)
throw ex;
參考看看囉~