Здравствуйте, Azir, Вы писали:
A>Здравствуйте, nervous, Вы писали:
N>>Hi all.
N>>Есть рабочий поток с вычислениями.
N>>Есть модальное диалоговое окно для отображения прогресса.
N>>Надо дать пользователю возможность прервать поток.
N>>Как правильно это сделать?
A>Можно, например, так:
A>A>#include <boost/thread/mutex.hpp>
A>#include <boost/thread.hpp>
A>void DoCalculations(int i);
A>void UpdateProgress(int i);
A>bool IsUserReadyToExit();
A>int const stepsNumber = 10;
A>boost::mutex monitor;
A>bool goingToExit = false;
A>void WorkThread()
A>{
A> for (int i = 0; i < stepsNumber; ++i)
A> {
A> DoCalculations(i);
A> {
A> boost::mutex::scoped_lock lk(monitor);
A> if (goingToExit)
A> return;
A> }
A> UpdateProgress(i);
A> }
A>}
A>int main()
A>{
A> boost::thread workThread(WorkThread);
A> while (!IsUserReadyToExit()) {}
A> {
A> boost::mutex::scoped_lock lk(monitor);
A> goingToExit = true;
A> }
A> workThread.join();
A>}
A>
Я конечно не знаю как там в юниксах это делается, может и так, но в виндах это слишком расточительно, обертывать одну переменную мьютексом.
Не ужто нет переносимого решения для Intelocked функций?