etNetworkTest.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #include "etNetworkTest.h"
  2. #include "ui_etNetworkTest.h"
  3. #include "CAppInfo.h"
  4. #include "logproc.h"
  5. #include <QScrollBar>
  6. #include <QHBoxLayout>
  7. #include <QLabel>
  8. #include <QProcess>
  9. #include <regex>
  10. #include "winsock2.h"
  11. #include "windows.h"
  12. #include "winsock.h"
  13. #include "iphlpapi.h"
  14. etNetworkTest::etNetworkTest(QWidget *parent) :
  15. QWidget(parent),
  16. ui(new Ui::etNetworkTest)
  17. {
  18. ui->setupUi(this);
  19. setStyleSheet(g_appInfoPtr->m_sQssStr);
  20. bSpeedPass = false;
  21. bDelayPass = false;
  22. connect(this, &etNetworkTest::checkInfo, this, [&](QString speed, QString sTime) {
  23. if (!speed.isEmpty())
  24. {
  25. if (speed.toInt() > 5)
  26. {
  27. bSpeedPass = true;
  28. ui->tablewt_envTest->item(0, 0)->setText(QString::fromLocal8Bit("电脑当前下载速度"));
  29. ui->tablewt_envTest->item(0, 1)->setText(speed + "kb/s");
  30. QWidget *widget = new QWidget;
  31. QHBoxLayout *layout = new QHBoxLayout;
  32. widget->setLayout(layout);
  33. QLabel *icon = new QLabel;
  34. icon->setFixedSize(QSize(g_appInfoPtr->m_fRate * 12, g_appInfoPtr->m_fRate * 9));
  35. icon->setPixmap(QPixmap(":/images/icon-et-item-pass.png").scaled(g_appInfoPtr->m_fRate * 12, g_appInfoPtr->m_fRate * 9));
  36. layout->addWidget(icon);
  37. layout->addStretch();
  38. ui->tablewt_envTest->setCellWidget(0, 2, widget);
  39. }
  40. }
  41. if(!sTime.isEmpty())
  42. {
  43. if (sTime.toInt() < 500)
  44. {
  45. bDelayPass = true;
  46. }
  47. ui->tablewt_envTest->item(1, 0)->setText(QString::fromLocal8Bit("电脑当前网络延迟"));
  48. ui->tablewt_envTest->item(1, 1)->setText(sTime+"ms");
  49. QWidget *widget = new QWidget;
  50. QHBoxLayout *layout = new QHBoxLayout;
  51. widget->setLayout(layout);
  52. QLabel *icon = new QLabel;
  53. icon->setFixedSize(QSize(g_appInfoPtr->m_fRate * 12, g_appInfoPtr->m_fRate * 9));
  54. icon->setPixmap(QPixmap(":/images/icon-et-item-pass.png").scaled(g_appInfoPtr->m_fRate * 12, g_appInfoPtr->m_fRate * 9));
  55. layout->addWidget(icon);
  56. layout->addStretch();
  57. ui->tablewt_envTest->setCellWidget(1, 2, widget);
  58. }
  59. if (bSpeedPass && bDelayPass)
  60. {
  61. m_bIsRun = false;
  62. }
  63. });
  64. m_bIsRun = true;
  65. m_thread = std::thread(std::bind(&etNetworkTest::threadProc, this));
  66. }
  67. etNetworkTest::~etNetworkTest()
  68. {
  69. m_bIsRun = false;
  70. m_thread.join();
  71. delete ui;
  72. }
  73. void etNetworkTest::threadProc()
  74. {
  75. PMIB_IFTABLE m_pTable = NULL;
  76. DWORD m_dwAdapters = 0;
  77. ULONG uRetCode = GetIfTable(m_pTable, &m_dwAdapters, TRUE);
  78. if (uRetCode == ERROR_NOT_SUPPORTED)
  79. {
  80. return;
  81. }
  82. if (uRetCode == ERROR_INSUFFICIENT_BUFFER)
  83. {
  84. m_pTable = (PMIB_IFTABLE)new BYTE[65535]; //假设端口数不超过65535个
  85. }
  86. DWORD dwLastIn = 0; //上一秒钟的接收字节数
  87. DWORD dwLastOut = 0; //上一秒钟的发送字节数
  88. DWORD dwBandIn = 0; //下载速度
  89. DWORD dwBandOut = 0;
  90. while(m_bIsRun)
  91. {
  92. GetIfTable(m_pTable, &m_dwAdapters, TRUE);
  93. DWORD dwInOctets = 0;
  94. DWORD dwOutOctets = 0;
  95. //将所有端口的流量进行统计
  96. for (UINT i = 0; i < m_pTable->dwNumEntries; i++)
  97. {
  98. MIB_IFROW Row = m_pTable->table[i];
  99. dwInOctets += Row.dwInOctets;
  100. dwOutOctets += Row.dwOutOctets;
  101. }
  102. dwBandIn = dwInOctets - dwLastIn; //下载速度
  103. dwBandOut = dwOutOctets - dwLastOut; //上传速速
  104. if (dwLastIn <= 0)
  105. {
  106. dwBandIn = 0;
  107. }
  108. else
  109. {
  110. dwBandIn = dwBandIn / 1024; //b转换成kb
  111. }
  112. if (dwLastOut <= 0)
  113. {
  114. dwBandOut = 0;
  115. }
  116. else
  117. {
  118. dwBandOut = dwBandOut / 1024; //b转换成kb
  119. }
  120. dwLastIn = dwInOctets;
  121. dwLastOut = dwOutOctets;
  122. QProcess process;
  123. process.start("ping www.baidu.com -n 1");
  124. process.waitForFinished(-1); // will wait forever until finished
  125. QString sOutStr = QString::fromLocal8Bit(process.readAllStandardOutput().data());
  126. QString sFindStr = QString::fromLocal8Bit("平均 =");
  127. int nIndex = sOutStr.indexOf(sFindStr);
  128. if (nIndex < 0)
  129. {
  130. nIndex = sOutStr.indexOf(QString::fromLocal8Bit("Average ="));
  131. }
  132. QString sTimeNum = "";
  133. if (nIndex > 0)
  134. {
  135. QString sTime = sOutStr.mid(nIndex + sFindStr.length(), sOutStr.length() - nIndex);
  136. int nTimeIndex = sTime.indexOf("ms");
  137. sTimeNum = sTime.left(nTimeIndex);
  138. }
  139. emit checkInfo(QString::number(dwBandIn), sTimeNum);
  140. Sleep(1000);
  141. }
  142. }
  143. int etNetworkTest::setUI(const int nLeft, const int nTop, const int nWidth)
  144. {
  145. setGeometry(nLeft, nTop, nWidth, g_appInfoPtr->m_fRate*146);
  146. ui->tablewt_envTest->setGeometry(g_appInfoPtr->m_fRate*30, 0, width() - g_appInfoPtr->m_fRate*30*2, height());
  147. ui->tablewt_envTest->setEditTriggers(QAbstractItemView::NoEditTriggers);
  148. //整行选中的方式
  149. ui->tablewt_envTest->setSelectionBehavior(QAbstractItemView::SelectRows);
  150. //设置为只能选中一行
  151. ui->tablewt_envTest->setSelectionMode(QAbstractItemView::SingleSelection);
  152. //隐藏列表头
  153. ui->tablewt_envTest->verticalHeader()->setVisible(false);
  154. //隐藏边框
  155. ui->tablewt_envTest->setShowGrid(false);
  156. //表头不高亮显示
  157. ui->tablewt_envTest->horizontalHeader()->setHighlightSections(false);
  158. //设置行数
  159. ui->tablewt_envTest->setRowCount(2);
  160. //设置列数
  161. ui->tablewt_envTest->setColumnCount(3);
  162. ui->tablewt_envTest->setHorizontalScrollMode(QTableWidget::ScrollPerPixel);
  163. ui->tablewt_envTest->horizontalScrollBar()->setSingleStep(g_appInfoPtr->m_fRate*5);
  164. QStringList sHeadStr;
  165. sHeadStr << QString::fromLocal8Bit("检测项") <<
  166. QString::fromLocal8Bit("值") <<
  167. QString::fromLocal8Bit("状态");
  168. ui->tablewt_envTest->setHorizontalHeaderLabels(sHeadStr);
  169. ui->tablewt_envTest->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
  170. ui->tablewt_envTest->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
  171. ui->tablewt_envTest->verticalHeader()->setDefaultSectionSize(g_appInfoPtr->m_fRate*48);
  172. ui->tablewt_envTest->setColumnWidth(0, g_appInfoPtr->m_fRate*525);
  173. ui->tablewt_envTest->setColumnWidth(1, g_appInfoPtr->m_fRate*170);
  174. ui->tablewt_envTest->setColumnWidth(2, g_appInfoPtr->m_fRate*24);
  175. ui->tablewt_envTest->horizontalHeader()->setStretchLastSection(true);
  176. for(int i = 0; i < 2; i++)
  177. {
  178. ui->tablewt_envTest->setItem(i, 0, new QTableWidgetItem(QString::fromLocal8Bit("")));
  179. ui->tablewt_envTest->setItem(i, 1, new QTableWidgetItem(QString::fromLocal8Bit("")));
  180. /* QWidget *widget = new QWidget;
  181. QHBoxLayout *layout = new QHBoxLayout;
  182. widget->setLayout(layout);
  183. QLabel *icon = new QLabel;
  184. icon->setFixedSize(QSize(g_appInfoPtr->m_fRate*12, g_appInfoPtr->m_fRate*9));
  185. icon->setPixmap(QPixmap(":/images/icon-et-item-pass.png").scaled(g_appInfoPtr->m_fRate*12, g_appInfoPtr->m_fRate*9));
  186. layout->addWidget(icon);
  187. layout->addStretch();
  188. ui->tablewt_envTest->setCellWidget(i, 2, widget);*/
  189. }
  190. ui->tablewt_envTest->item(0, 0)->setText(QString::fromLocal8Bit("电脑当前下载速度"));
  191. ui->tablewt_envTest->item(1, 0)->setText(QString::fromLocal8Bit("电脑当前网络延迟"));
  192. return height();
  193. }
  194. int etNetworkTest::widgetHeight()
  195. {
  196. return height();
  197. }
  198. int etNetworkTest::getCheckStatus()
  199. {
  200. return (bSpeedPass && bDelayPass);
  201. }