Пример потока таймер на форме

C Sharp > Пример потока таймер на форме
29.11.2012 13:51:51



Статья:

Все кто смотрел первый курс по c# (Windows Forms) немало услышали про потоки, но, все таки сам для себя захотел сделать часики. Вот решил опубликовать.

Стоит напомнить, что при запуске программы запускается главный поток, и когда мы перетягиваем контроли на форму,- они создаются в главном потоке. Так вот, для того чтоб в другом потоке манипулировать этими контролами, мы прибегаем к методу Invoke(), который имеет две перегрузки и напрямую связан с делегатом!
 
Итак, создаем Windows Forms приложение. Перетаскиваем на форму один элемент Label.
 
Вот код:
 




view plaincopy to clipboardprint?
01.namespace Clock 
02.{ 
03. 
04.    public partial class Form1 : Form 
05.    { 
06.        // делегат для манипулирования лейбом 
07.        public delegate void DelegateForTime(Label label); 
08. 
09.        // поле типа делегата 
10.        DelegateForTime DelTime; 
11. 
12.        // поток 
13.        Thread t1; 
14. 
15.        public Form1() 
16.        { 
17.            InitializeComponent(); 
18.            DelTime = new DelegateForTime(StartTime);// указываем метод делегату 
19.        } 
20. 
21.        private void Form1_Load(object sender, EventArgs e) 
22.        { 
23.            t1 = new Thread(LabelTime); // создаем поток 
24.            t1.IsBackground = true; // задаем фоновый режым 
25.            t1.Priority = ThreadPriority.Lowest; // указываем свмый низкий приоритет 
26.            t1.Start(); // стартуем 
27.        } 
28. 
29.        // устанавливает время 
30.        void StartTime(Label label) 
31.        { 
32.                // выводим всегда две цыфры  
33.                // (00:00) 
34.                string s = DateTime.Now.Hour.ToString("00"); 
35.                s += " : "; 
36.                s += DateTime.Now.Minute.ToString("00"); 
37. 
38.                s += " : " + DateTime.Now.Second.ToString("00"); 
39.                label.Text = s; 
40.        } 
41. 
42. 
43.        void LabelTime() 
44.        { 
45.            // безконечный цыкл 
46.            while (true) 
47.            {                   
48.                Invoke(DelTime, label1);// запускаем метод с главного потока            
49.            } 
50.        } 
51.    } 
52.} 
 

Важный момент, это создание делегата и указание метода в главном потоке:
 




view plaincopy to clipboardprint?
01.public Form1() 
02.{ 
03.    InitializeComponent(); 
04.    DelTime = new DelegateForTime(StartTime);// указываем метод делегату 
05.} 
 

А при загрузке формы, создается новый поток, вызывается метод LabelTime() в котором с помощью метода Invoke(), связываем делегат DelTime c методом StartTime(…), и вторым параметром передаем ему сам Label. Таким образом, мы добились того, что можем манипулировать контролами, которые были созданы в главном потоке созданы.