Premnath Mali Ответов: 1

Вызов асинхронного метода в mfc


Я хотел вызвать функцию Recurse (LPCTSTR pstr) для сканирования файлов и в то же время хотел выполнить другую задачу, но когда я нажимаю на кнопку Resume, мне приходится ждать, пока все сканирование не закончится.

что же мне делать?..

Что я уже пробовал:

void CPracticePictureControlandlabelsDlg::OnBnClickedResume()
{
	// TODO: Add your control notification handler code here
	Recurse(L"E:\\");
}


void CPracticePictureControlandlabelsDlg::Recurse(LPCTSTR pstr)
{
	m_picProgressGif.Draw();
	m_picMyimg.Draw();
   CFileFind finder;

   // build a string with wildcards
   CString strWildcard(pstr);
   strWildcard += _T("\\*.*");

   // start working for files
   BOOL bWorking = finder.FindFile(strWildcard);

   while (bWorking)
   {
      bWorking = finder.FindNextFile();

      // skip . and .. files; otherwise, we'd
      // recur infinitely!

      if (finder.IsDots())
         continue;

      // if it's a directory, recursively search it

      if (finder.IsDirectory())
      {
         CString str = finder.GetFilePath();			 
		 m_lblMessage.SetText(str);
		 
         Recurse(str);
      }
   }

   finder.Close();
}

1 Ответов

Рейтинг:
7

Jochen Arndt

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

Но MFC не является потокобезопасным, так что вам придется реализовать какую-то сигнализацию, например отправку пользовательских сообщений Windows, Если вы хотите обновить элементы графического интерфейса из потока.

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

Некоторые показания:
Многопоточность с помощью C++ и MFC[^]
Использование Рабочих Потоков[^]
Простая Нить: Часть I[^]


Jochen Arndt

Извините, но я никогда не пользовался биометрическими приборами.
Я предлагаю проверить документацию устройства и если у производителя есть форум поддержки.