Могу ли я иметь несколько потоков 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
    }
}    

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

Ответы на вопрос(1)

Ваш ответ на вопрос