Помогите понять boost::thread |
Здравствуйте, гость ( Вход | Регистрация )
Помогите понять boost::thread |
igor_bogomolov |
27.7.2009, 22:58
Сообщение
#1
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Всем привет.
Начал потихоньку осваивать boost. Возникло несколько вопросов. Имею примерно такой код MSK.h
MSK.cpp
main
В результате получаю: Цитата PnP run... message1 \ message2 | Эти сообщения я получаю только через 10 секунд message3 | т.е. основной поток получается заблоктрованным message4 / PnP run... PnP run... PnP run... PnP run... и т.д.... 1) Где и что я делаю не правильно. Почему блокируется основной поток? Или это просто доступ к самой консоли блокируется? 2) Как нормально приостановить поток средствами boost, не привязываясь к системному времени. 3) Что делать если RoutinePnP у меня не может быть статической? Есть ли возможность передать в поток не статический метод класса? Или тут единственный вариант - создавать глобальный метод и делать его дружественным для класса MSK? -------------------------------------------- 4) (не по теме) Где то читал что в boost есть аналог Q_PROPERTY(...), что то не могу найти. ((( |
|
|
Andrew Selivanov |
28.7.2009, 15:44
Сообщение
#2
|
Участник Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: 6 |
Я бы рекомендовал для начала изучить неплохие примеры из Thread: C:\boost\boost_1_37_0\libs\thread\example\
На третий вопрос отвечу кодом из примера про голодных философов (starvephil.cpp):
Привязываем потоки к конкретным объектам через thread_adapter и делаем join (join грубо говоря обозначает не убивать этот поток пока не завершаться присоединённые к нему потоки, у тебя эту роль играет вечный sleep())
Цитата 2) Как нормально приостановить поток средствами boost, не привязываясь к системному времени. Насколько я помню никак Цитата 1) Где и что я делаю не правильно. Почему блокируется основной поток? Или это просто доступ к самой консоли блокируется? MinGW 3.4.5/Boost 1.37 Ничего нигде не блокируется. Я обычно что то в этом духе делаю:
|
|
|
Гость_true_goth_* |
20.3.2010, 10:51
Сообщение
#3
|
Гости |
Всем привет. Начал потихоньку осваивать boost. Возникло несколько вопросов. Имею примерно такой код MSK.h
MSK.cpp
main
В результате получаю: Цитата PnP run... message1 \ message2 | Эти сообщения я получаю только через 10 секунд message3 | т.е. основной поток получается заблоктрованным message4 / PnP run... PnP run... PnP run... PnP run... и т.д.... 1) Где и что я делаю не правильно. Почему блокируется основной поток? Или это просто доступ к самой консоли блокируется? 2) Как нормально приостановить поток средствами boost, не привязываясь к системному времени. 3) Что делать если RoutinePnP у меня не может быть статической? Есть ли возможность передать в поток не статический метод класса? Или тут единственный вариант - создавать глобальный метод и делать его дружественным для класса MSK? -------------------------------------------- 4) (не по теме) Где то читал что в boost есть аналог Q_PROPERTY(...), что то не могу найти. ((( нужный код найдешь тут, безо всяких тридадаптеров, у буст есть спецовая boost::bind для таких целей, мне очень пригодилась |
|
|
Iron Bug |
20.3.2010, 17:53
Сообщение
#4
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
во-первых, в какой системе работаешь и какой компилятор?
далее, по пунктам: 1. это неноральное поведение, поток никак не может блокироаться в данном случае. 37-й буст - довольно старая версия. возможно, потоки были доработаны с тех пор. хотя я не сталкивалась с подобным глюком, но это может оказаться глюком библиотеки. возьми для начала новый буст. также обязательно проверь, что компилишь проект с опциями мультипоточности (это важно, буст может работать неправильно, если эти опции не включены). 2. что значит "не привязываясь к системному времени? this_thread::sleep принимает и абсолютное, и относительное время. это перегруженная функция и можно скармливать ему и абсолютно время, и интервалы в формате posix_time::seconds, posix_time::microseconds, и т.д., в зависимости от возможностей твоей системы и макросов, которые ты указал для сборки. 3. создавай функтор с оператором operator() и передавай его. а в нём юзай что хочешь. Сообщение отредактировал Iron Bug - 20.3.2010, 17:54 |
|
|
igor_bogomolov |
21.3.2010, 3:02
Сообщение
#5
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Iron Bug, спасибо за помощь, но тема достаточно устарела и ответы я давно получил )
|
|
|
Iron Bug |
21.3.2010, 8:21
Сообщение
#6
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
а, не заметила даты. просто последний ответ был вчера. поэтому подумала, что тема новая. ну ладно, пусть будет.
|
|
|
Текстовая версия | Сейчас: 29.11.2024, 5:09 |