VirtualBox

Changeset 104943 in vbox


Ignore:
Timestamp:
Jun 17, 2024 3:56:46 PM (10 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
163548
Message:

FE/Qt. bugref:10659. Updating RAM related metrics of the local vms.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/activity/overview
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/activity/overview/UIVMActivityOverviewModelView.cpp

    r104924 r104943  
    2727
    2828/* Qt includes: */
     29#include <QApplication>
    2930#include <QHeaderView>
    3031#include <QTimer>
     
    3435#include "UIExtraDataDefs.h"
    3536#include "UIGlobalSession.h"
     37#include "UITranslator.h"
    3638#include "UIVirtualBoxEventHandler.h"
    3739#include "UIVMActivityOverviewModelView.h"
     
    6567    void resetDebugger();
    6668    void updateCells();
     69    bool isWithGuestAdditions();
     70    void setTotalRAM(quint64 uTotalRAM);
     71    void setFreeRAM(quint64 uFreeRAM);
    6772
    6873private:
     
    7277    CSession         m_comSession;
    7378    CGuest           m_comGuest;
     79
     80    quint64  m_uTotalRAM;
     81    quint64  m_uFreeRAM;
    7482};
    7583
     
    7886    : UIActivityOverviewAccessibleRow(pTableView, uMachineId, strMachineName)
    7987    , m_enmMachineState(enmMachineState)
     88    , m_uTotalRAM(0)
     89    , m_uFreeRAM(0)
    8090{
    8191    if (m_enmMachineState == KMachineState_Running)
     
    8696void UIActivityOverviewAccessibleRowLocal::updateCells()
    8797{
    88     // if (m_cells.contains((int) VMActivityOverviewColumn_Name))
    89     // {
    90     //     m_cells[(int)VMActivityOverviewColumn_Name]->setText(m_strMachineName);
    91     // }
     98    /* CPU Load: */
     99    ULONG aPctHalted;
     100    ULONG  uCPUGuestLoad;
     101    ULONG uCPUVMMLoad;
     102    m_comDebugger.GetCPULoad(0x7fffffff, uCPUGuestLoad, aPctHalted, uCPUVMMLoad);
     103
     104    if (m_cells.value(VMActivityOverviewColumn_CPUVMMLoad, 0))
     105        m_cells[VMActivityOverviewColumn_CPUVMMLoad]->setText(QString("%1%").arg(QString::number(uCPUVMMLoad)));
     106    if (m_cells.value(VMActivityOverviewColumn_CPUGuestLoad, 0))
     107        m_cells[VMActivityOverviewColumn_CPUGuestLoad]->setText(QString("%1%").arg(QString::number(uCPUGuestLoad)));
     108
     109    /* RAM Utilization: */
     110    QString strRAMUsage;
     111    QString strRAMPercentage;
     112    int iDecimalCount = 2;
     113    quint64 uUsedRAM = m_uTotalRAM - m_uFreeRAM;
     114    float m_fRAMUsagePercentage = 0;
     115
     116    if (m_uTotalRAM != 0)
     117        m_fRAMUsagePercentage = 100.f * (uUsedRAM / (float)m_uTotalRAM);
     118
     119    if (isWithGuestAdditions())
     120    {
     121        strRAMUsage =
     122            QString("%1/%2").arg(UITranslator::formatSize(_1K * uUsedRAM, iDecimalCount)).
     123            arg(UITranslator::formatSize(_1K * m_uTotalRAM, iDecimalCount));
     124        strRAMPercentage =
     125            QString("%1%").arg(QString::number(m_fRAMUsagePercentage, 'f', 2));
     126    }
     127    else
     128    {
     129        strRAMPercentage = QApplication::translate("UIVMActivityOverviewWidget", "N/A");
     130        strRAMUsage = QApplication::translate("UIVMActivityOverviewWidget", "N/A");
     131    }
     132
     133    if (m_cells.value(VMActivityOverviewColumn_RAMUsedAndTotal, 0))
     134        m_cells[VMActivityOverviewColumn_RAMUsedAndTotal]->setText(strRAMUsage);
     135    if (m_cells.value(VMActivityOverviewColumn_RAMUsedPercentage, 0))
     136        m_cells[VMActivityOverviewColumn_RAMUsedPercentage]->setText(strRAMPercentage);
    92137}
    93138
     
    134179}
    135180
     181bool UIActivityOverviewAccessibleRowLocal::isWithGuestAdditions()
     182{
     183    if (m_comGuest.isNull())
     184        return false;
     185    return m_comGuest.GetAdditionsStatus(m_comGuest.GetAdditionsRunLevel());
     186}
     187
     188void UIActivityOverviewAccessibleRowLocal::setTotalRAM(quint64 uTotalRAM)
     189{
     190    m_uTotalRAM = uTotalRAM;
     191}
     192
     193void UIActivityOverviewAccessibleRowLocal::setFreeRAM(quint64 uFreeRAM)
     194{
     195    m_uFreeRAM = uFreeRAM;
     196}
    136197
    137198/*********************************************************************************************************************************
     
    180241}
    181242
     243void UIActivityOverviewAccessibleModel::setupPerformanceCollector()
     244{
     245    m_nameList.clear();
     246    m_objectList.clear();
     247    /* Initialize and configure CPerformanceCollector: */
     248    const ULONG iPeriod = 1;
     249    const int iMetricSetupCount = 1;
     250    if (m_performanceCollector.isNull())
     251        m_performanceCollector = gpGlobalSession->virtualBox().GetPerformanceCollector();
     252    for (int i = 0; i < m_rows.size(); ++i)
     253        m_nameList << "Guest/RAM/Usage*";
     254    /* This is for the host: */
     255    m_nameList << "CPU*";
     256    m_nameList << "FS*";
     257    m_objectList = QVector<CUnknown>(m_nameList.size(), CUnknown());
     258    m_performanceCollector.SetupMetrics(m_nameList, m_objectList, iPeriod, iMetricSetupCount);
     259}
     260
     261void UIActivityOverviewAccessibleModel::clearData()
     262{
     263    /* We have a request to detach COM stuff,
     264     * first of all we are removing all the items,
     265     * this will detach COM wrappers implicitly: */
     266    qDeleteAll(m_rows);
     267    m_rows.clear();
     268    /* Detaching perf. collector finally,
     269     * please do not use it after all: */
     270    m_performanceCollector.detach();
     271}
     272
    182273UIActivityOverviewAccessibleModel::~UIActivityOverviewAccessibleModel()
    183274{
    184     qDeleteAll(m_rows);
     275    clearData();
    185276}
    186277
     
    248339            addRow(comMachine.GetId(), comMachine.GetName(), comMachine.GetState());
    249340    }
     341    setupPerformanceCollector();
    250342}
    251343
     
    303395
    304396    /* Use IPerformanceCollector to update VM RAM usage and Host CPU and file IO stats: */
    305     //queryPerformanceCollector();
     397    queryPerformanceCollector();
    306398
    307399    for (int i = 0; i < m_rows.size(); ++i)
     
    345437}
    346438
     439void UIActivityOverviewAccessibleModel::queryPerformanceCollector()
     440{
     441    QVector<QString>  aReturnNames;
     442    QVector<CUnknown>  aReturnObjects;
     443    QVector<QString>  aReturnUnits;
     444    QVector<ULONG>  aReturnScales;
     445    QVector<ULONG>  aReturnSequenceNumbers;
     446    QVector<ULONG>  aReturnDataIndices;
     447    QVector<ULONG>  aReturnDataLengths;
     448
     449    QVector<LONG> returnData = m_performanceCollector.QueryMetricsData(m_nameList,
     450                                                                       m_objectList,
     451                                                                       aReturnNames,
     452                                                                       aReturnObjects,
     453                                                                       aReturnUnits,
     454                                                                       aReturnScales,
     455                                                                       aReturnSequenceNumbers,
     456                                                                       aReturnDataIndices,
     457                                                                       aReturnDataLengths);
     458    /* Parse the result we get from CPerformanceCollector to get respective values: */
     459    for (int i = 0; i < aReturnNames.size(); ++i)
     460    {
     461        if (aReturnDataLengths[i] == 0)
     462            continue;
     463        /* Read the last of the return data disregarding the rest since we are caching the data in GUI side: */
     464        float fData = returnData[aReturnDataIndices[i] + aReturnDataLengths[i] - 1] / (float)aReturnScales[i];
     465        if (aReturnNames[i].contains("RAM", Qt::CaseInsensitive) && !aReturnNames[i].contains(":"))
     466        {
     467            if (aReturnNames[i].contains("Total", Qt::CaseInsensitive) || aReturnNames[i].contains("Free", Qt::CaseInsensitive))
     468            {
     469                {
     470                    CMachine comMachine = (CMachine)aReturnObjects[i];
     471                    if (comMachine.isNull())
     472                        continue;
     473                    int iIndex = itemIndex(comMachine.GetId());
     474                    if (iIndex == -1 || iIndex >= m_rows.size() || !m_rows[iIndex])
     475                        continue;
     476
     477                    UIActivityOverviewAccessibleRowLocal *pItem = qobject_cast<UIActivityOverviewAccessibleRowLocal*>(m_rows[iIndex]);
     478                    if (!pItem)
     479                        continue;
     480                    if (aReturnNames[i].contains("Total", Qt::CaseInsensitive))
     481                        pItem->setTotalRAM((quint64)fData);
     482                    else
     483                        pItem->setFreeRAM((quint64)fData);
     484                }
     485            }
     486        }
     487    //     else if (aReturnNames[i].contains("CPU/Load/User", Qt::CaseInsensitive) && !aReturnNames[i].contains(":"))
     488    //     {
     489    //         CHost comHost = (CHost)aReturnObjects[i];
     490    //         if (!comHost.isNull())
     491    //             m_hostStats.m_iCPUUserLoad = fData;
     492    //     }
     493    //     else if (aReturnNames[i].contains("CPU/Load/Kernel", Qt::CaseInsensitive) && !aReturnNames[i].contains(":"))
     494    //     {
     495    //         CHost comHost = (CHost)aReturnObjects[i];
     496    //         if (!comHost.isNull())
     497    //             m_hostStats.m_iCPUKernelLoad = fData;
     498    //     }
     499    //     else if (aReturnNames[i].contains("CPU/MHz", Qt::CaseInsensitive) && !aReturnNames[i].contains(":"))
     500    //     {
     501    //         CHost comHost = (CHost)aReturnObjects[i];
     502    //         if (!comHost.isNull())
     503    //             m_hostStats.m_iCPUFreq = fData;
     504    //     }
     505    //    else if (aReturnNames[i].contains("FS", Qt::CaseInsensitive) &&
     506    //             aReturnNames[i].contains("Total", Qt::CaseInsensitive) &&
     507    //             !aReturnNames[i].contains(":"))
     508    //    {
     509    //         CHost comHost = (CHost)aReturnObjects[i];
     510    //         if (!comHost.isNull())
     511    //             m_hostStats.m_iFSTotal = _1M * fData;
     512    //    }
     513    //    else if (aReturnNames[i].contains("FS", Qt::CaseInsensitive) &&
     514    //             aReturnNames[i].contains("Free", Qt::CaseInsensitive) &&
     515    //             !aReturnNames[i].contains(":"))
     516    //    {
     517    //         CHost comHost = (CHost)aReturnObjects[i];
     518    //         if (!comHost.isNull())
     519    //             m_hostStats.m_iFSFree = _1M * fData;
     520    //    }
     521    }
     522}
     523
    347524
    348525/*********************************************************************************************************************************
     
    354531}
    355532
     533void UIActivityOverviewAccessibleProxyModel::dataUpdate()
     534{
     535    if (sourceModel())
     536        emit dataChanged(index(0,0), index(sourceModel()->rowCount(), sourceModel()->columnCount()));
     537    invalidate();
     538}
     539
    356540
    357541/*********************************************************************************************************************************
     
    428612void UIActivityOverviewAccessibleCell::setText(const QString &strText)
    429613{
    430     printf("%s\n", qPrintable(strText));
    431614    m_strText = strText;
    432615}
  • trunk/src/VBox/Frontends/VirtualBox/src/activity/overview/UIVMActivityOverviewModelView.h

    r104922 r104943  
    4141
    4242/* COM includes: */
     43#include "CPerformanceMetric.h"
     44#include "CPerformanceCollector.h"
    4345#include "KMachineState.h"
     46
    4447
    4548class QTimer;
     
    7275
    7376    UIActivityOverviewAccessibleProxyModel(QObject *parent = 0);
     77    void dataUpdate();
    7478
    7579protected:
     
    160164    int itemIndex(const QUuid &uid);
    161165    void setShouldUpdate(bool fShouldUpdate);
     166    void clearData();
    162167
    163168private slots:
     
    172177    void addRow(const QUuid& uMachineId, const QString& strMachineName, KMachineState enmState);
    173178    void removeRow(const QUuid& uMachineId);
     179    void setupPerformanceCollector();
     180    void queryPerformanceCollector();
    174181    QVector<UIActivityOverviewAccessibleRow*> m_rows;
    175182    QITableView *m_pTableView;
     
    178185    /** Maximum length of string length of data displayed in column. Updated in UIActivityOverviewModel::data(..). */
    179186    mutable QMap<int, int> m_columnDataMaxLength;
     187    CPerformanceCollector m_performanceCollector;
     188    /** @name The following are used during UIPerformanceCollector::QueryMetricsData(..)
     189     * @{ */
     190       QVector<QString> m_nameList;
     191       QVector<CUnknown> m_objectList;
     192    /** @} */
    180193
    181194};
  • trunk/src/VBox/Frontends/VirtualBox/src/activity/overview/UIVMActivityOverviewWidget.cpp

    r104922 r104943  
    19021902        connect(m_pModel, &UIActivityOverviewModel::sigDataUpdate,
    19031903                this, &UIVMActivityOverviewWidget::sltHandleDataUpdate);
     1904        connect(m_pAccessibleModel, &UIActivityOverviewAccessibleModel::sigDataUpdate,
     1905                this, &UIVMActivityOverviewWidget::sltHandleDataUpdate);
    19041906        connect(m_pModel, &UIActivityOverviewModel::sigHostStatsUpdate,
    19051907                this, &UIVMActivityOverviewWidget::sltHandleHostStatsUpdate);
     
    19321934    m_pAccessibleTableView->setSortingEnabled(true);
    19331935    m_pAccessibleTableView->sortByColumn(0, Qt::AscendingOrder);
    1934     m_pAccessibleTableView->hide();
    19351936
    19361937    layout()->addWidget(m_pAccessibleTableView);
     
    20192020    if (m_pModel)
    20202021        m_pModel->clearData();
     2022    if (m_pAccessibleModel)
     2023        m_pAccessibleModel->clearData();
    20212024}
    20222025
     
    20482051    if (m_pProxyModel)
    20492052        m_pProxyModel->dataUpdate();
     2053    if (m_pAccessibleProxyModel)
     2054        m_pAccessibleProxyModel->dataUpdate();
    20502055}
    20512056
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette