Как реализовать многопоточную асинхронную операцию?

Вот как выглядит мой текущий подход:

// Somewhere in a UI class
// Called when a button called "Start" clicked
MyWindow::OnStartClicked(Event &sender)
{
_thread = new boost::thread(boost::bind(&MyWindow::WorkToDo, this));
}

MyWindow::WorkToDo()
{
for(int i = 1; i < 10000000; i++)
{
int percentage = (int)((float)i / 100000000.f);
_progressBar->SetValue(percentage);
_statusText->SetText("Working... %d%%", percentage);
printf("Pretend to do something useful...\n");
}
}

// Called on every frame
MyWindow::OnUpdate()
{
if(_thread != 0 && _thread->timed_join(boost::posix_time::seconds(0))
{
_progressBar->SetValue(100);
_statusText->SetText("Completed!");
delete _thread;
_thread = 0;
}
}

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

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

0

Решение

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

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

1

Другие решения

Если вы можете использовать Boost или C ++ 11, попробуйте Boost / std :: future и async

0