Probleme mit Threads
-
Hi !
Ich möchte in einer Funktion einen bestimmten Teil timergesteuert ablaufen lassen. zB. eine sec. irgendwas aufaddieren.
Aber wenn ich den WindowsFormTimer mit den Werten aus meiner Funktion arbeiten lassen möchte,
sind die Variablen aus meiner Funktion im Timer nicht bekannt.
Habe gehört, das es mit Threads funktionieren soll, weil die ja die bis dato angelegten Variablen erben.
Weiß eventuell jemand wie das funktioniert ?Gruß Robin
-
SW-Progger schrieb:
sind die Variablen aus meiner Funktion im Timer nicht bekannt.Wenn du Variablen in einer Methode deklarierst, ist deren Gültigkeitsbereich auch NUR in dieser Funktion, vielleicht hilfts wenn du Sie als Felder deklarierst, damit Du auf die Variablen aus der ganzen Klasse heraus zugreifen kannst.
Bezüglich Deiner Frage insgesamt. Du kannst einen Timer selbst programmieren. Über einen Thread lasst du ne Schleife laufen deren Abbruchbedingung eine boolesche Variable ist, welche du bei Programmende auf false setzt.
Innerhalb dieses Thread kannste du Funktionsaufrüfe starten oder mit Events arbeiten.
hier mal die Rohfassung für einen Thread.
Thread applicationTimer = new Thread(new ThreadStart(Timer)); application.Start(); private void Timer() { }
Dafür brauchst den Namespace System.Threading. Wo du die Dekleration für applicationTimer, und den Aufruf für application.Start() in Deinem Programm unterbringst bleibt natürlich die überlassen.
hoffe das hilft
Gruß
Markus Seidl
-
Ich mach dazu mal ein kleines eigenes Beispiel, das halbwegs Sinn auch hat ..
Nehmen wir an, du codest gerade ein kleines ICQ-ähnliches Messenger Programm.
Nun möchtest du, dass alle 5 Minuten überprüft wird, ob jemand aus deiner
Kontaktliste online gegangen ist, dann hast du eben auch als 'Parameter'
die Kontaktliste, die sich aber ständig ändern könnnen soll.public class ContactController { private List<Contact> contactList; private List<Contact> onlineContacts; private Timer timer; public ContactController() { timer = new Timer(); timer.Interval = 1000 * 60 * 5 timer.TickEvent += new EventHandler(UpdateList); // TickEvent steht in dem Fall, für eben dein spezifisches Event // abhängig von der Timer-Klasse, die du verwendest. Gibt ja // immerhin 3 versch. mit unterschiedlichen Einsatzgebieten. } public Contact[] ContactList { get { return contactList.ToArray(); } set { contactList = new List<Contact>(value); } } public Contact[] OnlineContacts { get { return onlineContacts.ToArray(); } } private void UpdateList(object sender, EventArgs e) { List<Contact> newOnlineList = new List<Contact>(onlineList.Count); foreach(Contact contact in contactList) { if(contact.IsOnline) { newOnlineList.Add(contact); } } onlineList = newOnlineList; } }
Nun kannst du deine 'Parameter' (in diesem Fall also contactList) also immer
neu setzen, bzw. das 'Ergebniss' der Funktion auch als Field implementieren.Denke mal das sollte eigentlich klar sein ..