Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Вывод в терминале строк с меняющимися данными в одну строку.  (Прочитано 4700 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн starky

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Все лишние процессы metrics_monitor нужно убить, из-за этого и могла идти задержка.
Я уже "убил". Но каждый брал 0.7 - 1% процент, если верить top

Сейчас попробую.

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
renzrv, и будет дописывать все в конец строки. тут надо вернуть каретку на начало строки.

Код: (cpp) [Выделить]
void gotoxy(int xpos, int ypos)
{
  COORD scrn;   
 
  HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
 
  scrn.X = xpos; scrn.Y = ypos;
 
  SetConsoleCursorPosition(hOuput,scrn);
}
« Последнее редактирование: 26 Декабря 2016, 16:03:29 от EvangelionDeath »
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Punko

  • Гость
starky, а если навелосипедить - весь вывод пихать в файл какой-нибудь темп, а уже из темпа читать через
tail -f?

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
EvangelionDeath,
Код: (C++) [Выделить]
    printf("\r");Не сработает?

Оффлайн starky

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
printf("\r");

Странный результат. По идее, получилось. То есть новая строка выводится с начала предыдущей, то есть "возврат каретки" на той же строке. НО. Обновляется каждые 6 секунд.(Причем теперь интервалы ровные)  Само собой я все прежние строки убрал. Только код в C исправил. Неожиданно.
А когда там "конец строки" стоит, она эти строки выплевывает почти две в секунду. Ну и как это объяснить?

Пользователь добавил сообщение 26 Декабря 2016, 16:30:16:
void gotoxy(int xpos, int ypos)
{
  COORD scrn;   
 
  HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
 
  scrn.X = xpos; scrn.Y = ypos;
 
  SetConsoleCursorPosition(hOuput,scrn);
}

Из возни с ардуино я вспоминаю, что это void gotoxy(int xpos, int ypos) определение функции. И куда по тексту это gotoxy(0,0) вкорячить?
Я не программист. Я потерпевший. :)
« Последнее редактирование: 26 Декабря 2016, 16:32:55 от starky »

Punko

  • Гость
А когда там "конец строки" стоит, она эти строки выплевывает почти две в секунду. Ну и как это объяснить?

Разница при выводе одинаковой информации на одной и той же строке не заметна ;)
Думаю, так объяснить и можно - данные меняются примерно раз в 6 секунд.

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
По идее, получилось. То есть новая строка выводится с начала предыдущей, то есть "возврат каретки" на той же строке. НО. Обновляется каждые 6 секунд.

Там все время меняется частота видеоядра в простое, Примерно раз в 5 -10 секунд. (Последнее значение в строке) И RENDER usage: в пределал процента - двух периодически, несколько раз за десять секунд

Оффлайн starky

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Даже если данные меняются раз в 6 секунд, (хотя нет, я же видел), то строки то бегут быстрее. Задержка меньше. А тут и начало вывода на 6 секунд отложено. Ну в смысле, когда они бежала вверх потоком было видно. Я на память не буду, сейчас обратно соберу как было прогу и посмотрю.

Пользователь добавил сообщение 26 Декабря 2016, 16:43:31:
Собрал обратно. Данные отражаются быстрее , видно из куска листинга

Цитировать
RENDER usage: 0.00,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
RENDER usage: 1.01,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
RENDER usage: 0.00,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
RENDER usage: 1.01,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
RENDER usage: 0.00,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
RENDER usage: 0.00,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 1000.00
RENDER usage: 1.01,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
RENDER usage: 0.00,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
RENDER usage: 1.01,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
RENDER usage: 1.01,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 483.00

RENDER usage: 1.01,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
RENDER usage: 0.00,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
RENDER usage: 0.00,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
RENDER usage: 0.00,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
RENDER usage: 0.00,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
RENDER usage: 1.01,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
RENDER usage: 0.00,   VIDEO usage: 0.00,   VIDEO_E usage: 0.00   GT Freq: 350.00
То есть данные меняются в соседних строках, а это меньше секунды.
Я даже намек не могу уловить, как замена перевода строки на возврат каретки, может дать задержку в 5 секунд.
А я думал задача простая.
« Последнее редактирование: 26 Декабря 2016, 16:46:56 от starky »

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Перед этим в цикле while (run)
Код: (cpp) [Выделить]
status = CTTMetrics_GetValue(metric_cnt, metric_values);

renzrv,  printf("\r") - теоретически может помочь, так как это половина кода перевода каретки в Win. Но лучше все же явно указывать куда переместить каретку. То есть оно может и помочь, а может и не помочь - зависит он типа терминала
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн starky

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
 
Перед этим в цикле while (run)
Код: C++

    status = CTTMetrics_GetValue(metric_cnt, metric_values);


while(run)
    {
        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]);

Функцию как вы описали, я определил в начале программы, там где и первый void. Правильно?
А вот как тут её вставить? Вот кусок кода, о котором вы пишите.

Пользователь добавил сообщение 26 Декабря 2016, 17:07:07:
Там кстати, в начале проги (уже после main)
unsigned int period_ms = 500
Это похоже на период "считывания" данных с драйвера.  Как раз пол секунды. Это кстати "примерная" программа, насколько я видел в документации, эти данные можно читать 60 раз в секунду, а больше типа будет мешать транскодированию. Так что 500 ms - это сущий пустяк, в 30 медленнее, чем могло бы.


Пользователь добавил сообщение 26 Декабря 2016, 17:20:36:
А если я значение этой переменной сделаю меньше, в 10 раз, и поставлю "возврат каретки", может это компенсирует эти 6 секунд.Они возможно просто вывод тормозят этим параметром, лишь бы он не коррелировал со второй переменной, которая 100 сэмплов отсчитывает. Может и её в 10 раз уменьшить.


Пользователь добавил сообщение 26 Декабря 2016, 17:26:25:
unsigned int period_ms = 500
Точно, эта переменная вывод тормозит. Сделал её в 10 раз меньше, вывод в 10 раз ускорился. Ну на глаз, просто поток строк. Сейчас возврат каретки воткну назад.
« Последнее редактирование: 26 Декабря 2016, 17:26:25 от starky »

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
starky, я же написал, что сам вызов вставить перед
Цитировать
status = CTTMetrics_GetValue(metric_cnt, metric_values);
будет так
Код: (cpp) [Выделить]
gotoxy(0, 0);
status = CTTMetrics_GetValue(metric_cnt, metric_values);
« Последнее редактирование: 26 Декабря 2016, 17:41:10 от EvangelionDeath »
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн starky

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Ну вот, обновление сделал в 10 раз быстрее, а параметр printf("\r"); его ожидаемо затормозил. Теперь обновляется быстрее. Из минусов. Монитор теперь потребляет 7 процентов процессора, а не 0.7 как раньше. И курсор каждое обновление строки, то есть быстрее секунды, прыгает по всей строке, каждый раз на новом месте.
Ну и костыль получился. Уверен, что реально он фигачит несколько десятков строк в секунду, но вывод достается одной "из полка" в пол-секунды. Вот и 7 процентов. да у меня киношка HD столько жрет, и то не всегда. :)

Пользователь добавил сообщение 26 Декабря 2016, 17:53:29:
я же написал, что сам вызов вставить перед
Цитировать

    status = CTTMetrics_GetValue(metric_cnt, metric_values);

Выдал кучу ошибок. Причем на все мое вмешательство.
(Нажмите, чтобы показать/скрыть)
(Нажмите, чтобы показать/скрыть)

Пользователь добавил сообщение 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"

« Последнее редактирование: 26 Декабря 2016, 18:06:17 от starky »

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
то пример с WinAPI
замените содержимое функцию gotoxy на вот это
Код: (cpp) [Выделить]
void gotoxy(int x,int y) {
    printf("%c[%d;%df",0x1B,y,x);
}
Можно вообще и без функции обойтись, просто перед
Цитировать
status = CTTMetrics_GetValue(metric_cnt, metric_values);
вставить
Цитировать
printf("%c[%d;%df",0x1B,0,0);
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн starky

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Ура, работает. Только надо еще очистить терминал перед выводом, а то оно самой верхней строкой показывает.
Здорово быть умным, как вы. Спасибо. :)
« Последнее редактирование: 26 Декабря 2016, 18:33:17 от starky »

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
starky, ну использование system не рекомендуется, но можно делать

system("clear"); сразу после открытия фигурных скобок в функции main()
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

 

Страница сгенерирована за 0.071 секунд. Запросов: 25.