VirtualBox

Changeset 83424 in vbox


Ignore:
Timestamp:
Mar 25, 2020 6:13:24 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
136643
Message:

FE/Qt: bugref:9686. Updating RAM column.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/monitor/resource/UIResourceMonitor.cpp

    r83404 r83424  
    9393
    9494    quint64  m_uTotalRAM;
     95    quint64  m_uFreeRAM;
    9596    quint64  m_uUsedRAM;
    9697    float    m_fRAMUsagePercentage;
     
    110111
    111112    CMachineDebugger m_comDebugger;
     113
     114private:
     115
     116    void setupPerformanceCollector();
     117
     118};
     119
     120
     121/*********************************************************************************************************************************
     122*   Class UIVMResouceMonitorProxyModel definition.                                                                           *
     123*********************************************************************************************************************************/
     124class UIResourceMonitorProxyModel : public QSortFilterProxyModel
     125{
     126
     127    Q_OBJECT;
     128
     129public:
     130
     131    UIResourceMonitorProxyModel(QObject *parent = 0);
     132    void dataUpdate();
     133    void setColumnShown(const QVector<bool>& columnShown);
     134
     135protected:
     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
     140private:
     141
     142    QVector<bool> m_columnShown;
     143
     144};
     145
     146
     147/*********************************************************************************************************************************
     148*   Class UIResourceMonitorModel definition.                                                                                     *
     149*********************************************************************************************************************************/
     150class UIResourceMonitorModel : public QAbstractTableModel
     151{
     152    Q_OBJECT;
     153
     154signals:
     155
     156    void sigDataUpdate();
     157
     158public:
     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
     167private slots:
     168
     169    void sltMachineStateChanged(const QUuid &uId, const KMachineState state);
     170    void sltTimeout();
     171
     172private:
     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;
    112185    /** @name The following are used during UIPerformanceCollector::QueryMetricsData(..)
    113186      * @{ */
     
    117190    CPerformanceCollector m_performanceMonitor;
    118191
    119 private:
    120 
    121     void initPerformanceCollector();
    122 
    123 };
    124 
    125 
    126 /*********************************************************************************************************************************
    127 *   Class UIVMResouceMonitorProxyModel definition.                                                                           *
    128 *********************************************************************************************************************************/
    129 class UIResourceMonitorProxyModel : public QSortFilterProxyModel
    130 {
    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 QAbstractTableModel
    156 {
    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 
    185192};
    186193
     
    209216    , m_uCPUVMMLoad(0)
    210217    , m_uTotalRAM(0)
     218    , m_uFreeRAM(0)
    211219    , m_uUsedRAM(0)
    212220    , m_fRAMUsagePercentage(0)
     
    229237            m_comDebugger = comConsole.GetDebugger();
    230238    }
    231     initPerformanceCollector();
    232239}
    233240
     
    250257    , m_uVMExitTotal(0)
    251258{
    252     initPerformanceCollector();
    253259}
    254260
     
    271277    , m_uVMExitTotal(0)
    272278{
    273     initPerformanceCollector();
    274279}
    275280
     
    281286}
    282287
    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 }
    293288
    294289
     
    305300    if (sourceModel())
    306301        emit dataChanged(index(0,0), index(sourceModel()->rowCount(), sourceModel()->columnCount()));
     302    invalidate();
    307303}
    308304
     
    317313void UIResourceMonitorProxyModel::setColumnShown(const QVector<bool>& columnShown)
    318314{
     315    emit layoutAboutToBeChanged();
    319316    m_columnShown = columnShown;
    320317    invalidateFilter();
     318    emit layoutChanged();
    321319}
    322320
     
    374372            break;
    375373        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));
    377375            break;
    378376        case VMResouceMonitorColumn_NetworkUpRate:
     
    395393            break;
    396394        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));
    398396            break;
    399397        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));
    401399            break;
    402400        case VMResouceMonitorColumn_VMExits:
     
    429427        {
    430428            if (comMachine.GetState() == KMachineState_Running)
    431             {
    432                 m_itemList << UIResourceMonitorItem(comMachine.GetId(), comMachine.GetName());
    433             }
     429                addItem(comMachine.GetId(), comMachine.GetName());
    434430        }
    435431    }
     432    setupPerformanceCollector();
    436433}
    437434
    438435void UIResourceMonitorModel::sltMachineStateChanged(const QUuid &uId, const KMachineState state)
    439436{
    440     emit layoutAboutToBeChanged();
    441     int iIndex = m_itemList.indexOf(UIResourceMonitorItem(uId));
     437    int iIndex = m_itemMap.value(uId, -1);
    442438    /* Remove the machine in case machine is no longer working. */
    443439    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    }
    446446    /* Insert the machine if it is working. */
    447447    if (iIndex == -1 && state == KMachineState_Running)
    448448    {
     449        emit layoutAboutToBeChanged();
    449450        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    }
    453456}
    454457
     
    458461    ULONG aPctHalted;
    459462    ULONG aPctVMM;
     463    /* RAM usage: */
     464    if (!m_performanceMonitor.isNull())
     465        queryRAMLoad();
     466
    460467    for (int i = 0; i < m_itemList.size(); ++i)
    461468    {
    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 
    473469        if (!m_itemList[i].m_comDebugger.isNull())
    474470        {
     
    501497    }
    502498    emit sigDataUpdate();
     499}
     500
     501void 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
     516void 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
     567void 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
     574void 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);
    503581}
    504582
     
    602680        m_pTableView->setShowGrid(false);
    603681        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);
    606684
    607685        m_pTableView->verticalHeader()->setVisible(false);
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