Могу ли я иметь несколько потоков GUI в MFC?
У меня есть большое приложение на основе MFC, которое включает в себя некоторые потенциально очень медленные задачи в основном потоке. Это может создать впечатление, что приложение зависло, когда оно фактически выполняет свою долгую задачу. С точки зрения удобства использования яя хотел бы дать пользователю больше отзывов о прогрессе и иметь возможность отменить задачу чистым способом. Хотя выделение длинных задач в отдельные потоки было бы лучшим долгосрочным решением, яЯ думаю, что прагматичным краткосрочным решением является создание нового потока GUI, инкапсулированного в своем собственном объекте, с диалогом, включающим индикатор выполнения и кнопку отмены, используемым аналогично объекту CWait. Основной поток отслеживает состояние отмены с помощью метода IsCancelled и завершается с помощью броска, когда это необходимо.
Это разумный подход, и если да, то есть ли уже какой-нибудь код MFC, который я могу использовать, или я должен развернуть свой собственный? Первый эскиз выглядит так
class CProgressThread : public CWinThread
{
public:
CProgressThread(int ProgressMax);
~CProgressThread()
void SetProgress(int Progress);
BOOL IsCancelled();
private:
CProgressDialog *theDialog;
}
void MySlowTask()
{
CProgressThread PT(MaxProgress);
try
{
{
{ // deep in the depths of my slow task
PT.SetProgress(Progress);
if (PT.IsCancelled())
throw new CUserHasHadEnough;
}
}
}
catch (CUserHasHadEnough *pUserHasHadEnough)
{
// Clean-up
}
}
Как правило, у меня обычно один поток с графическим интерфейсом и много рабочих потоков, но такой подход может сэкономить мне кучу рефакторинга и тестирования. Есть серьезные потенциальные подводные камни?