Changeset 80187 in vbox
- Timestamp:
- Aug 7, 2019 3:15:00 PM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 132628
- Location:
- trunk/src/VBox/Frontends/VirtualBox/src/runtime/information
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/UIPerformanceMonitor.cpp
r80162 r80187 39 39 const ULONG iPeriod = 1; 40 40 const int iMaximumQueueSize = 100; 41 const int iMetricSetupCount = 1 ;41 const int iMetricSetupCount = 10; 42 42 43 43 /********************************************************************************************************************************* … … 57 57 void setTextList(const QStringList &textList); 58 58 const QStringList &textList() const; 59 60 bool drawPieChart() const; 61 void setDrawPieChart(bool fDrawPieChart); 62 63 bool useGradientLineColor() const; 64 void setUseGradientLineColor(bool fUseGradintLineColor); 65 66 QColor dataSeriesColor(int iDataSeriesIndex); 67 void setDataSeriesColor(int iDataSeriesIndex, const QColor &color); 68 69 QString dataSeriesLabel(int iDataSeriesIndex); 70 void setDataSeriesLabel(int iDataSeriesIndex, const QString &strLabel); 59 71 60 72 protected: … … 72 84 int m_iPieChartSize; 73 85 QRect m_pieChartRect; 74 86 bool m_fDrawPieChart; 87 bool m_fUseGradientLineColor; 88 QColor m_dataSeriesColor[2]; 89 QString m_dataSeriesLabel[2]; 75 90 }; 76 91 … … 84 99 , m_pSubMetric(pSubMetric) 85 100 , m_size(QSize(50, 50)) 101 , m_fDrawPieChart(true) 102 , m_fUseGradientLineColor(true) 103 , m_dataSeriesColor({Qt::red, Qt::blue}) 86 104 { 87 105 m_iMargin = qApp->QApplication::style()->pixelMetric(QStyle::PM_LayoutTopMargin); … … 110 128 { 111 129 return m_textList; 130 } 131 132 bool UIChart::drawPieChart() const 133 { 134 return m_fDrawPieChart; 135 } 136 137 void UIChart::setDrawPieChart(bool fDrawPieChart) 138 { 139 if (m_fDrawPieChart == fDrawPieChart) 140 return; 141 m_fDrawPieChart = fDrawPieChart; 142 update(); 143 } 144 145 bool UIChart::useGradientLineColor() const 146 { 147 return m_fUseGradientLineColor; 148 } 149 150 void UIChart::setUseGradientLineColor(bool fUseGradintLineColor) 151 { 152 if (m_fUseGradientLineColor == fUseGradintLineColor) 153 return; 154 m_fUseGradientLineColor = fUseGradintLineColor; 155 update(); 156 } 157 158 159 QColor UIChart::dataSeriesColor(int iDataSeriesIndex) 160 { 161 if (iDataSeriesIndex >= 2) 162 return QColor(); 163 return m_dataSeriesColor[iDataSeriesIndex]; 164 } 165 166 void UIChart::setDataSeriesColor(int iDataSeriesIndex, const QColor &color) 167 { 168 if (iDataSeriesIndex >= 2) 169 return; 170 if (m_dataSeriesColor[iDataSeriesIndex] == color) 171 return; 172 m_dataSeriesColor[iDataSeriesIndex] = color; 173 update(); 174 } 175 176 QString UIChart::dataSeriesLabel(int iDataSeriesIndex) 177 { 178 if (iDataSeriesIndex >= 2) 179 return QString(); 180 return m_dataSeriesLabel[iDataSeriesIndex]; 181 } 182 183 void UIChart::setDataSeriesLabel(int iDataSeriesIndex, const QString &strLabel) 184 { 185 if (iDataSeriesIndex >= 2) 186 return; 187 if (m_dataSeriesLabel[iDataSeriesIndex] == strLabel) 188 return; 189 m_dataSeriesLabel[iDataSeriesIndex] = strLabel; 190 update(); 112 191 } 113 192 … … 146 225 Q_UNUSED(pEvent); 147 226 QPainter painter(this); 148 227 painter.setRenderHint(QPainter::Antialiasing); 228 229 /* Draw a rectanglar grid over which we will draw the line graphs: */ 149 230 float fChartHeight = height() - 2 * m_iMargin; 150 231 float fChartWidth = width() - 2 * m_iMargin; … … 152 233 painter.drawRect(QRect(m_iMargin, m_iMargin, fChartWidth, fChartHeight)); 153 234 painter.setPen(QColor(200, 200, 200)); 154 155 235 int iYParts = 4; 156 236 for (int i = 1; i < iYParts; ++i) 157 237 painter.drawLine(m_iMargin, m_iMargin + i *fChartHeight / (float)iYParts, width() - m_iMargin, m_iMargin + i * fChartHeight / (float)iYParts); 158 159 160 238 int iXParts = 5; 161 239 for (int i = 1; i < iXParts; ++i) 162 240 painter.drawLine(m_iMargin + i * fChartWidth / (float)iXParts, m_iMargin, m_iMargin + i * fChartWidth / (float)iXParts, height() - m_iMargin); 163 241 164 painter.setRenderHint(QPainter::Antialiasing); 165 if (!m_pSubMetric) 166 return; 167 const QQueue<ULONG> &data = m_pSubMetric->data(); 168 169 if (data.isEmpty() || iMaximumQueueSize == 0) 170 return; 171 172 float fMaximum = m_pSubMetric->maximum(); 173 if (m_pSubMetric->isPercentage()) 174 fMaximum = 100.f; 175 if (fMaximum == 0) 176 return; 177 178 if (isEnabled()) 179 { 180 float fBarWidth = fChartWidth / (float) iMaximumQueueSize; 181 182 float fH = fChartHeight / fMaximum; 183 184 QLinearGradient gradient(0, 0, 0, fChartHeight); 185 gradient.setColorAt(1.0, Qt::green); 186 gradient.setColorAt(0.0, Qt::red); 187 painter.setPen(QPen(gradient, 2.5)); 188 189 for (int i = 0; i < data.size() - 1; ++i) 190 { 191 int j = i + 1; 192 193 float fHeight = fH * data[i]; 194 float fX = width() - ((data.size() -i) * fBarWidth); 195 196 float fHeight2 = fH * data[j]; 197 float fX2 = width() - ((data.size() -j) * fBarWidth); 198 199 200 QLineF bar(fX, height() - (fHeight + m_iMargin), fX2, height() - (fHeight2 + m_iMargin)); 201 painter.drawLine(bar); 202 } 203 } 204 205 /* Draw a whole non-filled circle: */ 206 painter.setPen(QPen(Qt::gray, 1)); 207 painter.drawArc(m_pieChartRect, 0, 3600 * 16); 208 209 QPointF center(m_pieChartRect.center()); 210 QPainterPath fillPath; 211 fillPath.moveTo(center); 212 213 fillPath.arcTo(m_pieChartRect, 90/*startAngle*/, 214 -1 * 360 /*sweepLength*/); 215 216 /* First draw a white filled circle and that the arc for data: */ 217 QConicalGradient pieGradient; 218 pieGradient.setCenter(m_pieChartRect.center()); 219 pieGradient.setAngle(90); 220 pieGradient.setColorAt(0, Qt::red); 221 pieGradient.setColorAt(1, Qt::green); 222 223 painter.setPen(Qt::NoPen); 224 painter.setBrush(Qt::white); 225 painter.drawPath(fillPath); 226 227 if (isEnabled()) 228 { 229 QPainterPath dataPath; 230 dataPath.moveTo(center); 231 float fAngle = 360.f * data.back() / fMaximum; 232 dataPath.arcTo(m_pieChartRect, 90/*startAngle*/, 233 -1 * fAngle /*sweepLength*/); 234 painter.setBrush(pieGradient); 235 painter.drawPath(dataPath); 236 } 237 else 242 243 /* Draw a half-transparent rectangle over the whole widget to indicate the it is disabled: */ 244 if (!isEnabled()) 238 245 { 239 246 painter.setPen(Qt::NoPen); … … 241 248 painter.drawRect(QRect(0, 0, width(), height())); 242 249 } 250 251 if (!m_pSubMetric || iMaximumQueueSize <= 0) 252 return; 253 254 ULONG iMaximum = m_pSubMetric->maximum(); 255 if (m_pSubMetric->isPercentage()) 256 iMaximum = 100; 257 if (iMaximum == 0) 258 return; 259 260 if (isEnabled()) 261 { 262 float fBarWidth = fChartWidth / (float) iMaximumQueueSize; 263 float fH = fChartHeight / (float)iMaximum; 264 if (m_fUseGradientLineColor) 265 { 266 QLinearGradient gradient(0, 0, 0, fChartHeight); 267 gradient.setColorAt(1.0, Qt::green); 268 gradient.setColorAt(0.0, Qt::red); 269 painter.setPen(QPen(gradient, 2.5)); 270 } 271 for (int k = 0; k < 2; ++k) 272 { 273 const QQueue<ULONG> *data = m_pSubMetric->data(k); 274 if (!m_fUseGradientLineColor) 275 painter.setPen(QPen(m_dataSeriesColor[k], 2.5)); 276 277 for (int i = 0; i < data->size() - 1; ++i) 278 { 279 int j = i + 1; 280 float fHeight = fH * data->at(i); 281 float fX = width() - ((data->size() -i) * fBarWidth); 282 float fHeight2 = fH * data->at(j); 283 float fX2 = width() - ((data->size() -j) * fBarWidth); 284 QLineF bar(fX, height() - (fHeight + m_iMargin), fX2, height() - (fHeight2 + m_iMargin)); 285 painter.drawLine(bar); 286 } 287 } 288 } 289 290 if (m_fDrawPieChart) 291 { 292 /* Draw a whole non-filled circle: */ 293 painter.setPen(QPen(Qt::gray, 1)); 294 painter.drawArc(m_pieChartRect, 0, 3600 * 16); 295 296 QPointF center(m_pieChartRect.center()); 297 QPainterPath fillPath; 298 fillPath.moveTo(center); 299 300 fillPath.arcTo(m_pieChartRect, 90/*startAngle*/, 301 -1 * 360 /*sweepLength*/); 302 303 /* First draw a white filled circle and that the arc for data: */ 304 QConicalGradient pieGradient; 305 pieGradient.setCenter(m_pieChartRect.center()); 306 pieGradient.setAngle(90); 307 pieGradient.setColorAt(0, Qt::red); 308 pieGradient.setColorAt(1, Qt::green); 309 310 painter.setPen(Qt::NoPen); 311 painter.setBrush(Qt::white); 312 painter.drawPath(fillPath); 313 314 if (isEnabled()) 315 { 316 /* Draw the pie chart for the 0th data series only: */ 317 const QQueue<ULONG> *data = m_pSubMetric->data(0); 318 if (data && !data->isEmpty()) 319 { 320 QPainterPath dataPath; 321 dataPath.moveTo(center); 322 float fAngle = 360.f * data->back() / (float)iMaximum; 323 dataPath.arcTo(m_pieChartRect, 90/*startAngle*/, 324 -1 * fAngle /*sweepLength*/); 325 painter.setBrush(pieGradient); 326 painter.drawPath(dataPath); 327 } 328 } 329 } 330 331 243 332 } 244 333 … … 250 339 : m_strName(strName) 251 340 , m_strUnit(strUnit) 341 , m_iMaximum(0) 252 342 , m_iMaximumQueueSize(iMaximumQueueSize) 253 343 , m_fRequiresGuestAdditions(false) 254 344 { 255 345 if (isPercentage()) 256 m_ fMaximum = 100.f;346 m_iMaximum = 100; 257 347 } 258 348 … … 267 357 } 268 358 269 void UISubMetric::setMaximum(float fMaximum) 270 { 271 m_fMaximum = fMaximum; 272 } 273 274 float UISubMetric::maximum() const 275 { 276 return m_fMaximum; 277 } 278 279 void UISubMetric::setMinimum(float fMinimum) 280 { 281 m_fMinimum = fMinimum; 282 } 283 284 float UISubMetric::minimum() const 285 { 286 return m_fMinimum; 287 } 288 289 void UISubMetric::setAverage(float fAverage) 290 { 291 m_fAverage = fAverage; 292 } 293 294 float UISubMetric::average() const 295 { 296 return m_fAverage; 359 void UISubMetric::setMaximum(ULONG iMaximum) 360 { 361 m_iMaximum = iMaximum; 362 } 363 364 ULONG UISubMetric::maximum() const 365 { 366 return m_iMaximum; 297 367 } 298 368 … … 307 377 } 308 378 309 void UISubMetric::addData(ULONG fData) 310 { 311 m_data.enqueue(fData); 312 if (m_data.size() > iMaximumQueueSize) 313 m_data.dequeue(); 314 } 315 316 const QQueue<ULONG> &UISubMetric::data() const 317 { 318 return m_data; 379 void UISubMetric::addData(int iDataSeriesIndex, ULONG fData) 380 { 381 if (iDataSeriesIndex >= 2) 382 return; 383 m_data[iDataSeriesIndex].enqueue(fData); 384 if (m_data[iDataSeriesIndex].size() > iMaximumQueueSize) 385 m_data[iDataSeriesIndex].dequeue(); 386 } 387 388 const QQueue<ULONG> *UISubMetric::data(int iDataSeriesIndex) const 389 { 390 if (iDataSeriesIndex >= 2) 391 return 0; 392 return &m_data[iDataSeriesIndex]; 319 393 } 320 394 … … 347 421 , m_strCPUMetricName("CPU Load") 348 422 , m_strRAMMetricName("RAM Usage") 423 , m_strDiskMetricName("Disk Usage") 424 , m_strNetMetricName("Net") 349 425 { 350 426 if (!m_console.isNull()) … … 377 453 } 378 454 455 QStringList chartOder; 456 chartOder << m_strCPUMetricName << m_strRAMMetricName << m_strDiskMetricName << m_strNetMetricName; 379 457 int iRow = 0; 380 for (QMap<QString, UISubMetric>::const_iterator iterator = m_subMetrics.begin(); 381 iterator != m_subMetrics.end(); ++iterator) 382 { 458 foreach (const QString &strMetricName, chartOder) 459 { 460 if (!m_subMetrics.contains(strMetricName)) 461 continue; 383 462 QLabel *pLabel = new QLabel; 463 pLabel->setAlignment(Qt::AlignLeft | Qt::AlignTop); 384 464 m_pMainLayout->addWidget(pLabel, iRow, 0); 385 m_infoLabels.insert( iterator.key(), pLabel);386 387 UIChart *pChart = new UIChart(this, &( iterator.value()));388 m_charts.insert( iterator.key(), pChart);465 m_infoLabels.insert(strMetricName, pLabel); 466 467 UIChart *pChart = new UIChart(this, &(m_subMetrics[strMetricName])); 468 m_charts.insert(strMetricName, pChart); 389 469 pChart->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); 390 470 m_pMainLayout->addWidget(pChart, iRow, 1); … … 392 472 } 393 473 474 /* Configure charts: */ 475 if (m_charts.contains(m_strNetMetricName) && m_charts[m_strNetMetricName]) 476 { 477 m_charts[m_strNetMetricName]->setDrawPieChart(false); 478 m_charts[m_strNetMetricName]->setUseGradientLineColor(false); 479 } 394 480 QWidget *bottomSpacerWidget = new QWidget(this); 395 481 bottomSpacerWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); … … 430 516 quint64 iTotalRAM = 0; 431 517 quint64 iFreeRAM = 0; 518 ULONG iReceiveRate = 0; 519 ULONG iTransmitRate = 0; 432 520 433 521 for (int i = 0; i < aReturnNames.size(); ++i) … … 435 523 if (aReturnDataLengths[i] == 0) 436 524 continue; 437 438 float fData = 0; 439 if (aReturnScales[i] == 1) 440 fData = returnData[aReturnDataIndices[i] + aReturnDataLengths[i] - 1]; 441 else 442 fData = returnData[aReturnDataIndices[i] + aReturnDataLengths[i] - 1] / (float)aReturnScales[i]; 443 444 if (aReturnNames[i].contains("RAM", Qt::CaseInsensitive)) 525 if (aReturnNames[i].contains("Disk"), Qt::CaseInsensitive) 526 printf("%f\n", 22.2); 527 /* Read the last of the return data disregarding the rest since we are caching the data in GUI side: */ 528 float fData = returnData[aReturnDataIndices[i] + aReturnDataLengths[i] - 1] / (float)aReturnScales[i]; 529 if (aReturnNames[i].contains("RAM", Qt::CaseInsensitive) && !aReturnNames[i].contains(":")) 445 530 { 446 531 if (aReturnNames[i].contains("Total", Qt::CaseInsensitive)) 447 { 448 if (aReturnNames[i].contains(":")) 449 continue; 450 else 451 { 452 iTotalRAM = (quint64)fData; 453 continue; 454 } 455 } 532 iTotalRAM = (quint64)fData; 456 533 if (aReturnNames[i].contains("Free", Qt::CaseInsensitive)) 457 {458 if (aReturnNames[i].contains(":"))459 continue;460 else461 {462 iFreeRAM = (quint64)fData;463 continue;464 }465 466 467 } 468 }469 534 iFreeRAM = (quint64)fData; 535 } 536 else if (aReturnNames[i].contains("Net/Rate", Qt::CaseInsensitive) && !aReturnNames[i].contains(":")) 537 { 538 if (aReturnNames[i].contains("Rx", Qt::CaseInsensitive)) 539 iReceiveRate = fData; 540 if (aReturnNames[i].contains("Tx", Qt::CaseInsensitive)) 541 iTransmitRate = fData; 542 } 543 } 544 545 (void)iReceiveRate; 546 (void)iTransmitRate; 470 547 /* Update the CPU load chart with values we get from IMachineDebugger::getCPULoad(..): */ 471 548 if (m_subMetrics.contains(m_strCPUMetricName)) 472 549 { 473 UISubMetric &CPUMetric = m_subMetrics[m_strCPUMetricName];474 550 ULONG aPctExecuting; 475 551 ULONG aPctHalted; 476 552 ULONG aPctOther; 477 553 m_machineDebugger.GetCPULoad(0x7fffffff, aPctExecuting, aPctHalted, aPctOther); 478 CPUMetric.addData(aPctExecuting); 479 QList<UIChart*> charts = m_charts.values(m_strCPUMetricName); 480 481 if (m_infoLabels.contains(m_strCPUMetricName) && m_infoLabels[m_strCPUMetricName]) 482 { 483 if (m_infoLabels[m_strCPUMetricName]->isEnabled()) 484 { 485 QString strInfo = QString("%1\n%2%3").arg("CPU Load").arg(QString::number(aPctExecuting)).arg("%"); 486 m_infoLabels[m_strCPUMetricName]->setText(strInfo); 487 } 488 else 489 { 490 QString strInfo = QString("%1\n%2%3").arg("CPU Load").arg("--").arg("%"); 491 m_infoLabels[m_strCPUMetricName]->setText(strInfo); 492 } 493 } 494 if (m_charts.contains(m_strCPUMetricName)) 495 m_charts[m_strCPUMetricName]->update(); 554 updateCPUGraphsAndMetric(aPctExecuting); 496 555 } 497 556 498 557 if (m_subMetrics.contains(m_strRAMMetricName)) 499 { 500 UISubMetric &RAMMetric = m_subMetrics[m_strRAMMetricName]; 501 RAMMetric.setMaximum(iTotalRAM); 502 RAMMetric.addData(iTotalRAM - iFreeRAM); 503 504 if (m_infoLabels.contains(m_strRAMMetricName) && m_infoLabels[m_strRAMMetricName]) 505 { 506 if (m_infoLabels[m_strRAMMetricName]->isEnabled()) 507 { 508 QString strInfo = QString("%1\n%2: %3\n%4: %5\n%6: %7").arg("RAM Usage").arg("Total").arg(uiCommon().formatSize(_1K * iTotalRAM)).arg("Free:").arg(uiCommon().formatSize(_1K * (iFreeRAM))).arg("Used:").arg(uiCommon().formatSize(_1K * (iTotalRAM - iFreeRAM))); 509 m_infoLabels[m_strRAMMetricName]->setText(strInfo); 510 } 511 else 512 { 513 QString strInfo = QString("%1\n%2: %3\n%4: %5\n%6: %7").arg("RAM Usage").arg("Total").arg("---").arg("Free").arg("---").arg("Used").arg("---"); 514 m_infoLabels[m_strRAMMetricName]->setText(strInfo); 515 } 516 } 517 if (m_charts.contains(m_strRAMMetricName)) 518 { 519 m_charts[m_strRAMMetricName]->update(); 520 } 521 } 558 updateRAMGraphsAndMetric(iTotalRAM, iFreeRAM); 559 if (m_subMetrics.contains(m_strNetMetricName)) 560 updateNewGraphsAndMetric(iReceiveRate, iTransmitRate); 561 522 562 } 523 563 … … 541 581 // m_nameList << "Guest/RAM/Usage*"; 542 582 m_nameList << "Guest/RAM/Usage*"; 543 // m_nameList << "Disk*";544 545 m_nameList << "*"; 546 583 m_nameList << "Net/Rate*"; 584 585 586 m_objectList = QVector<CUnknown>(m_nameList.size(), CUnknown()); 547 587 m_performanceMonitor.SetupMetrics(m_nameList, m_objectList, iPeriod, iMetricSetupCount); 548 588 { … … 555 595 if (strName.contains("RAM", Qt::CaseInsensitive) && strName.contains("Free", Qt::CaseInsensitive)) 556 596 { 557 QString strRAMMetricName(m_strRAMMetricName); 558 UISubMetric newMetric(strRAMMetricName, metrics[i].GetUnit(), iMaximumQueueSize); 597 UISubMetric newMetric(m_strRAMMetricName, metrics[i].GetUnit(), iMaximumQueueSize); 559 598 newMetric.setRequiresGuestAdditions(true); 560 m_subMetrics.insert(strRAMMetricName, newMetric); 599 m_subMetrics.insert(m_strRAMMetricName, newMetric); 600 } 601 else if (strName.contains("Net", Qt::CaseInsensitive)) 602 { 603 UISubMetric newMetric(m_strNetMetricName, metrics[i].GetUnit(), iMaximumQueueSize); 604 newMetric.setRequiresGuestAdditions(true); 605 m_subMetrics.insert(m_strNetMetricName, newMetric); 561 606 } 562 607 } … … 604 649 } 605 650 } 651 652 void UIPerformanceMonitor::updateCPUGraphsAndMetric(ULONG iLoadPercentage) 653 { 654 UISubMetric &CPUMetric = m_subMetrics[m_strCPUMetricName]; 655 CPUMetric.addData(0, iLoadPercentage); 656 if (m_infoLabels.contains(m_strCPUMetricName) && m_infoLabels[m_strCPUMetricName]) 657 { 658 QString strInfo; 659 if (m_infoLabels[m_strCPUMetricName]->isEnabled()) 660 strInfo = QString("%1\n%2%3").arg("CPU Load").arg(QString::number(iLoadPercentage)).arg("%"); 661 else 662 strInfo = QString("%1\n%2%3").arg("CPU Load").arg("--").arg("%"); 663 m_infoLabels[m_strCPUMetricName]->setText(strInfo); 664 } 665 if (m_charts.contains(m_strCPUMetricName)) 666 m_charts[m_strCPUMetricName]->update(); 667 } 668 669 void UIPerformanceMonitor::updateRAMGraphsAndMetric(quint64 iTotalRAM, quint64 iFreeRAM) 670 { 671 UISubMetric &RAMMetric = m_subMetrics[m_strRAMMetricName]; 672 RAMMetric.setMaximum(iTotalRAM); 673 RAMMetric.addData(0, iTotalRAM - iFreeRAM); 674 if (m_infoLabels.contains(m_strRAMMetricName) && m_infoLabels[m_strRAMMetricName]) 675 { 676 QString strInfo; 677 if (m_infoLabels[m_strRAMMetricName]->isEnabled()) 678 strInfo = QString("%1\n%2: %3\n%4: %5\n%6: %7").arg("RAM Usage").arg("Total").arg(uiCommon().formatSize(_1K * iTotalRAM)) 679 .arg("Free:").arg(uiCommon().formatSize(_1K * (iFreeRAM))) 680 .arg("Used:").arg(uiCommon().formatSize(_1K * (iTotalRAM - iFreeRAM))); 681 else 682 strInfo = QString("%1\n%2: %3\n%4: %5\n%6: %7").arg("RAM Usage").arg("Total").arg("---").arg("Free").arg("---").arg("Used").arg("---"); 683 m_infoLabels[m_strRAMMetricName]->setText(strInfo); 684 } 685 if (m_charts.contains(m_strRAMMetricName)) 686 m_charts[m_strRAMMetricName]->update(); 687 } 688 689 void UIPerformanceMonitor::updateNewGraphsAndMetric(ULONG iReceiveRate, ULONG iTransmitRate) 690 { 691 UISubMetric &NetMetric = m_subMetrics[m_strNetMetricName]; 692 693 NetMetric.addData(0, iReceiveRate); 694 NetMetric.addData(1, iTransmitRate); 695 696 ULONG iMaximum = qMax(NetMetric.maximum(), (ULONG)qMax(iReceiveRate, iTransmitRate)); 697 NetMetric.setMaximum(iMaximum); 698 699 if (m_infoLabels.contains(m_strNetMetricName) && m_infoLabels[m_strNetMetricName]) 700 { 701 QString strInfo; 702 if (m_infoLabels[m_strNetMetricName]->isEnabled()) 703 strInfo = QString("%1\n%2: %3\n%4: %5\n%6: %7").arg("Network").arg("Receive").arg(uiCommon().formatSize((quint64)iReceiveRate)) 704 .arg("Transmit:").arg(uiCommon().formatSize((quint64)iTransmitRate)) 705 .arg("Maximum:").arg(uiCommon().formatSize((quint64)iMaximum)); 706 else 707 strInfo = QString("%1\n%2: %3\n%4: %5\n%6: %7").arg("Network").arg("Receieve").arg("---").arg("Transmit").arg("---"); 708 m_infoLabels[m_strNetMetricName]->setText(strInfo); 709 } 710 if (m_charts.contains(m_strNetMetricName)) 711 m_charts[m_strNetMetricName]->update(); 712 713 } 714 606 715 #include "UIPerformanceMonitor.moc" -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/UIPerformanceMonitor.h
r80162 r80187 54 54 const QString &name() const; 55 55 56 void setMaximum(float fMaximum); 57 float maximum() const; 58 59 void setMinimum(float fMinimum); 60 float minimum() const; 61 62 void setAverage(float fAverage); 63 float average() const; 56 void setMaximum(ULONG iMaximum); 57 ULONG maximum() const; 64 58 65 59 void setUnit(QString strUnit); 66 60 const QString &unit() const; 67 61 68 void addData( ULONG fData);69 const QQueue<ULONG> &data() const;62 void addData(int iDataSeriesIndex, ULONG fData); 63 const QQueue<ULONG> *data(int iDataSeriesIndex) const; 70 64 71 65 bool isPercentage() const; … … 78 72 QString m_strName; 79 73 QString m_strUnit; 80 float m_fMaximum; 81 float m_fMinimum; 82 float m_fAverage; 83 QQueue<ULONG> m_data; 74 ULONG m_iMaximum; 75 QQueue<ULONG> m_data[2]; 84 76 int m_iMaximumQueueSize; 85 77 bool m_fRequiresGuestAdditions; … … 110 102 bool guestAdditionsAvailable(int iMinimumMajorVersion); 111 103 void enableDisableGuestAdditionDependedWidgets(bool fEnable); 104 void updateCPUGraphsAndMetric(ULONG iLoadPercentage); 105 void updateRAMGraphsAndMetric(quint64 iTotalRAM, quint64 iFreeRAM); 106 void updateNewGraphsAndMetric(ULONG iReceiveRate, ULONG iTransmitRate); 107 112 108 bool m_fGuestAdditionsAvailable; 113 109 /** Holds the machine instance. */ … … 132 128 QString m_strCPUMetricName; 133 129 QString m_strRAMMetricName; 134 130 QString m_strDiskMetricName; 131 QString m_strNetMetricName; 135 132 }; 136 133
Note:
See TracChangeset
for help on using the changeset viewer.