ERLEDIGT
JA
JA
ANTWORTEN
3
3
ZUGRIFFE
1164
1164
EMPFEHLEN
-
23.11.09 15:22 #1
- Registriert seit
- May 2007
- Ort
- Ostmanien
- Beiträge
- 33
Hallo!
Ich hab ein Problem mit dem System.Timer in meiner Applikation.
Jedesmal wenn der Timer die Ausführung startet, blockiert meine gesamte Applikation.
Nun ja, dann hab ich mir gedacht ich spendier diesen System.Timer (der ja
eigentlich schon ein eigener Thread ist und vom Prinzip her nichts anderes ist als
ein System.Threading.Timer) zusätzlich einen eigenen Thread.
Aber auch das hat nichts geholfen.
Hat hier irgendjemand eine Ahnung, ob das mit einer Prozess - Priorität der Timers
allgemein zu tun hat und wie man dies unterbinden könnte, sodass der Timer sowie dessen Ausführung im Hintergrund arbeitet und man in der Applikation
*normal* weiterarbeiten kann?
Wäre echt fein wenn mir jemand weiterhelfen könnte.
Beste Grüße!
Hier das kleine Codeschnippsel:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
using System; using System.Threading; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.Sql; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace SystemTimer { public partial class Form1 : Form { public const string constr = @"Database=;Server=localhost;user id=;password="; System.Timers.Timer tmrs = new System.Timers.Timer(); private AutoResetEvent autoEvent; private DataSet dts = new DataSet(); delegate void delTmrTest(); public Form1() { InitializeComponent(); List<int> list = new List<int>(12); for (int i = 15; i <= 180; i += 15) list.Add(i); comboBox1.DataSource = list; tmrs.Elapsed += new System.Timers.ElapsedEventHandler(tmrs_Elapsed); } private void fillDataGrid() { dataGridView1.DataSource = dts.Tables[0]; } void tmr(object interval) { autoEvent = new AutoResetEvent(false); tmrs.Interval = Convert.ToInt32(interval); tmrs.AutoReset = true; tmrs.Start(); } void tmrs_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { BeginInvoke(new delTmrTest(showGridWithData)); } private void showGridWithData() { string sqlSelect = "SELECT * FROM TestTable"; SqlDataAdapter adr = new SqlDataAdapter(sqlSelect, constr); adr.Fill(dts); dataGridView1.DataSource = dts.Tables[0]; textBox1.Text += "Timer Event " + Environment.NewLine + DateTime.Now.ToString("hh:mm:ss.fff"); } private void button1_Click(object sender, EventArgs e) { Thread t1 = new Thread(new ParameterizedThreadStart(tmr)); int interval = Convert.ToInt32(comboBox1.SelectedItem) * 1000; t1.Start(interval); } private void comboBox1_SelectedIndexChanged(object s, EventArgs e) { if (comboBox1.SelectedItem != null && tmrs != null) { tmrs.Stop(); tmrs.Interval = Convert.ToInt32(comboBox1.SelectedItem) * 1000; tmrs.Start(); } } } }
-
23.11.09 16:04 #2
- Registriert seit
- Aug 2001
- Ort
- Österreich, Stmk, Graz
- Beiträge
- 2.783
Hi.
Ich hab das ganze mal ausprobiert, allerdings anstatt der Datenbank abfrage hab ich mir das DataSet sozusagen von Hand befüllt.
Dabei gabs keine Probleme, die Anwendung hat durch und durch reagiert.
Das Problem wird also die Abfrage sein. Der ganze Code mit dem Timer läuft ja in nem anderne Thread, der kann also gar nicht blockieren.
Also probiers vielleicht mal so rum:
Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
void tmrs_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { //BeginInvoke(new delTmrTest(showGridWithData)); showGridWithData(); } private void showGridWithData() { string sqlSelect = "SELECT * FROM TestTable"; SqlDataAdapter adr = new SqlDataAdapter(sqlSelect, constr); adr.Fill(dts); Invoke((MethodInvoker)delegate() { dataGridView1.DataSource = dts.Tables[0]; textBox1.Text += "Timer Event " + Environment.NewLine + DateTime.Now.ToString("hh:mm:ss.fff"); }); }
lg,..
With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
Aaron Satie
Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
Captain Jean-Luc Picard, Stardate ~41294.5
Tutorials.de chattet. Hier gibts auch .net Support ^^
Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de
(moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions
-
23.11.09 16:48 #3
- Registriert seit
- May 2007
- Ort
- Ostmanien
- Beiträge
- 33
Servus Alex

Natürlich ist das *Problem* die Abfrage, weil Sie eben etwas länger dauert.
Und genau da liegt der Drache im Moorbad verscharrt:
Sobald die Abfrage gestartet wird und die Daten geladen werden, blockiert die Applikation.
Sollte doch nicht sein wenn es in einem eigenen Thread läuft.
Ist ja auch *nur* eine Ausführung
Oder habe ich da ein wesentliches Verständnisproblem?
Ich muss auch anmerken das ich das mit dem DataSet in diesen Testprojekt mache.
Im eigentlichen Projekt werden die Daten mittels DataReader und einer eigenen Tables - Klasse geladen und dem grid zugewiesen.
Aber trotzdem sehr elegant mit der anonymen methode beim Delegate
wenns im endeffekt auch leider den gleichen effekt hat
-
24.11.09 12:26 #4
- Registriert seit
- May 2007
- Ort
- Ostmanien
- Beiträge
- 33
So jetzt hab ich das ganze nochmal ausgetestet und bin zu folgendem Ergebnis gekommen.
Es ist tatsächlich so, dass bei Invoke, also der Threadrückführung, das Blockieren der Anwendung passiert und nicht bei der Abfrage der Daten
.
In meinem Fall also bei der Zuweisung der Daten zum DataGrid.
Auf ein minimum reduzieren konnte ich das Blockieren der Anwendung, indem ich die Invoke - Eigenschaft des Controls verwende und innerhalb dessen die Zuweisung durchführe.
Danke nochmal an Alex für die Hilfe beim Verstehen der Problematik!!
Ähnliche Themen
-
Timer beim Senden in der Client-/Server-Anwendung
Von SaschaK im Forum C/C++Antworten: 0Letzter Beitrag: 05.09.07, 20:05 -
CpoyFileEx blockiert Anwendung
Von Opscript im Forum C/C++Antworten: 2Letzter Beitrag: 24.10.06, 13:02 -
Anwendung in System Tray minimieren
Von Azathoth im Forum VisualStudio & MFCAntworten: 2Letzter Beitrag: 16.11.04, 10:09 -
USB Festplatte blockiert System
Von zeromancer im Forum HardwareAntworten: 0Letzter Beitrag: 09.07.04, 22:53 -
Programm gesucht - anwendung aufrufen per timer
Von Phil@proggen im Forum C/C++Antworten: 6Letzter Beitrag: 20.01.04, 19:37





Zitieren

Login





