CommThread.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. /****************************************************************************
  2. * @source : CommThread.cpp
  3. * @description : Comm Thread class
  4. ****************************************************************************
  5. * DATE AUTHOR DESCRIPTION
  6. * --------------------------------------------------------------------------
  7. * 2012/03/09 CYM [100] First Cut
  8. *
  9. ****************************************************************************/
  10. //---------------------------------------------------------------------------
  11. #include "AppGlobalF.h"
  12. #include "CommThread.h"
  13. #include "DMCOMMF.h"
  14. #include "FrmSysLogF.h"
  15. //---------------------------------------------------------------------------
  16. #pragma package(smart_init)
  17. //---------------------------------------------------------------------------
  18. // Important: Methods and properties of objects in VCL can only be
  19. // used in a method called using Synchronize, for example:
  20. //
  21. // Synchronize(UpdateCaption);
  22. //
  23. // where UpdateCaption could look like:
  24. //
  25. // void __fastcall TCommThread::UpdateCaption()
  26. // {
  27. // Form1->Caption = "Updated in a thread";
  28. // }
  29. //---------------------------------------------------------------------------
  30. /*
  31. * 스레드 생성자
  32. * arguments
  33. * void
  34. * return
  35. * void
  36. */
  37. __fastcall TCommThread::TCommThread(bool CreateSuspended)
  38. : TThread(CreateSuspended)
  39. {
  40. TCommThread();
  41. }
  42. //---------------------------------------------------------------------------
  43. /*
  44. * 스레드 초기화
  45. * arguments
  46. * void
  47. * return
  48. * void
  49. */
  50. __fastcall TCommThread::TCommThread(void)
  51. : TThread(true)
  52. {
  53. Priority = tpNormal;
  54. FreeOnTerminate = true;
  55. Resume();
  56. }
  57. //---------------------------------------------------------------------------
  58. /*
  59. * 스레드 소멸자
  60. * arguments
  61. * void
  62. * return
  63. * void
  64. */
  65. __fastcall TCommThread::~TCommThread(void)
  66. {
  67. }
  68. //---------------------------------------------------------------------------
  69. /*
  70. * 스레드 실행
  71. * arguments
  72. * void
  73. * return
  74. * void
  75. */
  76. void __fastcall TCommThread::Execute()
  77. {
  78. MSG msg;
  79. int result;
  80. ::CoInitialize(NULL);
  81. NameThreadForDebugging("CommThread");
  82. while(!Terminated)
  83. {
  84. try
  85. {
  86. if (GetMessage(&msg, NULL, 0, 0) == 0)
  87. {
  88. Terminate();
  89. }
  90. else
  91. {
  92. result = SYS_ERR_NONE;
  93. try
  94. {
  95. DisplayMsg(msg.message);
  96. if (msg.message != WM_THREAD_TERMINATE)
  97. {
  98. if (!DMCOMM->DbConnect(g_AppCfg.db.sConnectStr))
  99. {
  100. result = SYS_ERR_DATABASE;
  101. }
  102. }
  103. if (result == SYS_ERR_NONE)
  104. {
  105. switch (msg.message)
  106. {
  107. case WM_DATABASE_REFLASH:
  108. //result = DMCOMM->GetDbSysdate();
  109. break;
  110. case WM_PROCESS_STATE:
  111. result = DMCOMM->SaveProcessStateProc();
  112. break;
  113. case WM_EQUIP_STATE_ALL:
  114. result = DMCOMM->SaveEquipStateAllProc();
  115. break;
  116. case WM_EQUIP_STATE:
  117. result = DMCOMM->SaveEquipStateProc((TVmsCtlr*)msg.wParam, msg.lParam);
  118. break;
  119. break;
  120. case WM_GET_ONOFF:
  121. result = DMCOMM->LoadVmsOnOffTime();
  122. result = DMCOMM->GetVmsLuminanceTime();
  123. break;
  124. case WM_DOWNLOAD_PROC:
  125. result = DMCOMM->GetVmsDownLoadInfo();
  126. break;
  127. case WM_MASTER_IMAGE_SYMBOL:
  128. case WM_MASTER_IMAGE_TRAFFIC:
  129. result = DMCOMM->GetVmsImage();
  130. break;
  131. case WM_MASTER_FORM:
  132. result = DMCOMM->LoadVmsForm();
  133. break;
  134. case WM_MASTER_VMS_IFSC:
  135. result = DMCOMM->GetVmsIfscInfo();
  136. break;
  137. case WM_DATA_SAVE:
  138. //result = DMCOMM->DataSaveProc((void *)msg.wParam);
  139. break;
  140. case WM_PROVIDE_PROC:
  141. result = DMCOMM->ProvideProc((void *)msg.wParam);
  142. break;
  143. case WM_SAVE_DOWNLOAD_FORM:
  144. result = DMCOMM->SaveVmsDownloadForm();
  145. break;
  146. case WM_PROVIDE_SAVE:
  147. result = DMCOMM->ProvideSave((void *)msg.wParam);
  148. break;
  149. case WM_CHECK_SAFE_ALARM:
  150. result = DMCOMM->CheckSafeAlarm();
  151. if (result > 0)
  152. {
  153. SendMessage((HWND)g_AppCfg.lMainWinHandle, WM_USER, WM_MAKE_SAFE_ALARM, 0);
  154. }
  155. break;
  156. case WM_THREAD_TERMINATE:
  157. Terminate();
  158. break;
  159. }
  160. }
  161. }
  162. catch(Exception &e)
  163. {
  164. result = SYS_ERR_DATABASE;
  165. }
  166. if (msg.message == WM_PROVIDE_PROC)
  167. {
  168. SendMessage((HWND)g_AppCfg.lMainWinHandle, WM_USER, WM_MAKE_DOWNLOAD_FORM, 0);
  169. }
  170. if (msg.message != WM_THREAD_TERMINATE)
  171. {
  172. if (result == SYS_ERR_NONE)
  173. {
  174. DMCOMM->DbState(true);
  175. }
  176. else
  177. {
  178. DMCOMM->DbState(false);
  179. LERROR("result error: [%X] %d", msg.message, result);
  180. }
  181. DMCOMM->DbClose();
  182. }
  183. }
  184. }
  185. catch(Exception &e)
  186. {
  187. }
  188. }
  189. if (g_SysInfo->State.hFinishEvent != NULL)
  190. {
  191. SetEvent(g_SysInfo->State.hFinishEvent);
  192. }
  193. ::CoUninitialize();
  194. }
  195. //---------------------------------------------------------------------------
  196. void TCommThread::DisplayMsg(unsigned int AMsg)
  197. {
  198. AnsiString sMsg = "";
  199. switch (AMsg)
  200. {
  201. case WM_DATABASE_REFLASH: sMsg = "WM_DATABASE_REFLASH"; break;
  202. case WM_PROCESS_STATE: sMsg = "WM_PROCESS_STATE"; break;
  203. case WM_EQUIP_STATE_ALL: sMsg = "WM_EQUIP_STATE_ALL"; break;
  204. case WM_EQUIP_STATE: sMsg = "WM_EQUIP_STATE"; break;
  205. case WM_MASTER_FORM: sMsg = "WM_MASTER_FORM"; break;
  206. case WM_MASTER_IMAGE_SYMBOL: sMsg = "WM_MASTER_IMAGE_SYMBOL"; break;
  207. case WM_MASTER_IMAGE_TRAFFIC: sMsg = "WM_MASTER_IMAGE_TRAFFIC"; break;
  208. case WM_MASTER_VMS_IFSC: sMsg = "WM_MASTER_VMS_IFSC"; break;
  209. case WM_DATA_SAVE: sMsg = "WM_DATA_SAVE"; break;
  210. case WM_GET_ONOFF: sMsg = "WM_GET_ONOFF"; break;
  211. case WM_PROVIDE_PROC: sMsg = "WM_PROVIDE_PROC"; break;
  212. case WM_SAVE_DOWNLOAD_FORM: sMsg = "WM_SAVE_DOWNLOAD_FORM"; break;
  213. case WM_PROVIDE_SAVE: sMsg = "WM_PROVIDE_SAVE"; break;
  214. case WM_DOWNLOAD_PROC: sMsg = "WM_DOWNLOAD_PROC"; break;
  215. case WM_THREAD_TERMINATE: sMsg = "WM_THREAD_TERMINATE"; break;
  216. default: sMsg.printf("UNKNOWN MESSAGE: %02X", (BYTE)(AMsg-WM_USER)); break;
  217. }
  218. LDEBUG("%s", sMsg.c_str());
  219. }
  220. //---------------------------------------------------------------------------
  221. int TCommThread::LogWrite(int ALogKind, char *AFmt, ...)
  222. {
  223. va_list ap;
  224. int cnt = 0;
  225. char szFmtData[MAX_LOG_BUFFER];
  226. AnsiString sLogKind;
  227. int nStep = 0;
  228. bool bLog = false;
  229. switch(ALogKind)
  230. {
  231. case eLOG_INFO : bLog = g_LogCfg.Info; sLogKind = " [INF] "; break;
  232. case eLOG_DATA : bLog = g_LogCfg.Data; sLogKind = " [DAT] "; break;
  233. case eLOG_ERROR : bLog = g_LogCfg.Error; sLogKind = " [ERR] "; break;
  234. case eLOG_WARNING: bLog = g_LogCfg.Warning; sLogKind = " [WAN] "; break;
  235. case eLOG_DEBUG : bLog = g_LogCfg.Debug; sLogKind = " [DBG] "; break;
  236. case eLOG_DETAIL : bLog = g_LogCfg.Detail; sLogKind = " [DET] "; break;
  237. }
  238. if (!bLog) return -1;
  239. try
  240. {
  241. va_start(ap, AFmt);
  242. cnt = vsprintf(szFmtData, AFmt, ap);
  243. va_end(ap);
  244. nStep = 1;
  245. ITSLog->LogWrite(NULL, ALogKind, szFmtData);
  246. nStep = 2;
  247. //IPC_LOG_MESSAGE *pLog = new IPC_LOG_MESSAGE;
  248. IPC_LOG_MESSAGE *pLog = &FLogMsg;//(IPC_LOG_MESSAGE *)malloc(sizeof(IPC_LOG_MESSAGE));
  249. if (pLog)
  250. {
  251. pLog->Kind = ALogKind;
  252. pLog->Flag = 0;
  253. pLog->Len = strlen(szFmtData);
  254. pLog->Tm = Now();
  255. memset(pLog->Msg, 0x00, sizeof(pLog->Msg));
  256. sprintf(pLog->Msg, "%sTHRD %s", sLogKind.c_str(), szFmtData);
  257. DWORD dwResult = 0;
  258. LRESULT lResult = SEND_LOGMSG(FrmSysLog->Handle, WM_LOG_DISPLAY, pLog, NULL, SMTO_NORMAL, 2000, dwResult);
  259. if (lResult == 0)
  260. {
  261. dwResult = GetLastError();
  262. if (dwResult == ERROR_TIMEOUT)
  263. {
  264. }
  265. //SAFE_DELETE(pLog);
  266. }
  267. }
  268. }
  269. catch(Exception &e)
  270. {
  271. LERROR("LogWrite: %d", nStep);
  272. }
  273. return cnt;
  274. }
  275. //---------------------------------------------------------------------------