Средства диагностики Плагин для Qt Creator

—

от автора

Доброго времени суток. Недавно загорелся идеей написать простой, но функциональный плагин для среды разработки Qt Creator, предназначенный для визуализации данных об использовании оперативной памяти и загрузки ЦП текущим запущенным процессом. В качестве вдохновения для меня послужил инструментарий «Средства диагностики», присутствующий в Visual Studio. Ниже я расскажу об основных деталях разработки.


Так как тема создания плагинов для Qt Creator уже подробно описана на хабре, например, в статье Система расширений Qt Creator, то поэтому не буду останавливаться на общей информации и перейду сразу к описанию плагина.

Собственно, для того, чтобы получить информацию о любом запущенном в операционной системе процессе для начала необходимо узнать его идентификатор (PID). Вопросом получения PID запущенного через Qt Creator процесса я и занялся в первую очередь. После безрезультатного гугления на эту тему я перешел к изучению исходников Qt Creator, в ходе чего обнаружил, что узнать искомые данные довольно просто. Для этого нужны поймать следующие сигналы, испускаемые статическим экземпляром ProjectExplorer::ProjectExplorerPlugin::instance():

void runControlStarted(ProjectExplorer::RunControl *rc);
void updateRunActions();
void runControlFinished(ProjectExplorer::RunControl *rc);

// connects     connect(ProjectExplorer::ProjectExplorerPlugin::instance(),       &ProjectExplorer::ProjectExplorerPlugin::runControlStarted,             this, &DiagnosticToolsPlugin::onRunControlStarted);      connect(ProjectExplorer::ProjectExplorerPlugin::instance(),       &ProjectExplorer::ProjectExplorerPlugin::runControlFinished,             this, &DiagnosticToolsPlugin::onRunControlFinished);      connect(ProjectExplorer::ProjectExplorerPlugin::instance(),             &ProjectExplorer::ProjectExplorerPlugin::updateRunActions,             this, &DiagnosticToolsPlugin::onUpdateRunActions);  // slots void DiagnosticToolsPlugin::onRunControlStarted(ProjectExplorer::RunControl *rc){     m_runControlPtr = rc; } void DiagnosticToolsPlugin::onUpdateRunActions(){     if(m_runControlPtr){         m_dataQueryEngine->setPid(m_runControlPtr->applicationProcessHandle().pid());         m_dataQueryEngine->startDataQuery();     } } void DiagnosticToolsPlugin::onRunControlFinished(ProjectExplorer::RunControl *rc){     Q_UNUSED(rc)     m_runControlPtr = NULL;     m_dataQueryEngine->stopDataQuery(); } 

Получив сигнал void runControlStarted(ProjectExplorer::RunControl *rc), запоминаем указать m_runControlPtr на объект ProjectExplorer::RunControl *rc и далее в слоте onUpdateRunActions() узнаем PID. Отслеживание сигнала updateRunActions оказалось необходимым по причине того, что после сигнала runControlStarted значение PID в объекте ProjectExplorer::RunControl *rc было еще не известно(равно нулю).

Следующие задачи были тривиальными. В операционной системе Windows информация об используемой процессом памяти и загрузке ЦП была получена через WinApi, в Linux — посредством анализа содержимого файлов /proc/pid/stat и /proc/stat.

Финальный штрих — визуализация собранной информации. Первой мыслью было использовать модуль Qt для построения графиков Qt Charts, но в виду того, что данный компонент не является частью Qt Creator из коробки и по причине простоты решаемой мною задачи, в итоге было решено реализовать свой класс для рисования графиков. Закончив работу с GUI, я стал думать, где разместить созданную графическую форму. С одной стороны, было бы логично поместить ее снизу вместе с остальными панелями вывода, с другой — хотелось бы видеть одновременно и вывод приложения и информацию об используемых им ресурсах компьютера. Поэтому было принято волевое (возможно, неудачное) решение поместить графическую форму на левую боковую панель. И вот, что получилось в итоге:

Заключение
В статье было описано, что уже сделано на данный момент. Далее планируется создать версию под Mac OS и добавить окно настроек, в котором будет присутствовать возможность задать интервал опроса, шаг на графике, цвет и т. д. Может быть, кто-нибудь подкинет другие идеи по улучшению. Посмотреть исходный код и скачать плагин можно здесь.

Всем спасибо за внимание.
ссылка на оригинал статьи https://habrahabr.ru/post/329024/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *