Re[2]: boost::thread
От: Denwer Россия  
Дата: 21.06.04 06:19
Оценка:
Здравствуйте, 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 функций?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.