Icon Ressource

[C/C++/WinAPI] Progressbar für die Windows Console 2020-07-30

Diese kleine Lib dient der Ausgabe von Fortschrittsanzeigen in das Windows Consolefenster oder das Windows Terminal.



pbar_create
Die Anzahl von Einzelschritten welche 100% repräsentieren wird bei der Erstellung parametriert. Ebenso werden Position, Länge, Farben und Beschriftung definiert. Lage und Länge können durch Übergabe eines negativen Werts an die entsprechenden Parameter auch anhand der Cursorposition und Fensterdimensionen automatisch bestimmt werden lassen. Solange die Progressbar nicht abgeschlossen wurde, wird kein Textcursor angezeigt,

pbar_push
Für jeden Einzelschritt wird eine Funktion aufgerufen, die den Fortschritt berechnet und die Progressbar sowie die Beschriftung aktualisiert. Diese Funktion ist threadsicher implementiert. Somit kann eine Progressbar auch mit konkurrierenden Aufrufen weitergesetzt werden.

pbar_finalize
Bei Abschluss der Progressbar kann die Beschriftung noch einmal aktualisiert werden. Der Textcursor wird unter die Beschriftung gesetzt und kann wieder angezeigt werden. Reservierter Speicher wird freigegeben.

Weiterhin sind Funktionen implementiert, die die Position in y-Richtung, die Länge, oder die derzeitige Anzahl verarbeiteter Schritte zurückgeben.

Beschreibungen der Funktionen mit deren Parametern und Rückgabewerten finden sich im conprogressbar.h Header im Download.



Testcode:
main.c:
#if defined(_MSC_VER)
# define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
#include "conprogressbar.h"

#undef WINVER
#define WINVER 0x0601
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0601
#undef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

// First four threads advance the same progress bar, a quarter of all steps each
// The return value of pbar_push is intentionally not used to abort the threads
// in order to observe if the mutex worked properly. Only in this case the value
// of the internal counter would reliably reach 1000
static DWORD __stdcall thread1(void *arg)
{
  for (int i = 0; i < 250; ++i)
  {
    Sleep(5);
    pbar_push(arg, "thread1");
  }

  return 0UL;
}

static DWORD __stdcall thread2(void *arg)
{
  for (int i = 0; i < 250; ++i)
  {
    Sleep(5);
    pbar_push(arg, "        thread2");
  }

  return 0UL;
}

static DWORD __stdcall thread3(void *arg)
{
  for (int i = 0; i < 250; ++i)
  {
    Sleep(5);
    pbar_push(arg, "                thread3");
  }

  return 0UL;
}

static DWORD __stdcall thread4(void *arg)
{
  for (int i = 0; i < 250; ++i)
  {
    Sleep(5);
    pbar_push(arg, "                        thread4");
  }

  return 0UL;
}

// This thread just demonstrates that more than one progress bar can be advanced
// simultaneously
// Drop out if pbar_push returns false
static DWORD __stdcall thread5(void *arg)
{
  char buffer[8] = { 0 };
  unsigned i = 0U;
  do
  {
    sprintf(buffer, "%u", ++i);
    Sleep(5);
  } while (pbar_push(arg, buffer));

  return 0UL;
}

int main(void)
{
  puts("\nprogress bar tests:\n");

  progress_bar pbar1 = pbar_create(1000, -1, -1, false, -1, 0xE4, NULL);
  if (pbar1 == NULL)
    return 1;

  const short y = pbar_get_line(pbar1) + 4;
  const short length = pbar_get_length(pbar1);
  progress_bar pbar2 = pbar_create(250, -1, y, true, length, 0xF1, "0");
  if (pbar2 == NULL)
  {
    pbar_finalize(&pbar1, NULL, true);
    return 1;
  }

  HANDLE hthreads[5] = { 0 };
  hthreads[0] = CreateThread(NULL, 0u, thread1, pbar1, 0UL, NULL);
  hthreads[1] = CreateThread(NULL, 0u, thread2, pbar1, 0UL, NULL);
  hthreads[2] = CreateThread(NULL, 0u, thread3, pbar1, 0UL, NULL);
  hthreads[3] = CreateThread(NULL, 0u, thread4, pbar1, 0UL, NULL);
  hthreads[4] = CreateThread(NULL, 0u, thread5, pbar2, 0UL, NULL);
  WaitForMultipleObjects(5UL, hthreads, TRUE, INFINITE);

  const size_t steps = pbar_get_steps(pbar1);
  pbar_finalize(&pbar1, NULL, false);
  printf("%u steps processed in the first progress bar.\n", (unsigned)steps);

  // To get the cursor below the second bar be sure to finalize it last
  pbar_finalize(&pbar2, NULL, true);

  return 0;
}

Ausgabe:
progressbar.gif
  • Like
Reaktionen: lano
Autor
german
Downloads
88
Aufrufe
902
Erstellt am
Letzte Bearbeitung
Bewertung
0,00 Stern(e) 0 Bewertung(en)

Weitere Ressourcen von german

Oben Unten