performwidget.cpp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. #include "performwidget.h"
  2. #include "ui_performwidget.h"
  3. #define COLUMN_NAME_INDEX 0
  4. #define COLUMN_PID_INDEX 1
  5. #define COLUMN_CPU_INDEX 2
  6. #define COLUMN_MEM_INDEX 3
  7. #define COLUMN_COMMAND_INDEX 4
  8. #define COLUMN_FDS_INDEX 5
  9. #define MAX_PERFORM_LIST_COLUMN 6
  10. //RUSER PID %CPU %MEM COMMAND COMMAND
  11. #define RAW_RUSER_INDEX 0
  12. #define RAW_PID_INDEX 1
  13. #define RAW_CPU_INDEX 2
  14. #define RAW_MEM_INDEX 3
  15. #define RAW_COMMAND_INDEX 4
  16. #define RAW_FDS_INDEX 5
  17. PerformWidget::PerformWidget(QWidget *parent)
  18. : QWidget(parent)
  19. , ui(new Ui::PerformWidget)
  20. {
  21. ui->setupUi(this);
  22. ui->performTableWidget->setColumnCount(MAX_PERFORM_LIST_COLUMN);
  23. QStringList header;
  24. #ifdef WITH_QT
  25. header << "名称" << "进程号" << "CPU[%]" << "内存[%]" << "命令" << "文件句柄数";
  26. #else
  27. header << "Name" << "PIC" << "CPU[%]" << "MEM[%]" << "CMD" << "Fds" ;
  28. #endif
  29. ui->performTableWidget->setHorizontalHeaderLabels(header);
  30. ui->performTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  31. //ui->performTableWidget->horizontalHeader()->setSectionResizeMode(COLUMN_PID_INDEX, QHeaderView::ResizeToContents);
  32. //ui->performTableWidget->horizontalHeader()->setSectionResizeMode(COLUMN_CPU_INDEX, QHeaderView::ResizeToContents);
  33. //ui->performTableWidget->horizontalHeader()->setSectionResizeMode(COLUMN_MEM_INDEX, QHeaderView::ResizeToContents);
  34. ui->performTableWidget->resizeColumnToContents(0);
  35. ui->performTableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
  36. ui->performTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
  37. ui->performTableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
  38. ui->performTableWidget->verticalHeader()->hide();
  39. ui->performTableWidget->horizontalHeader()->setStretchLastSection(true);
  40. ui->performTableWidget->horizontalHeader()->setVisible(true);
  41. ui->performTableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
  42. ui->performTableWidget->setStyleSheet("selection-background-color:#1E90FF;");
  43. ui->performTableWidget->setFrameShape(QFrame::NoFrame);
  44. connect(ui->performTableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(sortByColumn(int)));
  45. cmd = CPU_SORT;
  46. process = new QProcess(this);
  47. pro = new QProcess(this);
  48. timer = new QTimer(this);
  49. timer->setInterval(3000);
  50. timer->setSingleShot(true);
  51. connect(timer,SIGNAL(timeout()),this,SLOT(GetPerformInfo()));
  52. GetPerformInfo();
  53. }
  54. int PerformWidget::GetProcessFds(int processID)
  55. {
  56. #ifdef Q_OS_WIN32
  57. return 0;
  58. #else
  59. QProcess* proc = new QProcess();
  60. int result = GetProcessFdsImpl(proc, processID);
  61. delete proc;
  62. return result;
  63. #endif
  64. }
  65. int PerformWidget::GetProcessFdsImpl(QProcess* proc, int processID)
  66. {
  67. proc->start("/bin/bash");
  68. if (proc->waitForStarted(3000)) {
  69. QString cmd = QString(FD_CALCU_SPRINT_STR).arg(processID);
  70. qDebug() << __FUNCTION__ << cmd;
  71. proc->write(cmd.toLatin1());
  72. proc->closeWriteChannel();
  73. if (proc->waitForFinished(3000)) {
  74. QString result = proc->readAllStandardOutput();
  75. if (!result.isEmpty()) {
  76. bool ok = false;
  77. int res = result.toInt(&ok, 10);
  78. qDebug() << __FUNCTION__ << ": result=" << res;
  79. if (ok) return res;
  80. return -1;
  81. } else {
  82. qDebug() << __FUNCTION__ << ": empty";
  83. }
  84. } else {
  85. qDebug() << __FUNCTION__ << ":@1 " << proc->errorString();
  86. }
  87. } else {
  88. qDebug() << __FUNCTION__ << ":@2 " << proc->errorString();
  89. }
  90. return -1;
  91. }
  92. void PerformWidget::UpdateMemUsed()
  93. {
  94. pro->start("free -m");
  95. if(pro->waitForStarted(2000))
  96. {
  97. if(pro->waitForFinished(1000))
  98. {
  99. QString result = pro->readAllStandardOutput();
  100. if(!result.isEmpty())
  101. {
  102. memused = 0;
  103. qint64 total, used;
  104. total = 0;
  105. used = 0;
  106. reg.setPattern("\\d+.+");
  107. QString tmp = reg.match(result).captured(0);
  108. QStringList list = tmp.split(QRegularExpression(" +"));
  109. result = list.at(0); //total
  110. tmp = list.at(5); //available
  111. total = result.toLongLong();
  112. used = tmp.toLongLong();
  113. memused = used * 1000 / total;
  114. memused = 1000 - memused;
  115. int m = memused % 10;
  116. memused /= 10;
  117. if (m >= 5) memused += 1;
  118. }
  119. }
  120. }
  121. }
  122. void PerformWidget::sortByColumn(int selColumn)
  123. {
  124. //ui->performTableWidget->sortItems(selColumn, Qt::AscendingOrder);
  125. if (selColumn == COLUMN_CPU_INDEX || selColumn == COLUMN_MEM_INDEX) {
  126. if (selColumn == COLUMN_CPU_INDEX) {
  127. if (cmd == CPU_SORT) return;
  128. cmd = CPU_SORT;
  129. } else if (selColumn == COLUMN_MEM_INDEX) {
  130. if (cmd == MEM_SORT) return;
  131. cmd = MEM_SORT;
  132. }
  133. GetPerformInfo();
  134. }
  135. }
  136. bool PerformWidget::GetPerformInfo()
  137. {
  138. timer->stop();
  139. ui->performTableWidget->clearContents();
  140. process->start("/bin/bash");
  141. if(process->waitForStarted(3000)) {
  142. process->write(cmd.toLatin1());
  143. process->closeWriteChannel();
  144. process->waitForFinished(3000);
  145. QString result = process->readAllStandardOutput();
  146. QRegularExpression reg;
  147. reg.setPattern(" +");
  148. result = result.replace(reg," ");
  149. QStringList elemList = result.split("\n");
  150. elemList.removeFirst();
  151. elemList.removeLast();
  152. ui->performTableWidget->setRowCount(elemList.length());
  153. for(int i=0;i< elemList.length();i++) {
  154. QString line = elemList.at(i);
  155. QStringList elems = line.split(" ");
  156. QString strPID = elems.at(RAW_PID_INDEX);
  157. bool root = false, related = false;
  158. for(int j=0; j<ui->performTableWidget->columnCount(); j++) {
  159. QTableWidgetItem* item = new QTableWidgetItem;
  160. item->setBackground((i % 2 != 0) ? QColor("#f5f5f5") : QColor("#ffffff"));
  161. if(j== COLUMN_NAME_INDEX) {
  162. item->setWhatsThis(strPID);
  163. line = elems.at(RAW_COMMAND_INDEX);
  164. if (line.compare("spshell", Qt::CaseInsensitive) == 0
  165. || line.compare("sphost", Qt::CaseInsensitive) == 0
  166. || line.compare("cefclient", Qt::CaseInsensitive) == 0
  167. || line.compare("guardian", Qt::CaseInsensitive) == 0) {
  168. related = true;
  169. item->setForeground(QBrush(Qt::red));
  170. if (line.compare("sphost", Qt::CaseInsensitive) == 0 && elems.count() > 7 && elems.at(7).startsWith("mod_")) {
  171. line = elems.at(7);
  172. }
  173. }
  174. item->setToolTip(line);
  175. item->setText(line);
  176. }
  177. else if (j == COLUMN_PID_INDEX) {
  178. item->setTextAlignment(Qt::AlignHCenter);
  179. item->setText(elems.at(RAW_PID_INDEX));
  180. }
  181. else if (j == COLUMN_CPU_INDEX) {
  182. item->setTextAlignment(Qt::AlignHCenter);
  183. item->setText(elems.at(RAW_CPU_INDEX));
  184. }
  185. else if (j == COLUMN_MEM_INDEX) {
  186. item->setTextAlignment(Qt::AlignHCenter);
  187. item->setText(elems.at(RAW_MEM_INDEX));
  188. }
  189. else if(j== COLUMN_COMMAND_INDEX)
  190. {
  191. line = elems.mid(5).join(" ");
  192. item->setText(line);
  193. item->setToolTip(line);
  194. } else if(j == COLUMN_FDS_INDEX) {
  195. if (related) {
  196. int fds = GetProcessFdsImpl(pro, strPID.toInt());
  197. item->setText(QString::number(fds));
  198. } else {
  199. item->setText("NA");
  200. }
  201. }
  202. ui->performTableWidget->setItem(i, j, item);
  203. }
  204. }
  205. }
  206. timer->start();
  207. return true;
  208. }
  209. PerformWidget::~PerformWidget()
  210. {
  211. delete ui;
  212. }
  213. bool PerformWidget::pidselected(const QString &pid)
  214. {
  215. QString sel;
  216. for(int i=0;i<selected.length();i++)
  217. {
  218. sel=selected.at(i);
  219. if(pid==sel) {
  220. listupdate2freshselected.append(sel);
  221. return true;
  222. }
  223. }
  224. return false;
  225. }