Changeset 83424 in vbox
- Timestamp:
- Mar 25, 2020 6:13:24 PM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 136643
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VirtualBox/src/monitor/resource/UIResourceMonitor.cpp
r83404 r83424 93 93 94 94 quint64 m_uTotalRAM; 95 quint64 m_uFreeRAM; 95 96 quint64 m_uUsedRAM; 96 97 float m_fRAMUsagePercentage; … … 110 111 111 112 CMachineDebugger m_comDebugger; 113 114 private: 115 116 void setupPerformanceCollector(); 117 118 }; 119 120 121 /********************************************************************************************************************************* 122 * Class UIVMResouceMonitorProxyModel definition. * 123 *********************************************************************************************************************************/ 124 class UIResourceMonitorProxyModel : public QSortFilterProxyModel 125 { 126 127 Q_OBJECT; 128 129 public: 130 131 UIResourceMonitorProxyModel(QObject *parent = 0); 132 void dataUpdate(); 133 void setColumnShown(const QVector<bool>& columnShown); 134 135 protected: 136 137 //virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const /* override */; 138 virtual bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const /* override */; 139 140 private: 141 142 QVector<bool> m_columnShown; 143 144 }; 145 146 147 /********************************************************************************************************************************* 148 * Class UIResourceMonitorModel definition. * 149 *********************************************************************************************************************************/ 150 class UIResourceMonitorModel : public QAbstractTableModel 151 { 152 Q_OBJECT; 153 154 signals: 155 156 void sigDataUpdate(); 157 158 public: 159 160 UIResourceMonitorModel(QObject *parent = 0); 161 int rowCount(const QModelIndex &parent = QModelIndex()) const /* override */; 162 int columnCount(const QModelIndex &parent = QModelIndex()) const /* override */; 163 QVariant data(const QModelIndex &index, int role) const /* override */; 164 QVariant headerData(int section, Qt::Orientation orientation, int role) const; 165 void setColumnCaptions(const QVector<QString>& captions); 166 167 private slots: 168 169 void sltMachineStateChanged(const QUuid &uId, const KMachineState state); 170 void sltTimeout(); 171 172 private: 173 174 void initializeItems(); 175 void setupPerformanceCollector(); 176 void queryRAMLoad(); 177 void addItem(const QUuid& uMachineId, const QString& strMachineName); 178 void removeItem(const QUuid& uMachineId); 179 180 QVector<UIResourceMonitorItem> m_itemList; 181 /* Used to find machines by uid. key is the machine uid and int is the index to m_itemList */ 182 QMap<QUuid, int> m_itemMap; 183 QVector<QString> m_columnCaptions; 184 QTimer *m_pTimer; 112 185 /** @name The following are used during UIPerformanceCollector::QueryMetricsData(..) 113 186 * @{ */ … … 117 190 CPerformanceCollector m_performanceMonitor; 118 191 119 private:120 121 void initPerformanceCollector();122 123 };124 125 126 /*********************************************************************************************************************************127 * Class UIVMResouceMonitorProxyModel definition. *128 *********************************************************************************************************************************/129 class UIResourceMonitorProxyModel : public QSortFilterProxyModel130 {131 132 Q_OBJECT;133 134 public:135 136 UIResourceMonitorProxyModel(QObject *parent = 0);137 void dataUpdate();138 void setColumnShown(const QVector<bool>& columnShown);139 140 protected:141 142 //virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const /* override */;143 virtual bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const /* override */;144 145 private:146 147 QVector<bool> m_columnShown;148 149 };150 151 152 /*********************************************************************************************************************************153 * Class UIResourceMonitorModel definition. *154 *********************************************************************************************************************************/155 class UIResourceMonitorModel : public QAbstractTableModel156 {157 Q_OBJECT;158 159 signals:160 161 void sigDataUpdate();162 163 public:164 165 UIResourceMonitorModel(QObject *parent = 0);166 int rowCount(const QModelIndex &parent = QModelIndex()) const /* override */;167 int columnCount(const QModelIndex &parent = QModelIndex()) const /* override */;168 QVariant data(const QModelIndex &index, int role) const /* override */;169 QVariant headerData(int section, Qt::Orientation orientation, int role) const;170 void setColumnCaptions(const QVector<QString>& captions);171 172 private slots:173 174 void sltMachineStateChanged(const QUuid &uId, const KMachineState state);175 void sltTimeout();176 177 private:178 179 QVector<UIResourceMonitorItem> m_itemList;180 void initializeItems();181 QVector<QString> m_columnCaptions;182 183 QTimer *m_pTimer;184 185 192 }; 186 193 … … 209 216 , m_uCPUVMMLoad(0) 210 217 , m_uTotalRAM(0) 218 , m_uFreeRAM(0) 211 219 , m_uUsedRAM(0) 212 220 , m_fRAMUsagePercentage(0) … … 229 237 m_comDebugger = comConsole.GetDebugger(); 230 238 } 231 initPerformanceCollector();232 239 } 233 240 … … 250 257 , m_uVMExitTotal(0) 251 258 { 252 initPerformanceCollector();253 259 } 254 260 … … 271 277 , m_uVMExitTotal(0) 272 278 { 273 initPerformanceCollector();274 279 } 275 280 … … 281 286 } 282 287 283 void UIResourceMonitorItem::initPerformanceCollector()284 {285 /* Initialize and configure CPerformanceCollector: */286 const ULONG iPeriod = 1;287 const int iMetricSetupCount = 1;288 m_performanceMonitor = uiCommon().virtualBox().GetPerformanceCollector();289 m_nameList << "Guest/RAM/Usage*";290 m_objectList = QVector<CUnknown>(m_nameList.size(), CUnknown());291 m_performanceMonitor.SetupMetrics(m_nameList, m_objectList, iPeriod, iMetricSetupCount);292 }293 288 294 289 … … 305 300 if (sourceModel()) 306 301 emit dataChanged(index(0,0), index(sourceModel()->rowCount(), sourceModel()->columnCount())); 302 invalidate(); 307 303 } 308 304 … … 317 313 void UIResourceMonitorProxyModel::setColumnShown(const QVector<bool>& columnShown) 318 314 { 315 emit layoutAboutToBeChanged(); 319 316 m_columnShown = columnShown; 320 317 invalidateFilter(); 318 emit layoutChanged(); 321 319 } 322 320 … … 374 372 break; 375 373 case VMResouceMonitorColumn_RAMUsedPercentage: 376 return m_itemList[index.row()].m_fRAMUsagePercentage;374 return QString("%1\%").arg(QString::number(m_itemList[index.row()].m_fRAMUsagePercentage, 'f', 2)); 377 375 break; 378 376 case VMResouceMonitorColumn_NetworkUpRate: … … 395 393 break; 396 394 case VMResouceMonitorColumn_DiskIOReadTotal: 397 return QString("%1 /%2").arg(uiCommon().formatSize(m_itemList[index.row()].m_uDiskReadTotal, iDecimalCount));395 return QString("%1").arg(uiCommon().formatSize(m_itemList[index.row()].m_uDiskReadTotal, iDecimalCount)); 398 396 break; 399 397 case VMResouceMonitorColumn_DiskIOWriteTotal: 400 return QString("%1 /%2").arg(uiCommon().formatSize(m_itemList[index.row()].m_uDiskWriteTotal, iDecimalCount));398 return QString("%1").arg(uiCommon().formatSize(m_itemList[index.row()].m_uDiskWriteTotal, iDecimalCount)); 401 399 break; 402 400 case VMResouceMonitorColumn_VMExits: … … 429 427 { 430 428 if (comMachine.GetState() == KMachineState_Running) 431 { 432 m_itemList << UIResourceMonitorItem(comMachine.GetId(), comMachine.GetName()); 433 } 429 addItem(comMachine.GetId(), comMachine.GetName()); 434 430 } 435 431 } 432 setupPerformanceCollector(); 436 433 } 437 434 438 435 void UIResourceMonitorModel::sltMachineStateChanged(const QUuid &uId, const KMachineState state) 439 436 { 440 emit layoutAboutToBeChanged(); 441 int iIndex = m_itemList.indexOf(UIResourceMonitorItem(uId)); 437 int iIndex = m_itemMap.value(uId, -1); 442 438 /* Remove the machine in case machine is no longer working. */ 443 439 if (iIndex != -1 && state != KMachineState_Running) 444 m_itemList.remove(iIndex); 445 440 { 441 emit layoutAboutToBeChanged(); 442 removeItem(uId); 443 emit layoutChanged(); 444 setupPerformanceCollector(); 445 } 446 446 /* Insert the machine if it is working. */ 447 447 if (iIndex == -1 && state == KMachineState_Running) 448 448 { 449 emit layoutAboutToBeChanged(); 449 450 CMachine comMachine = uiCommon().virtualBox().FindMachine(uId.toString()); 450 m_itemList << UIResourceMonitorItem(uId, comMachine.GetName()); 451 } 452 emit layoutChanged(); 451 if (!comMachine.isNull()) 452 addItem(uId, comMachine.GetName()); 453 emit layoutChanged(); 454 setupPerformanceCollector(); 455 } 453 456 } 454 457 … … 458 461 ULONG aPctHalted; 459 462 ULONG aPctVMM; 463 /* RAM usage: */ 464 if (!m_performanceMonitor.isNull()) 465 queryRAMLoad(); 466 460 467 for (int i = 0; i < m_itemList.size(); ++i) 461 468 { 462 if (!m_itemList[i].m_performanceMonitor.isNull())463 {464 /* RAM usage: */465 quint64 uFreeRAM = 0;466 UIMonitorCommon::getRAMLoad(m_itemList[i].m_performanceMonitor, m_itemList[i].m_nameList, m_itemList[i].m_objectList,467 m_itemList[i].m_uTotalRAM, uFreeRAM);468 m_itemList[i].m_uUsedRAM = m_itemList[i].m_uTotalRAM - uFreeRAM;469 if (m_itemList[i].m_uTotalRAM != 0)470 m_itemList[i].m_fRAMUsagePercentage = 100.f * (m_itemList[i].m_uUsedRAM / (float)m_itemList[i].m_uTotalRAM);471 }472 473 469 if (!m_itemList[i].m_comDebugger.isNull()) 474 470 { … … 501 497 } 502 498 emit sigDataUpdate(); 499 } 500 501 void UIResourceMonitorModel::setupPerformanceCollector() 502 { 503 m_nameList.clear(); 504 m_objectList.clear(); 505 /* Initialize and configure CPerformanceCollector: */ 506 const ULONG iPeriod = 1; 507 const int iMetricSetupCount = 1; 508 if (m_performanceMonitor.isNull()) 509 m_performanceMonitor = uiCommon().virtualBox().GetPerformanceCollector(); 510 for (int i = 0; i < m_itemList.size(); ++i) 511 m_nameList << "Guest/RAM/Usage*"; 512 m_objectList = QVector<CUnknown>(m_nameList.size(), CUnknown()); 513 m_performanceMonitor.SetupMetrics(m_nameList, m_objectList, iPeriod, iMetricSetupCount); 514 } 515 516 void UIResourceMonitorModel::queryRAMLoad() 517 { 518 QVector<QString> aReturnNames; 519 QVector<CUnknown> aReturnObjects; 520 QVector<QString> aReturnUnits; 521 QVector<ULONG> aReturnScales; 522 QVector<ULONG> aReturnSequenceNumbers; 523 QVector<ULONG> aReturnDataIndices; 524 QVector<ULONG> aReturnDataLengths; 525 /* Make a query to CPerformanceCollector to fetch some metrics (e.g RAM usage): */ 526 QVector<LONG> returnData = m_performanceMonitor.QueryMetricsData(m_nameList, 527 m_objectList, 528 aReturnNames, 529 aReturnObjects, 530 aReturnUnits, 531 aReturnScales, 532 aReturnSequenceNumbers, 533 aReturnDataIndices, 534 aReturnDataLengths); 535 /* Parse the result we get from CPerformanceCollector to get respective values: */ 536 for (int i = 0; i < aReturnNames.size(); ++i) 537 { 538 if (aReturnDataLengths[i] == 0) 539 continue; 540 /* Read the last of the return data disregarding the rest since we are caching the data in GUI side: */ 541 float fData = returnData[aReturnDataIndices[i] + aReturnDataLengths[i] - 1] / (float)aReturnScales[i]; 542 if (aReturnNames[i].contains("RAM", Qt::CaseInsensitive) && !aReturnNames[i].contains(":")) 543 if (aReturnNames[i].contains("Total", Qt::CaseInsensitive) || aReturnNames[i].contains("Free", Qt::CaseInsensitive)) 544 { 545 { 546 CMachine comMachine = (CMachine)aReturnObjects[i]; 547 if (comMachine.isNull()) 548 continue; 549 int iIndex = m_itemMap.value(comMachine.GetId(), -1); 550 if (iIndex == -1 || iIndex >= m_itemList.size()) 551 continue; 552 if (aReturnNames[i].contains("Total", Qt::CaseInsensitive)) 553 m_itemList[iIndex].m_uTotalRAM = fData; 554 else 555 m_itemList[iIndex].m_uFreeRAM = fData; 556 } 557 } 558 } 559 for (int i = 0; i < m_itemList.size(); ++i) 560 { 561 m_itemList[i].m_uUsedRAM = m_itemList[i].m_uTotalRAM - m_itemList[i].m_uFreeRAM; 562 if (m_itemList[i].m_uTotalRAM != 0) 563 m_itemList[i].m_fRAMUsagePercentage = 100.f * (m_itemList[i].m_uUsedRAM / (float)m_itemList[i].m_uTotalRAM); 564 } 565 } 566 567 void UIResourceMonitorModel::addItem(const QUuid& uMachineId, const QString& strMachineName) 568 { 569 int iIndex = m_itemList.size(); 570 m_itemList.append(UIResourceMonitorItem(uMachineId, strMachineName)); 571 m_itemMap[uMachineId] = iIndex; 572 } 573 574 void UIResourceMonitorModel::removeItem(const QUuid& uMachineId) 575 { 576 int iIndex = m_itemMap.value(uMachineId, -1); 577 if (iIndex == -1) 578 return; 579 m_itemList.remove(iIndex); 580 m_itemMap.remove(uMachineId); 503 581 } 504 582 … … 602 680 m_pTableView->setShowGrid(false); 603 681 m_pTableView->horizontalHeader()->setHighlightSections(false); 604 m_pTableView->horizontalHeader()->setSectionResizeMode(QHeaderView:: ResizeToContents);605 m_pTableView->horizontalHeader()->setStretchLastSection(true);682 m_pTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive); 683 //m_pTableView->horizontalHeader()->setStretchLastSection(true); 606 684 607 685 m_pTableView->verticalHeader()->setVisible(false);
Note:
See TracChangeset
for help on using the changeset viewer.