Реализация контроля прогресса с использованием потоков - PullRequest
2 голосов
/ 31 марта 2010

Я новичок в концепции многопоточности в C, поэтому мне сложно реализовать это в моей функции. У меня есть простое приложение, в котором я хочу отобразить индикатор выполнения на конкретное место. В определенной функции я буду читать файлы (в цикле for) для некоторых манипуляций (в отношении моего приложения). Пока он читает файлы, я хочу отобразить индикатор выполнения, заявляя, что он находится в процессе чтения файлов. Я знаю, что это должно быть сделано с использованием концепции потоков, но я не совсем уверен, как это сделать.

1 Ответ

4 голосов
/ 31 марта 2010

Создайте рабочий поток в основной программе и установите процедуру обратного вызова, которая выполняет обработку файла.
Эта процедура также будет рассчитывать процент выполнения. Всякий раз, когда этот процент изменяется, отправьте
значение в виде сообщения окна, которое будет перехвачено основным потоком и обновит элемент управления индикатора выполнения.
Вы можете определить внутренние сообщения приложения, такие как #define MSG_PROGRESS_VALUE (WM_USER + 1).

Редактировать: образец,

#define MSG_PROGRESS_VALUE (WM_USER + 1)
#define MSG_WORKER_DONE    (WM_USER + 2)
...
DWORD WINAPI  jobroutine(LPVOID lpParameter) {
   while (TRUE) {
      // process files ...
      // calculate new percent
      if (newpercent != oldpercent) {
         PostMessage(mainwnd, MSG_PROGRESS_VALUE, 0, newpercent);
         oldpercent = newpercent;
      }
      ...
   }
   PostMessage(mainwnd, MSG_WORKER_DONE, 0, 0);
   return 0;
}
...
MainWndProc(...)  {
   switch (uMsg) {
   ...
   case MSG_PROGRESS_VALUE:
   // update progress bar value (lParam)
   break;
 ...
}
...
WinMain(...) {
   HANDLE worker = CreateThread(NULL, 0, jobroutine, NULL, NULL, NULL);
   ...
   // Start classic windows message loop
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...