CommThread.cpp 9.3 KB

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