0
Modbus 명령을 사용하여 읽은 실시간 온도를 그래프로 표시하려고합니다. 현재 온도를 읽고 그래프로 볼 수 있습니다. 그러나 첫 번째 점을 그리면 그래프와 GUI가 지속적으로 업데이트되지 않습니다.Windows 폼 응용 프로그램에서 실시간 그래프 작성
나는 Form1_Load
이외의 방법이 실행해야 하는가?
private void Form1_Load(object sender, EventArgs e)
{
chart1.ChartAreas.Add("Area");
chart1.ChartAreas["Area"].AxisX.Minimum = -100;
chart1.ChartAreas["Area"].AxisX.Maximum = 100;
chart1.ChartAreas["Area"].AxisX.Interval = 1;
chart1.ChartAreas["Area"].AxisY.Minimum = -100;
chart1.ChartAreas["Area"].AxisY.Maximum = 100;
chart1.ChartAreas["Area"].AxisY.Interval = 1;
//create a Data object array
val[] data = new val[5];
string[] ports = SerialPort.GetPortNames();
this.comboBox1.DataSource = ports;
serialPort1.PortName = "COM5";
using (SerialPort port = new SerialPort("COM5"))
{
//start time object
DateTime start = DateTime.Now;
int startSec = start.Second;
port.Open();
byte slaveID = 1;
ushort startAddress = 360;
ushort numOfPoints = 2;
ModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);
for (int j = 0; j < 5; j++)
{
ushort[] holding_register = master.ReadHoldingRegisters(slaveID, startAddress,
numOfPoints);
ushort val1 = holding_register[0];
ushort val2 = holding_register[1];
uint t1 = (uint)(holding_register[0]);
uint t2 = (uint)(holding_register[1] << 16);
uint temp = (uint)(t1) | (t2);
byte[] floatVals = BitConverter.GetBytes(temp);
float f = BitConverter.ToSingle(floatVals, 0);
c = 5.0/9.0 * (f - 32);
textBox1.Text = c.ToString();
DateTime current = DateTime.Now;
int currentSec = current.Second;
int time = currentSec - startSec;
chart1.Refresh();
data[j].time = time;
data[j].temperature = c;
chart1.Series[j].Points.Add(new DataPoint(data[j].time, data[j].temperature));
chart1.Refresh();
port.Close();
}
}
}
이것은 근본적인 newb 문제입니다. 창 응용 프로그램에는 지정된 UI 스레드가 있습니다. 메시지 펌프 (사용자가 창을 클릭 할 때처럼 처리하는)를 실행하고 창의 시각적 표현을 그립니다. UI 스레드에서 작업하고 있습니다. 일반적으로 괜찮습니다.하지만 UI 스레드에서 많은 작업을 할 때 UI 스레드는 더 이상 메시지 펌프를 실행하거나 창을 그릴 수 없습니다. 응용 프로그램이 정지 된 것처럼 보입니다. 작업이 끝나면 업데이트 만됩니다. 이것이 우리가 배경 스레드 *에 많은 노력을 기울이는 이유이며 UI 스레드로 전환하여 업데이트를 게시하는 이유입니다. – Will
많은 자원이 https://stuff.seans.com/2009/05/21/net-basics-do-work-in-background-thread-to-keep-gui-responsive/ 또는 유사한 검색 결과에 있습니다. – Will
루프가 어디 있습니까? – TaW