Начал потихоньку осваивать boost. Возникло несколько вопросов.
Имею примерно такой код
MSK.h
#include <boost/thread/thread.hpp>
class MSK {
public:
MSK();
protected:
static void RoutinePnP();
private:
boost::thread _pnpthread;
};
MSK.cpp
#include <iostream>
#include <boost/thread/xtime.hpp>
MSK::MSK()
{
_pnpthread = boost::thread(&RoutinePnP);
}
void MSK::RoutinePnP()
{
for(;;) {
std::cout << "PnP run..." << std::endl;
// приостанавливаем поток на 10 секунд
boost::xtime xt;
boost::xtime_get(&xt, boost::TIME_UTC);
xt.sec += 10;
boost::thread::sleep(xt);
}
}
main
int main()
{
MSK msk;
std::cout << "message1" << std::endl;
std::cout << "message2" << std::endl;
std::cout << "message3" << std::endl;
std::cout << "message4" << std::endl;
while(1) sleep(1);
return EXIT_FAILURE;
}
В результате получаю:
Цитата
PnP run...
message1 \
message2 | Эти сообщения я получаю только через 10 секунд
message3 | т.е. основной поток получается заблоктрованным
message4 /
PnP run...
PnP run...
PnP run...
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(...), что то не могу найти. (((