2013-08-09 2 views
1

В настоящее время я пишу программу командной строки C. В моей программе есть множество сложных циклов и вычислений. Здесь возникает проблема, что моя программа потребляет около 2 минут для завершения вычислений, поэтому я хотел бы что-то печатать во время вычислений, чтобы показать, что она работает хорошо, иначе программа будет работать в тишине в течение 2 минут, что кажется слишком длинным для пользователей, и они могут подумать, что он сработает.Показывать статус выполнения в процентах при вычислении

Однако, если я просто вставляю строку кода для печати определенных значений в основной цикл, это значительно замедлит мою программу (я думаю, это потому, что мой код будет ждать, пока на экране не появится функция printf).

Теперь у меня есть функциональное, но действительно уродливое решение, то есть печать каждые 1000 циклов. Для меня в идеале лучшим решением этой проблемы является статус печати в процентах и ​​симуляторный запуск кода в фоновом режиме. (Точно так же, как выполнить sudo apt-get update в Linux)

ответ

0

Простым однопоточным решением было бы проверить каждую итерацию цикла x (например, 1000), чтобы достигнуть желаемого следующего состояния (например, 1%), и затем распечатать заявление. Опционально проверяйте, по крайней мере, (половина) секунда.

#include <sys/time.h> 

struct timeval last, now; 
gettimeofday(&last, NULL); 
size_t lastprint = 0; 

size_t i; 
for (i = 0; i < num_iterations; i++) { 
    if (!(i & 0x3FF)) { // every 1024 iterations 
     if (100 * (i - lastprint)/num_iterations >= 1) { // at least one percent passed 
      gettimeofday(&now, NULL); 

      if (now.tv_usec - last.tv_usec + (1000000 * (now.tv_sec - last.tv_sec)) > 500000) { // at least half a second passed 
       // print status 

       last = now; 
       lastprint = i; 

      } 
     } 
    } 

    // do work 
} 

В зависимости от того, как долго проходит итерация цикла, это может иметь или не иметь воздействия на производительность. Как правило: если ваша петля занимает больше времени, а затем 20 наносекунд для выполнения, вы будете в порядке с этим.

Если петли, что мало, что вы не можете позволить себе иметь дополнительный филиал в них сообщения о состоянии, то

  • Вы должны рассмотреть parallelising код первого
  • Вы должны поставить индекс итерации в общую переменную и проверить ее с потоком печати состояния каждые (половина) секунды и напечатать сообщения о статусе, подобные этому.
0

Вы можете рассмотреть возможность использования целого числа (или более точного типа данных для очень небольшого числа), которое будет являться статусом программы. Когда вы хотите увеличить процент, вы можете просто сделать identifier++. Вам также необходимо будет запустить фоновый процесс, обнаружив, был ли изменен identifier и вызывается функция, которая выводит новый процент на экран.

Это очень упрощенное решение и, возможно, самое простое решение для логического вывода, однако есть много способов (и гораздо более точные/эффективные способы) реализовать это.

+1

Хорошее решение, но я думаю, ему нужен другой поток для печати 'идентификатор' –

1

У вас может быть механизм очереди событий. Скажите, что ваша программа выполняет действие 1, действие 2, действие 3 .. действие n. Запустите основную программу в одном потоке, пока другой поток ожидает очереди для обработки событий. Публикация событий из основного потока в поток слушателя. Псевдо-код

Main thread 

    main() 
    { 
     create(Q);//Q is global 
     thread_launch(listener,Q);//Launch the thread with Q as argument 
     do_action_1(); 
     do_action_2(); 
     ...... 
     do_action_n(); 
    } 

    do_action_n() 
    { 
     ..... 
     post(event,Q);//this event should have some information about the action. 
    } 

Выполнить это в отдельном слушающего потока

 void ListenerThread(Queue *Q) 
     { 
     while (nextEvent(Q,&event)) 
     { 
     switch(event) 
     case action1: 
     printf("complete %25"); 
      ... 
     case actionn: 
      printf("completed"); 

     } 
     } 

Вы должны иметь это событие - реализация очереди в C, хотя что может быть достигнуто с помощью PTHREAD библиотеки.

+0

NICE Я попробую в следующий раз –

Смежные вопросы