_Timer.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. using System;
  2. using System.Collections.Generic;
  3. //using System.Linq;
  4. using System.Text;
  5. using System.Collections;
  6. namespace IControls_FireManager
  7. {
  8. // 타이머는 여기 클래스에서 전담한다
  9. // Visual Studio 및 .NET Framework에는 다음 세 개의 타이머 컨트롤이 있습니다.
  10. // 서버 기반 타이머 - 도구 상자에 추가할 수 있습니다.
  11. // Windows 기반 타이머 - 도구 상자에 항상 표시됩니다.
  12. // 스레드 타이머 - 프로그래밍 방식으로 사용할 수 있습니다.
  13. // Windows 기반 타이머는 Windows Forms 응용 프로그램에서 사용하도록 최적화되어 있습니다. 서버 기반 타이머는 일반 타이머를 서버 환경에서 최적으로 실행되도록 업데이트한 것입니다.
  14. // 스레드 타이머는 이벤트 대신 콜백 메서드를 사용하는 간단한 소형 타이머로서 스레드 풀 스레드에서 제공합니다.
  15. // Win32 아키텍처에는 UI 스레드와 작업자 스레드라는 두 종류의 스레드가 있습니다. UI 스레드는 대부분의 시간을 유휴 상태로 보내며 메시지 루프에 메시지가 도착할 때까지 기다립니다.
  16. // 메시지가 도착하면 이 메시지를 처리하고 다음 메시지가 도착할 때까지 기다립니다. 이에 비해 작업자 스레드는 백그라운드 처리를 수행하는 데 사용하며 메시지 루프를 사용하지 않습니다.
  17. // Windows 타이머와 서버 기반 타이머는 모두 Interval 속성을 사용하여 실행됩니다. 스레드 타이머의 간격은 Timer 생성자에서 설정됩니다. 스레드에서 타이머를 다루는 방식을 보면 알 수 있듯이 각 타이머의 용도는 서로 다릅니다.
  18. // Windows 타이머는 UI 스레드가 프로세싱을 수행하는 데 사용하는 단일 스레드 환경을 위해 설계되었습니다. Windows 타이머의 정확도는 55밀리초로 제한되어 있습니다.
  19. // 이 일반 타이머는 사용자 코드에서 사용할 수 있는 UI 메시지 펌프가 필요하며 항상 동일한 스레드에서 실행되거나 다른 스레드로 마샬링됩니다. 이 기능은 COM 구성 요소의 성능을 저하시킵니다.
  20. // 서버 기반 타이머는 다중 스레드 환경에서 작업자 스레드와 함께 사용하도록 설계되었습니다. 두 스레드는 서로 다른 아키텍처를 사용하므로 서버 기반 타이머가 Windows 타이머보다 정확합니다.
  21. // 서버 타이머는 스레드 사이를 이동하면서 발생한 이벤트를 처리할 수 있습니다.
  22. // 스레드 타이머는 메시지가 스레드에서 펌프되지 않는 경우에 유용합니다.
  23. // 예를 들어, Windows 기반 타이머는 운영 체제의 타이머 지원 기능에 의존하며 스레드에서 메시지를 펌프하지 않을 경우에는 타이머 관련 이벤트가 발생하지 않습니다. 이 경우에는 스레드 타이머가 보다 더 유용합니다.
  24. // Windows 타이머는 System.Windows.Forms 네임스페이스에, 서버 타이머는 System.Timers 네임스페이스에 그리고 스레드 타이머는 System.Threading 네임스페이스에 있습니다.
  25. // Windows 기반 타이머
  26. public static class _Timer_WindowBase
  27. {
  28. // 중복 생성 방지용 해쉬테이블 (타이머이름, 타이머)
  29. private static Hashtable CreatedTimer = new Hashtable();
  30. // 생성
  31. // Key : 키 (해쉬테이블 CreatedTimer 전용, 타이머 태그에 저장되므로 응용바람)
  32. // Interval : 주기
  33. // _Timer_WindowBase_Handler : 이벤트핸들러 등록명
  34. // StartEnable : true 면 타이머가 생성하면 곧바로 실행한다
  35. public static void Create(string Key, int Interval, EventHandler _Timer_WindowBase_Handler, bool StartEnable)
  36. {
  37. // 키가 필요없는 경우 (관리가 필요없이 폼에서만 곧바로 타이머가 시작하고자 하는 경우)
  38. if (Key == null)
  39. {
  40. // 동적생성
  41. System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
  42. // 인터벌
  43. timer.Interval = Interval;
  44. // 핸들러 등록
  45. timer.Tick += new EventHandler(_Timer_WindowBase_Handler);
  46. // 타이머 시작여부
  47. if (StartEnable == true) timer.Start();
  48. }
  49. // 키가 있는 경우
  50. else
  51. {
  52. if (CreatedTimer.Contains(Key) == true)
  53. {
  54. //_Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.OverLapKey, 0);
  55. }
  56. else
  57. {
  58. // 동적생성
  59. System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
  60. // 인터벌
  61. timer.Interval = Interval;
  62. // 이름 등록
  63. timer.Tag = Key;
  64. // 핸들러 등록
  65. timer.Tick += new EventHandler(_Timer_WindowBase_Handler);
  66. // 해쉬에 추가
  67. CreatedTimer.Add(Key, timer);
  68. // 타이머 시작여부
  69. if (StartEnable == true) Start(Key);
  70. }
  71. }
  72. }
  73. // 시작
  74. public static void Start(string Key)
  75. {
  76. if (CreatedTimer.Contains(Key) == true)
  77. {
  78. ((System.Windows.Forms.Timer)CreatedTimer[Key]).Start();
  79. }
  80. }
  81. // 정지
  82. public static void Stop(string Key)
  83. {
  84. if (CreatedTimer.Contains(Key) == true)
  85. {
  86. ((System.Windows.Forms.Timer)CreatedTimer[Key]).Stop();
  87. }
  88. }
  89. // 삭제
  90. public static void Delete(string Key)
  91. {
  92. if (CreatedTimer.Contains(Key) == true)
  93. {
  94. ((System.Windows.Forms.Timer)CreatedTimer[Key]).Stop();
  95. CreatedTimer.Remove(Key);
  96. }
  97. }
  98. }
  99. // 서버 기반 타이머
  100. public static class _Timer_ServerBase
  101. {
  102. // 중복 생성 방지용 해쉬테이블 (타이머이름, 타이머)
  103. public static Hashtable CreatedTimer = new Hashtable();
  104. // Key : 키 (해쉬테이블 CreatedTimer 전용, 타이머 태그에 저장되므로 응용바람)
  105. // Interval : 주기
  106. // _Timer_ServerBase_Handler : 이벤트핸들러 등록명
  107. // StartEnable : true 면 타이머가 생성하면 곧바로 실행한다
  108. public static void Create(string Key, int Interval, System.Timers.ElapsedEventHandler _Timer_ServerBase_Handler)
  109. {
  110. // 키가 필요없는 경우 (관리가 필요없이 폼에서만 곧바로 타이머가 시작하고자 하는 경우)
  111. if (Key == null)
  112. {
  113. // 동적생성
  114. System.Timers.Timer timer = new System.Timers.Timer();
  115. // 인터벌
  116. timer.Interval = Interval;
  117. // 핸들러 등록
  118. timer.Elapsed += new System.Timers.ElapsedEventHandler(_Timer_ServerBase_Handler);
  119. // 타이머 시작여부
  120. timer.Start();
  121. }
  122. // 키가 있는 경우
  123. else
  124. {
  125. if (CreatedTimer.Contains(Key) == true)
  126. {
  127. //_Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.OverLapKey, 0);
  128. }
  129. else
  130. {
  131. // 동적생성
  132. System.Timers.Timer timer = new System.Timers.Timer();
  133. // 인터벌
  134. timer.Interval = Interval;
  135. // 핸들러 등록
  136. timer.Elapsed += new System.Timers.ElapsedEventHandler(_Timer_ServerBase_Handler);
  137. // 해쉬에 추가
  138. CreatedTimer.Add(Key, timer);
  139. }
  140. }
  141. }
  142. // 시작
  143. public static void Start(string Key)
  144. {
  145. if (CreatedTimer.Contains(Key) == true)
  146. {
  147. ((System.Timers.Timer)CreatedTimer[Key]).Start();
  148. }
  149. }
  150. // 정지
  151. public static void Stop(string Key)
  152. {
  153. if (CreatedTimer.Contains(Key) == true)
  154. {
  155. ((System.Timers.Timer)CreatedTimer[Key]).Stop();
  156. }
  157. }
  158. // 삭제
  159. public static void Delete(string Key)
  160. {
  161. if (CreatedTimer.Contains(Key) == true)
  162. {
  163. ((System.Timers.Timer)CreatedTimer[Key]).Stop();
  164. CreatedTimer.Remove(Key);
  165. }
  166. }
  167. }
  168. }