Прерывание ускорения - PullRequest
       15

Прерывание ускорения

2 голосов
/ 14 марта 2012

Я хотел бы иметь возможность прерывать поток следующим образом.

void mainThread(char* cmd)
{   
    if (!strcmp(cmd, "start"))
        boost::thread thrd(sender); //start thread

    if (!strcmp(cmd, "stop"))
        thrd.interrupt();       // doesn't work, because thrd is undefined here

}

thrd.interrupt () невозможно, потому что thrd объект не определен, когда я пытаюсь его прервать. Как я могу это исправить?

Ответы [ 3 ]

5 голосов
/ 14 марта 2012

Используйте оператор назначения перемещения :

void mainThread(char* cmd)
{   
    boost::thread thrd;

    if (!strcmp(cmd, "start"))
        thrd = boost::thread(sender); //start thread

    if (!strcmp(cmd, "stop"))
        thrd.interrupt();

}
1 голос
/ 14 марта 2012

Повышающий поток является подвижным, поэтому вы можете сделать что-то вроде:

boost::thread myThread;
if ( isStart ) {
    myThread = boost::thread(sender);
else if ( isStop ) {
    myThread.interrupt();
}

Если вы хотите передать его (например, в качестве аргумента функции), Вы, вероятно, захотите использовать указатель или ссылку:

void
mainThread( std::string const& command, boost::thread& aThread )
{
    if ( command == "start" ) {
        aThread = boost::thread( sender );
    } else if ( command == "stop" ) {
        aThread.interrupt();
    }
}

(Это, вероятно, нужно больше. Например, как написано, если вы выполните mainThread( "start" ) дважды подряд вы отсоедините первый поток, и больше никогда не сможешь обратиться к нему.)

Другой альтернативой будет использование boost :: shared_ptr.

0 голосов
/ 03 января 2013

Вопрос не в boost :: thread, а в области действия:

this:

if(Condition)
    MyType foo;
... // foo is out of scope
foo.method(); // won't work, no foo in scope

такой же, как этот:

if(Condition) 
{
    MyType foo;
} // after this brace, foo no longer exists, so...
foo.method(); // won't work, no foo in scope

Обратите внимание, что ответы выше всего делают что-то вроде:

MyType foo:
if (Condition)
    foo.method(); // works because now there is a foo in scope
else
{
    foo.otherMethod(); // foo in scope here, too.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...