ZBLOG

UINT CMainWnd::GetUkeySizeThread(LPVOID lparam) { CMainWnd* pWnd = (CMainWnd*)lparam; CString modulePath = CUtility::GetModulePath(NULL); CString filePath = modulePath + _T("ConnectionState.log"); // 创建 Logger 对象,指定日志文件名 Logger logger(filePat...

你提供的代码段包含两个线程函数 GetUkeySizeThreadConnectThread,它们分别用于检查 UKEY 连接状态和网络连接状态。以下是对这两个函数的分析和一些改进建议:

1. GetUkeySizeThread

功能

  • 检查 UKEY 的连接状态。
  • 使用一个循环每隔 10 秒检查一次。
  • 在日志文件中记录 UKEY 的连接状态。

改进建议

  • 内存管理: 当前使用了 new 分配内存,但没有对应的 delete 操作。应在不再需要 arrUKEYInfo 时释放它。
  • 异常处理: 在捕获异常后,可以考虑记录异常信息,以便后续调试。

示例代码改进

  1. UINT CMainWnd::GetUkeySizeThread(LPVOID lparam)
  2. {
  3. CMainWnd* pWnd = (CMainWnd*)lparam;
  4. CString modulePath = CUtility::GetModulePath(NULL);
  5. CString filePath = modulePath + _T("ConnectionState.log");
  6. Logger logger(filePath);
  7. BOOL bConnect = FALSE;
  8. while (TRUE)
  9. {
  10. try
  11. {
  12. int nKeyNum = UKEY_SIZE;
  13. UKEYINFO* arrUKEYInfo = new UKEYINFO[nKeyNum];
  14. char* arrInfo[2][5] = {
  15. { "FT", "PID_0713", "VID_096E", "", "USB" },
  16. { "WQ", "PID_0620", "VID_163C", "", "USB" }
  17. };
  18. for (int i = 0; i < nKeyNum; i++)
  19. {
  20. arrUKEYInfo[i].pszUKEYType = arrInfo[i][0];
  21. arrUKEYInfo[i].pszPID = arrInfo[i][1];
  22. arrUKEYInfo[i].pszVID = arrInfo[i][2];
  23. arrUKEYInfo[i].pszCDROMPath = arrInfo[i][3];
  24. arrUKEYInfo[i].pszClassDevice = arrInfo[i][4];
  25. }
  26. BOOL bInit = CUtility::InitializeUKEYInfo(nKeyNum, arrUKEYInfo);
  27. int nPreKeySize;
  28. char* pszDevName = NULL;
  29. char* pszDevPath = NULL;
  30. char* pszDriveLetter = NULL;
  31. nPreKeySize = GetKeyList(&pszDevName, true, &pszDevPath, &pszDriveLetter);
  32. bConnect = (nPreKeySize > 0);
  33. ReleaseKeyList(pszDevName, pszDevPath, pszDriveLetter);
  34. delete[] arrUKEYInfo; // 确保释放分配的内存
  35. }
  36. catch (const std::exception& e)
  37. {
  38. logger.log(CString("Exception: ") + e.what(), Logger::ERROR);
  39. bConnect = FALSE;
  40. }
  41. catch (...)
  42. {
  43. logger.log("Unknown exception occurred.", Logger::ERROR);
  44. bConnect = FALSE;
  45. }
  46. if (bConnect)
  47. {
  48. pWnd->m_pUkeyConnectStatus->SetText("Ukey已连接");
  49. pWnd->m_pUkeyConnectStatus->SetTextColor(0x4ACB65);
  50. logger.log("Ukey已连接", Logger::INFO);
  51. }
  52. else
  53. {
  54. pWnd->m_pUkeyConnectStatus->SetText("Ukey未连接");
  55. pWnd->m_pUkeyConnectStatus->SetTextColor(0xCF4415);
  56. logger.log("Ukey未连接", Logger::INFO);
  57. }
  58. ::Sleep(10000); // 可以考虑使用条件变量来提高效率
  59. }
  60. }

2. ConnectThread

功能

  • 测试与指定 URL 的 HTTP 连接。
  • 使用一个循环遍历多个 URL 地址,记录并显示网络状态。

改进建议

  • 资源管理: 对于创建的对象,应确保在所有情况下都正确关闭和删除(即使在出现异常时)。
  • 错误处理: 可以扩展更多错误信息以便调试,并增强可读性。

示例代码改进

  1. UINT CMainWnd::ConnectThread(LPVOID lparam)
  2. {
  3. CMainWnd* pWnd = (CMainWnd*)lparam;
  4. CString modulePath = CUtility::GetModulePath(NULL);
  5. CString filePath = modulePath + _T("ConnectionState.log");
  6. Logger logger(filePath);
  7. CInternetSession session(BANK_ADDR);
  8. BOOL bConnect= FALSE;
  9. session.SetOption(INTERNET_OPTION_SEND_TIMEOUT, 400);
  10. char* tmpURL= CONNECT_TEST_URL;
  11. // 循环处理每个 URL
  12. while (*tmpURL != '\0')
  13. {
  14. CString strServer, strObject;
  15. INTERNET_PORT wPort;
  16. BOOL bURLParsed= AfxParseURL(tmpURL, dwType, strServer, strObject,wPort);
  17. if (!bURLParsed) continue; // 如果无法解析则跳过
  18. // 创建 HTTP 请求
  19. try
  20. {
  21. auto pHttpConnection= session.GetHttpConnection(strServer,wPort);
  22. auto pHttpFile= pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET,strObject,NULL,1,NULL,NULL,internetFlags);
  23. if(pHttpFile &&pHttpFile->SendRequest())
  24. {
  25. DWORD dwStateCode;
  26. pHttpFile->QueryInfoStatusCode(dwStateCode);
  27. if(dwStateCode==HTTP_STATUS_OK)
  28. {
  29. bConnect= TRUE;
  30. }
  31. }
  32. if(pHttpFile!=NULL)
  33. {
  34. pHttpFile->Close();
  35. delete pHttpFile;
  36. }
  37. }
  38. catch(const CInternetException& e)
  39. {
  40. logger.log(CString("HTTP Error: ") + CString(e.m_dwError), Logger::ERROR);
  41. }
  42. tmpURL+= lstrlenA(tmpURL)+1;
  43. }
  44. session.Close();
  45. if(bConnect)
  46. {
  47. pWnd->m_pWebStateImage->SetBkImage(_T("label\\label_webok.png"));
  48. logger.log("网络已连接",Logger::INFO);
  49. }
  50. else
  51. {
  52. pWnd->m_pWebStateImage->SetBkImage(_T("label\\label_weberr.png"));
  53. logger.log("网络断开",Logger::INFO);
  54. }
  55. return 0;
  56. }

以上改进建议旨在提升代码的安全性、可读性和可维护性。在生产环境中,特别是在涉及多线程和外部资源操作时,资源管理非常重要。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20534

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?