Xmipp  v3.23.11-Nereus
Public Member Functions | Public Attributes | List of all members
cif::ProgressImpl Struct Reference

Public Member Functions

 ProgressImpl (int64_t inMax, const std::string &inAction)
 
void Run ()
 
void Stop ()
 
void PrintProgress ()
 
void PrintDone ()
 

Public Attributes

int64_t mMax
 
std::atomic< int64_t > mConsumed
 
int64_t mLastConsumed = 0
 
int mSpinnerIndex = 0
 
std::string mAction
 
std::string mMessage
 
std::mutex mMutex
 
std::thread mThread
 
std::chrono::time_point< std::chrono::system_clock > mStart = std::chrono::system_clock::now()
 
bool mStop = false
 

Detailed Description

Definition at line 138 of file utilities.cpp.

Constructor & Destructor Documentation

◆ ProgressImpl()

cif::ProgressImpl::ProgressImpl ( int64_t  inMax,
const std::string &  inAction 
)
inline

Definition at line 140 of file utilities.cpp.

141  : mMax(inMax)
142  , mConsumed(0)
143  , mAction(inAction)
144  , mMessage(inAction)
145  , mThread(std::bind(&ProgressImpl::Run, this))
146  {
147  }
std::thread mThread
Definition: utilities.cpp:166
std::atomic< int64_t > mConsumed
Definition: utilities.cpp:161
std::string mAction
Definition: utilities.cpp:164
std::string mMessage
Definition: utilities.cpp:164

Member Function Documentation

◆ PrintDone()

void cif::ProgressImpl::PrintDone ( )

Definition at line 328 of file utilities.cpp.

329 {
330  std::chrono::duration<double> elapsed = std::chrono::system_clock::now() - mStart;
331 
332  std::ostringstream msgstr;
333  msgstr << mAction << " done in " << elapsed << " seconds";
334  auto msg = msgstr.str();
335 
336  uint32_t width = get_terminal_width();
337 
338  if (msg.length() < width)
339  msg += std::string(width - msg.length(), ' ');
340 
341  std::cout << '\r' << msg << std::endl;
342 }
uint32_t get_terminal_width()
Definition: utilities.cpp:110
std::string mAction
Definition: utilities.cpp:164
std::chrono::time_point< std::chrono::system_clock > mStart
Definition: utilities.cpp:168

◆ PrintProgress()

void cif::ProgressImpl::PrintProgress ( )

Definition at line 206 of file utilities.cpp.

207 {
208  // const char* kBlocks[] = {
209  // " ", // 0
210  // u8"\u258F", // 1
211  // u8"\u258E", // 2
212  // u8"\u258D", // 3
213  // u8"\u258C", // 4
214  // u8"\u258B", // 5
215  // u8"\u258A", // 6
216  // u8"\u2589", // 7
217  // u8"\u2588", // 8
218  // };
219 
220  const char *kBlocks[] = {
221  " ", // 0
222  " ", // 1
223  " ", // 2
224  "-", // 3
225  "-", // 4
226  "-", // 5
227  "=", // 6
228  "=", // 7
229  "=", // 8
230  };
231 
232  uint32_t width = get_terminal_width();
233 
234  std::string msg;
235  msg.reserve(width + 1);
236  if (mMessage.length() <= 20)
237  {
238  msg = mMessage;
239  if (msg.length() < 20)
240  msg.append(20 - msg.length(), ' ');
241  }
242  else
243  msg = mMessage.substr(0, 17) + "...";
244 
245  msg += " |";
246 
247  int64_t consumed = mConsumed;
248  float progress = static_cast<float>(consumed) / mMax;
249  int pi = static_cast<int>(std::ceil(progress * 33 * 8));
250  // int tw = width - 28;
251  // int twd = static_cast<int>(tw * progress + 0.5f);
252  // msg.append(twd, '=');
253  // msg.append(tw - twd, ' ');
254 
255  for (int i = 0; i < 33; ++i)
256  {
257  if (pi <= 0)
258  msg += kBlocks[0];
259  else if (pi >= 8)
260  msg += kBlocks[8];
261  else
262  msg += kBlocks[pi];
263  pi -= 8;
264  }
265 
266  msg.append("| ");
267 
268  const char kSpinner[] = {' ', '.', 'o', 'O', '0', 'O', 'o', '.'};
269  const size_t kSpinnerCount = sizeof(kSpinner);
270 
271  if (mLastConsumed < consumed)
272  {
273  mLastConsumed = consumed;
274  mSpinnerIndex = (mSpinnerIndex + 1) % kSpinnerCount;
275  }
276 
277  const char spinner[2] = {kSpinner[mSpinnerIndex], 0};
278  msg.append(spinner);
279 
280  // int perc = static_cast<int>(100 * progress);
281  // if (perc < 100)
282  // msg += ' ';
283  // if (perc < 10)
284  // msg += ' ';
285  // msg += to_string(perc);
286  // msg += '%';
287 
288  std::cout << '\r' << msg;
289  std::cout.flush();
290 }
uint32_t get_terminal_width()
Definition: utilities.cpp:110
std::atomic< int64_t > mConsumed
Definition: utilities.cpp:161
#define i
int64_t mLastConsumed
Definition: utilities.cpp:162
std::string mMessage
Definition: utilities.cpp:164
#define pi

◆ Run()

void cif::ProgressImpl::Run ( )

Definition at line 172 of file utilities.cpp.

173 {
174  using namespace std::literals;
175 
176  bool printedAny = false;
177 
178  try
179  {
180  for (;;)
181  {
182  std::this_thread::sleep_for(2s);
183 
184  std::unique_lock lock(mMutex);
185 
186  if (mStop or mConsumed == mMax)
187  break;
188 
189  auto elapsed = std::chrono::system_clock::now() - mStart;
190 
191  if (elapsed < std::chrono::seconds(5))
192  continue;
193 
194  PrintProgress();
195  printedAny = true;
196  }
197  }
198  catch (...)
199  {
200  }
201 
202  if (printedAny)
203  PrintDone();
204 }
std::atomic< int64_t > mConsumed
Definition: utilities.cpp:161
std::mutex mMutex
Definition: utilities.cpp:165
std::chrono::time_point< std::chrono::system_clock > mStart
Definition: utilities.cpp:168

◆ Stop()

void cif::ProgressImpl::Stop ( )
inline

Definition at line 150 of file utilities.cpp.

151  {
152  mStop = true;
153  if (mThread.joinable())
154  mThread.join();
155  }
std::thread mThread
Definition: utilities.cpp:166

Member Data Documentation

◆ mAction

std::string cif::ProgressImpl::mAction

Definition at line 164 of file utilities.cpp.

◆ mConsumed

std::atomic<int64_t> cif::ProgressImpl::mConsumed

Definition at line 161 of file utilities.cpp.

◆ mLastConsumed

int64_t cif::ProgressImpl::mLastConsumed = 0

Definition at line 162 of file utilities.cpp.

◆ mMax

int64_t cif::ProgressImpl::mMax

Definition at line 160 of file utilities.cpp.

◆ mMessage

std::string cif::ProgressImpl::mMessage

Definition at line 164 of file utilities.cpp.

◆ mMutex

std::mutex cif::ProgressImpl::mMutex

Definition at line 165 of file utilities.cpp.

◆ mSpinnerIndex

int cif::ProgressImpl::mSpinnerIndex = 0

Definition at line 163 of file utilities.cpp.

◆ mStart

std::chrono::time_point<std::chrono::system_clock> cif::ProgressImpl::mStart = std::chrono::system_clock::now()

Definition at line 168 of file utilities.cpp.

◆ mStop

bool cif::ProgressImpl::mStop = false

Definition at line 169 of file utilities.cpp.

◆ mThread

std::thread cif::ProgressImpl::mThread

Definition at line 166 of file utilities.cpp.


The documentation for this struct was generated from the following file: