У меня есть большое приложение на основе MFC, которое включает некоторые потенциально очень медленные задачи в основном потоке. Это может показать, что приложение зависло, когда оно действительно прокладывает себе путь через долгую задачу. С точки зрения удобства использования я хотел бы дать пользователю дополнительную информацию о прогрессе и иметь возможность прервать задачу в чистом виде. Хотя удержание длинных задач в отдельных потоках было бы лучшим долгосрочным решением, я думаю, что прагматичное краткосрочное решение - создать новый поток GUI, инкапсулированный в свой собственный объект, в комплекте с диалогом, включающим индикатор выполнения и кнопку отмены, используемую в аналогично объекту CWait. Основной поток контролирует статус отмены с помощью метода IsCancelled и заканчивается с помощью броска, когда это необходимо.Могу ли я иметь несколько потоков графического интерфейса в MFC?
Является ли это разумным подходом, и если да, то есть какой-то код 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
}
}
Как правило, я, как правило, имеет один GUI поток и много рабочих потоков, но этот подход мог бы спасти меня кучу рефакторинга и тестирование. Любые серьезные потенциальные проблемы?
dupe of http://stackoverflow.com/questions/266300/2008-mfc-and-threads? –
@Balog Pal, спасибо за ссылку, но на самом деле она не придумала ничего убедительного, и на этом этапе тоже пять лет. Я много использую потоки с MFC без каких-либо проблем, просто они все рабочие потоки. –
Рабочие потоки отлично работали с самого начала. Я никогда не осмеливался возиться с единственной нитью UI :). Эта тема охватывает «новую» MFC. С тех пор я не знаю значительных изменений. –