학습 의 길 3: 단일 스 레 드 와 의뢰 및 이벤트 사용자 정의 Timer 류 활용
27756 단어 timer
여기 서 나의 학습 느낌 을 기록 하고 큰 소의 블 로그 글 을 몇 개 첨부 하면 가 볼 수 있 습 니 다!
http://www.cnblogs.com/kevin-moon/archive/2009/04/24/1442469.html
http://www.cnblogs.com/rentiansheng/archive/2011/02.html , 스 레 드 지식 은 여전히 깊이 있 습 니 다!
자, 본론 으로 들 어가 자. Let 's Go...
1. 머리말
시간 간격 으로 데 이 터 를 동적 으로 새로 고치 거나 동적 시 계 를 만 들 려 고 할 때 (이러한 수요 와 유사). NET Framework 의 Timer 류 를 사용 하 는 것 을 생각 하 게 되 고. NET Framework 에 서 는 세 가지 유형 으로 나 뉜 다.
· System.Windows.Forms.Timer
· System.Threading.Timer
· System.Timers.Timer
상기 세 가지 종류의 사용 에 대해 여러분 은 다소 접촉 하고 이 벤트 를 등록 하 며 실행 할 방법 을 연결 한 다음 에 시계의 간격 을 설정 하면 프로그램 이 실 행 될 때 자동 으로 터치 합 니 다!
2. 생각
만약 에 여러분 이 위의 세 가지 종 류 를 사용 하지 않 는 다 면 몇 초 간격 으로 데 이 터 를 갱신 하거나 동적 시 계 를 만 드 는 다른 방법 이 있 지 않 을까요?
답 은 확실 해!
3. 사고방식
활용 한 지식:
① 의뢰
② 사건
③ 스 레 드
실현 방향:
① 클 라 이언 트 에서 이벤트 등록 을 통 해 실행 할 방법 을 연결 합 니 다.
② 서버 에서 이 벤트 를 수행 하 는 방법 을 무한 순환 환경 에 두 도록 합 니 다.
③ 스 레 드 를 만 들 고 이 벤트 를 수행 하 는 방법 을 스 레 드 에 전달 하 며 스 레 드 를 배경 으로 실행 하고 스 레 드 의 간격 (Thread. sleep) 으로 설정 합 니 다.
④ 마지막 으로 이 스 레 드 를 호출 하면 즉시 새로 고침 이 가능 합 니 다.
그림:
4. 코드 구현
1 /*
2 , ,
3 *
4 */
5 public delegate void CustomHander(object sender, CustomEventArgs e); // → + Handler,
6 public class CustomTimer : IDisposable
7 {
8 private CustomHander _customHandler; //
9 private int _distance; //
10 private int _start; //
11 private bool _flag = true; // , True
12 private Thread _thread; //
13 private CustomEventArgs _customEventArgs = new CustomEventArgs("Yang Cao Gui"); //
14
15 public event CustomHander CustomTick;
16
17 public CustomTimer() // ,
18 : this(null, 1000, 0)
19 { }
20 public CustomTimer(int distance)
21 : this(null, distance, 0)
22 { }
23 public CustomTimer(int distance, int start)
24 : this(null, distance, start)
25 { }
26 public CustomTimer(CustomHander handler, int distance, int start)
27 {
28 this._customHandler = handler;
29 this._distance = distance;
30 this._start = start;
31 Connect(); //
33 }
34
35 private void OnCustomTick() // On + , ,.NET Framework
36 {
37 try
38 {
39 while (true) //
40 {
41 if (this._flag == false) //
42 {
43 return;
44 }
45 Thread.Sleep(this.DistanceTime);
46 if (this._customHandler == null)
47 {
48 this._customHandler = CustomTick; //
49 }
50 if (this._customHandler != null)
51 {
52 this._customHandler(this, _customEventArgs);
53 }
55 }
56 }
57 catch (Exception ex)
58 {
59 throw ex;
60 }
61 }
62
63 private void Connect() // Timer , !
64 {
65 if (this.StartTime > 0)
66 {
67 Thread.Sleep(this.StartTime);
68 }
69 if (this._thread == null) //
70 {
71 this._thread = new Thread(new ThreadStart(OnCustomTick)); //
72 this._thread.IsBackground = true; //
73 this._thread.Start();
74 }
75 }
76
77 public void Start() //
78 {
79 this._flag = true;
80 // ,
81 this.Connect();
82 }
83
84 public void Stop() //
85 {
86 this._flag = false;
87 }
94 public void Dispose() //
95 {
96 //this._thread.IsBackground = false;
97 this._thread.Abort();
98 this.Dispose();
99 GC.Collect();
111 }
112
113 public int DistanceTime //
114 {
115 get { return this._distance; }
116 set { this._distance = value; }
117 }
118
119 public int StartTime //
120 {
121 get { return this._start; }
122 set { this._start = value; }
123 }
124 }
125
126 public class CustomEventArgs : EventArgs // , EventArgs,
127 {
128 public CustomEventArgs(string message)
129 {
130 this.Message = message;
131 }
132
133 public string Message
134 { get; set; }
135 }
클 라 이언 트 호출 (Winform 프로그램):
1 public partial class Form1 : Form
2 {
3 MyCustom.CustomTimer customTimer; //
4
5 public Form1()
6 {
7 InitializeComponent();
8 }
9
10 private void Form1_Load(object sender, EventArgs e)
11 {
12 this.textBox1.Text = DateTime.Now.ToString();
13 customTimer = new MyCustom.CustomTimer(1000, 0); // ,
14 customTimer.CustomTick += new MyCustom.CustomHander(customTimer_CustomTick); //
15 this.button1.Click += new EventHandler(button1_Click);
16 this.button2.Click += new EventHandler(button2_Click);
17 //customTimer.Close();
18 }
19
20 void customTimer_CustomTick(object sender, MyCustom.CustomEventArgs e)
21 {
22 this.textBox1.Text = String.Empty;
23 this.textBox1.Text = DateTime.Now.ToString();
25 }
27
28 void button2_Click(object sender, EventArgs e) //
29 {
30 customTimer.Stop();
32 }
33
34 void button1_Click(object sender, EventArgs e) //
35 {
36 customTimer.Start();
37 }
38 }
5. 총화
이 작은 실험 을 통 해 저 는. NET Framework 의 의뢰 와 사건 체제 에 대해 어느 정도 알 게 되 었 습 니 다. 특히 → void button2_Click (object sender, EventArgs e) 의 두 매개 변수 에 대한 이 해 는 더욱 제거 되 었 다 는 인식 을 가지 게 되 었 습 니 다!
두 매개 변수 에 대한 이해:
① object sender: 사건 을 수행 할 때 이 매개 변수의 값 은 'this' 입 니 다. 즉, 이 매개 변 수 는 이 사건 을 포함 하 는 대상 입 니 다. 이 를 사용 하려 면 강제 전환 을 할 수 있 습 니 다. object 형식 이기 때 문 입 니 다. 예 를 들 어:
Button btn = (Button)sender as Button; MessageBox.Show(btn.Text);
이것 은 Button 단추 의 전환 입 니 다. 다른 컨트롤 도 이렇게 합 니 다. 특히 GridView 를 사용 할 때 이런 전환 이 필요 합 니 다!
② EventArgs e: 이것 은 사실 이해 하기 쉽 습 니 다. 대부분의 컨트롤 은 자신의 실체 정보 류 가 있 기 때문에 이 대상 이 사건 을 통 해 정 보 를 전달 하고 싶다 면 이 정보 류 를 통 해 만 전달 되 고 모든 정보 류 는 EventArgs 와 같은 기 류 를 계승 해 야 합 니 다!예:
void button2_Click (object sender, EventArgs e) {customTimer. Stop (); Button btn = (Button) sender as Button; Message Box. Show (btn. Text); / / 단 추 는 자신의 정보 류 가 없 기 때문에 EventArgs 라 는 기본 클래스 로 직접 전 달 됩 니 다. 따라서 정보 가 없습니다!}
관심 이 있다 면 Reflector 를 사용 하여 다른 컨트롤 의 정보 류 를 볼 수 있 습 니 다!
6. 의문
처음에 제 가 테스트 를 할 때 프로그램 이 몇 번 실행 되면 → "TestCustomTimer. vshost. exe" 라 는 파일 이 다른 프로 세 스에 서 사용 되 고 있 습 니 다. 그리고 작업 관리자 로 강제로 닫 히 지만 끄 면 계속 나타 납 니 다!
마지막 으로 항목 속성 우 클릭 → Debug 메뉴 찾기 →
이렇게 해서 해결 되 었 습 니 다. 그러나 저 는 자 료 를 찾 아 봤 습 니 다. 제 가 자원 을 방출 하지 않 았 기 때 문 이 라 고 말 했 습 니 다. 저 는 제 스 레 드 자원 이 방출 되 지 않 았 을 수도 있다 는 것 을 알 고 있 습 니 다. 하지만 저 는 몇 밤 동안 해결 할 방안 을 생각 하지 못 했 습 니 다. 사실은 이 일 을 하면 제 가 의뢰, 스 레 드, 사건 에 대한 이 해 를 추진 할 수 있 을 뿐 다른 것 도 아무것도 없습니다!
만약 여러분 이 어떤 상황 인지 알 고 있다 면, 저 에 게 메 시 지 를 남 겨 주세요!Thanks!
인터넷 상의 한 형제 가 나 에 대한 지도 에 감사 드 립 니 다!
학습 에서 깊이, 실천 에서 향상, 여기 서 여러분 의 설날 즐거움 을 기원 합 니 다. 며칠 전에 인터넷 에서 영화 표를 공동 구 매 했 기 때문에 설날 에 영 화 를 보 러 가 려 고 합 니 다. 멋 지게, o (∩ ∩) o......
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바스크립트로 타이머 만들기JavaScript와 HTML만 사용하여 간단한 타이머를 만들어 보겠습니다. 먼저 인터페이스를 만들고 HTML만 사용하여 간단한 작업을 수행합니다. HTML 구조에서 시간 정보를 표시하기 위해 일부span가 생성되었...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.