各位大大好
如標題,我目前需要同時開多個執行緒跟設備抓值
然後再把抓到的值塞到同一個DataTable中
最後再把DataTable的東西即時show到DataGridView上
目前的做法是把DataTable加到DataGridView.DataSource中
再透過多執行緒更新各自對應欄位儲存格的值
來達到畫面即時更新的效果
但目前測試下來畫面不是很卡就是容易整個卡死
因此想問問各位大大
如果在需要即時更新DataGridView畫面的前提下
有什麼更好的做法嗎?
下面是執行緒裡面唯一有更新DataTable的地方
private void SetStatus()
{
try
{
if (Form1.form1.InvokeRequired)
{
Form1.form1.Invoke(new Action(SetStatus), new object[] { });
}
else
{
if (bool_AutoRun)
{
// -------------------------------
// 這邊跟DataTable無關就先刪掉了
// -------------------------------
MPU.dt_MainTable.Rows[int_ThreadNum + index]["Static"] = str_Data[index];
Application.DoEvents();
}
}
}
catch (Exception ex)
{
throw ex;
}
}
可以使用 Control.Invoke 方法來在執行緒中即時更新 DataTable,如果您希望在 DataTable 更新時立即刷新 DataGridView 畫面,您可以在更新完 DataTable 後使用 DataGridView.Refresh 方法來立即刷新畫面。
如下:
private void SetStatus()
{
try
{
if (Form1.form1.InvokeRequired)
{
Form1.form1.Invoke(new Action(SetStatus), new object[] { });
}
else
{
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()
{
try
{
if (Form1.form1.InvokeRequired)
{
IAsyncResult result = Form1.form1.BeginInvoke(new Action(SetStatus), new object[] { });
Form1.form1.EndInvoke(result);
}
else
{
if (bool_AutoRun)
{
// 更新 DataTable
MPU.dt_MainTable.Rows[int_ThreadNum + index]["Static"] = str_Data[index];
// 刷新 DataGridView 畫面
dataGridView1.Refresh();
}
}
}
catch (Exception ex)
{
throw ex;
}
}
參考看看囉~