Ну вот, обновление сделал в 10 раз быстрее, а параметр
printf("\r"); его ожидаемо затормозил. Теперь обновляется быстрее. Из минусов. Монитор теперь потребляет 7 процентов процессора, а не 0.7 как раньше. И курсор каждое обновление строки, то есть быстрее секунды, прыгает по всей строке, каждый раз на новом месте.
Ну и костыль получился. Уверен, что реально он фигачит несколько десятков строк в секунду, но вывод достается одной "из полка" в пол-секунды. Вот и 7 процентов. да у меня киношка HD столько жрет, и то не всегда.
Пользователь добавил сообщение 26 Декабря 2016, 17:53:29:
я же написал, что сам вызов вставить перед
Цитировать
status = CTTMetrics_GetValue(metric_cnt, metric_values);
Выдал кучу ошибок. Причем на все мое вмешательство.
cttmetrics_sample.cpp: В функции «void gotoxy(int, int)»:
cttmetrics_sample.cpp:50:3: ошибка: нет декларации «COORD» в этой области видимости
COORD scrn;
^
cttmetrics_sample.cpp:50:9: ошибка: expected «;» before «scrn»
COORD scrn;
^
cttmetrics_sample.cpp:52:3: ошибка: нет декларации «HANDLE» в этой области видимости
HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
^
cttmetrics_sample.cpp:52:10: ошибка: expected «;» before «hOuput»
HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
^
cttmetrics_sample.cpp:54:3: ошибка: нет декларации «scrn» в этой области видимости
scrn.X = xpos; scrn.Y = ypos;
^
cttmetrics_sample.cpp:56:28: ошибка: нет декларации «hOuput» в этой области видимости
SetConsoleCursorPosition(hOuput,scrn);
^
cttmetrics_sample.cpp:56:39: ошибка: нет декларации «SetConsoleCursorPosition» в этой области видимости
SetConsoleCursorPosition(hOuput,scrn);
File Name: cttmetrics_sample.cpp
\* ****************************************************************************** */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include "cttmetrics.h"
volatile sig_atomic_t run = 1;
void signal_handler(int signo)
{
if (SIGINT == signo)
{
run = 0;
}
}
void gotoxy(int xpos, int ypos)
{
COORD scrn;
HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
scrn.X = xpos; scrn.Y = ypos;
SetConsoleCursorPosition(hOuput,scrn);
}
int main(int argc, char *argv[])
{
cttStatus status = CTT_ERR_NONE;
cttMetric metrics_ids[] = {CTT_USAGE_RENDER, CTT_USAGE_VIDEO, CTT_USAGE_VIDEO_ENHANCEMENT, CTT_AVG_GT_FREQ, CTT_USAGE_VIDEO2};
unsigned int metric_cnt = sizeof(metrics_ids)/sizeof(metrics_ids[0]);
unsigned int num_samples = 100;
unsigned int period_ms = 500;
if (1 < argc && NULL != argv[1])
{
num_samples = atoi(argv[1]);
}
if (2 < argc && NULL != argv[2])
{
period_ms = atoi(argv[2]);
}
signal(SIGINT, signal_handler);
status = CTTMetrics_Init();
if (CTT_ERR_NONE != status)
{
fprintf(stderr, "ERROR: Failed to initialize metrics monitor, error code %d\n", (int)status);
return 1;
}
unsigned int metric_all_cnt = 0;
status = CTTMetrics_GetMetricCount(&metric_all_cnt);
if (CTT_ERR_NONE != status)
{
fprintf(stderr, "ERROR: Failed to get number of metrics available, error code %d\n", (int)status);
return 1;
}
cttMetric metric_all_ids[CTT_MAX_METRIC_COUNT] = {CTT_WRONG_METRIC_ID};
status = CTTMetrics_GetMetricInfo(metric_all_cnt, metric_all_ids);
if (CTT_ERR_NONE != status)
{
fprintf(stderr, "ERROR: Failed to get metrics info, error code %d\n", (int)status);
return 1;
}
unsigned int i;
bool isVideo2 = false;
for (i = 0; i < metric_all_cnt; ++i)
{
if (CTT_USAGE_VIDEO2 == metric_all_ids[i])
isVideo2 = true;
}
if (false == isVideo2)
metric_cnt = metric_cnt - 1; // exclude video2 usage metric
bool isFreq = false;
for (i = 0; i < metric_all_cnt; ++i)
{
if (CTT_AVG_GT_FREQ == metric_all_ids[i])
isFreq = true;
}
if (false == isFreq)
metric_cnt = metric_cnt - 1; // exclude average frequency metric
status = CTTMetrics_Subscribe(metric_cnt, metrics_ids);
if (CTT_ERR_NONE != status)
{
fprintf(stderr, "ERROR: Failed to subscribe for metrics, error code %d\n", (int)status);
return 1;
}
status = CTTMetrics_SetSampleCount(num_samples);
if (CTT_ERR_NONE != status)
{
fprintf(stderr, "ERROR: Failed to set number of samples, error code %d\n", (int)status);
return 1;
}
status = CTTMetrics_SetSamplePeriod(period_ms);
if (CTT_ERR_NONE != status)
{
fprintf(stderr, "ERROR: Failed to set measure interval, error code %d\n", (int)status);
return 1;
}
float metric_values[metric_cnt];
memset(metric_values, 0, (size_t)metric_cnt * sizeof(float));
while(run)
{
gotoxy(0, 0);
status = CTTMetrics_GetValue(metric_cnt, metric_values);
if (CTT_ERR_NONE != status)
{
fprintf(stderr, "ERROR: Failed to get metrics, error code %d\n", status);
return 1;
}
printf("RENDER usage: %3.2f,\tVIDEO usage: %3.2f,\tVIDEO_E usage: %3.2f", metric_values[0], metric_values[1], metric_values[2]);
if (true == isVideo2)
printf("\tVIDEO2 usage: %3.2f", metric_values[4]);
if (true == isFreq)
printf("\tGT Freq: %4.2f", metric_values[3]);
printf("\n");
}
CTTMetrics_Close();
return 0;
}
Пользователь добавил сообщение 26 Декабря 2016, 18:02:42:
gotoxy(0, 0);
Это исправил, одной ошибкой меньше. Осталось еще 10 в объявлении функции.
))
Пользователь добавил сообщение 26 Декабря 2016, 18:06:17:
У меня что-то не хватает среди ?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include "cttmetrics.h"