c# - Update Graph while picking values from the database -
i trying pick values database , keep updating graph there. using how update gui thread in c#? code is:
private void button1_click(object sender, eventargs e) { string myconnection = "datasource=localhost;port=3306;username=root;password=root"; mysqlconnection condatabase = new mysqlconnection(myconnection); mysqlcommand cmddatabase = new mysqlcommand(" select * data.test; ", condatabase); mysqldatareader myreader; this.invoke((methodinvoker)delegate { try { condatabase.open(); myreader = cmddatabase.executereader(); while (myreader.read()) { this.chart1.series["series1"].points.addxy(myreader.getstring("datetime"), myreader.getint32("temp")); } condatabase.close(); } catch (exception ex) { messagebox.show(ex.message); } }); }
though not error, dont think working graph constant/static. suggestions. what want graph keeps updating based on new values in database...something heart beat monitor or effect.
any suggestions...regards
edit: tried using background worker there following on button click:
cross thread operation not valid: control 'chartemperature' accessed athread other thread created on
the code:
using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.text; using system.windows.forms; using mysql.data.mysqlclient; using system.threading; namespace project { public partial class form2 : form { private backgroundworker bw = new backgroundworker(); public form2() { initializecomponent(); bw.workersupportscancellation = true; bw.workerreportsprogress = false; bw.dowork += new doworkeventhandler(bw_dowork); } private void btnexit_click(object sender, eventargs e) { application.exit(); } private void btntemperature_click(object sender, eventargs e) { if (bw.isbusy != true) { bw.runworkerasync(); } //this.invoke((methodinvoker)delegate // { /* string myconnection = "datasource=localhost;port=3306;username=root;password=root"; mysqlconnection condatabase = new mysqlconnection(myconnection); mysqlcommand cmddatabase = new mysqlcommand(" select * data.test; ", condatabase); mysqldatareader myreader; try { condatabase.open(); myreader = cmddatabase.executereader(); while (myreader.read()) { this.charttemperature.series["temperature"].points.addxy(myreader.getstring("datetime"), myreader.getint32("temp")); } condatabase.close(); } catch (exception ex) { messagebox.show(ex.message); } //});*/ } private void btnstopupdating_click(object sender, eventargs e) { if (bw.workersupportscancellation == true) { bw.cancelasync(); } } private void bw_dowork(object sender, doworkeventargs e) { backgroundworker worker = sender backgroundworker; while (true) { if ((worker.cancellationpending == true)) { e.cancel = true; break; } else { string myconnection = "datasource=localhost;port=3306;username=root;password=root"; mysqlconnection condatabase = new mysqlconnection(myconnection); mysqlcommand cmddatabase = new mysqlcommand(" select * data.test; ", condatabase); mysqldatareader myreader; try { condatabase.open(); myreader = cmddatabase.executereader(); while (myreader.read()) { this.charttemperature.series["temperature"].points.addxy(myreader.getstring("datetime"), myreader.getint32("temp")); system.threading.thread.sleep(1000); } condatabase.close(); } catch (exception ex) { messagebox.show(ex.message); } } } } private void form2_load(object sender, eventargs e) { } } }
one more futile attempt...nothing happens on button click...
using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.text; using system.windows.forms; using mysql.data.mysqlclient; using system.threading; namespace project { public partial class form2 : form { private backgroundworker bw = new backgroundworker(); public string vdatetime; public int32 vtemp; public form2() { initializecomponent(); bw.workersupportscancellation = true; // bw.workerreportsprogress = false; bw.dowork += new doworkeventhandler(bw_dowork); } private void btnexit_click(object sender, eventargs e) { application.exit(); } private void btntemperature_click(object sender, eventargs e) { //if (bw.isbusy != true) //{ this.bw.runworkerasync(); //} //this.invoke((methodinvoker)delegate // { /* string myconnection = "datasource=localhost;port=3306;username=root;password=root"; mysqlconnection condatabase = new mysqlconnection(myconnection); mysqlcommand cmddatabase = new mysqlcommand(" select * data.test; ", condatabase); mysqldatareader myreader; try { condatabase.open(); myreader = cmddatabase.executereader(); while (myreader.read()) { this.charttemperature.series["temperature"].points.addxy(myreader.getstring("datetime"), myreader.getint32("temp")); } condatabase.close(); } catch (exception ex) { messagebox.show(ex.message); } //});*/ } private void btnstopupdating_click(object sender, eventargs e) { // if (bw.workersupportscancellation == true) //{ this.bw.cancelasync(); //} } private void bw_dowork(object sender, doworkeventargs e) { backgroundworker worker = sender backgroundworker; if ((worker.cancellationpending == true)) { e.cancel = true; //break; } else { string myconnection = "datasource=localhost;port=3306;username=root;password=root"; mysqlconnection condatabase = new mysqlconnection(myconnection); mysqlcommand cmddatabase = new mysqlcommand(" select * data.test; ", condatabase); mysqldatareader myreader; try { condatabase.open(); myreader = cmddatabase.executereader(); //this.invoke((methodinvoker)delegate //{ while (myreader.read()) { vdatetime = myreader.getstring("datetime"); vtemp = myreader.getint32("temp"); //thread.sleep(300); // this.charttemperature.series["temperature"].points.addxy(myreader.getstring("datetime"), myreader.getint32("temp")); // system.threading.thread.sleep(1000); } condatabase.close(); // }); } catch (exception ex) { messagebox.show(ex.message); } } } private void bw_runworkercompleted(object sender, runworkercompletedeventargs e) { if (e.cancelled) { // user canceled operation. messagebox.show("operation canceled"); } else if (e.error != null) { // there error during operation. string msg = string.format("an error occurred: {0}", e.error.message); messagebox.show(msg); } else { this.charttemperature.series["temperature"].points.addxy(vdatetime, vtemp); } } private void form2_load(object sender, eventargs e) { } } }
assuming have no way of pushing notification of changes client, going need kind of polling approach.
you setup timer (see link below) , query new data @ elapsed intervals.
http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx
i'm not sure kind of chart using, may able add new points end of series (and remove old ones front of series) may give heart-beat monitor effect mentioned... (if chart doesn't support may need rebuild it, or give entirely new series on each update)
you want adjust query using new data points on each call.. ( datetime > [maximum datetime retrieved in previous call] )
the code performs ui update still called through invoke(..) described in question...
Comments
Post a Comment