2013-09-02 5 views
1

Я хотел бы, чтобы обнаружить конец нити в C++ 11, но я не знаю, как это сделать, это выглядеть, что блок программы «получить», вот что я сделал:Обнаружить конец нити

void Object::init() 
{ 
    this->thread = std::async(std::launch::async, &State::load, stateInstance); 
} 

/* A method in a loop */ 
void Object::run() 
{ 
    bool ready = this->thread.get(); 
    if(ready) 
    { 
     /* do something */ 
    } 
    else 
    { 
     /* draw interface, manage event, … */ 
    } 
} 

Моя программа не входит в «else» в методе «run», программа застревает в «this-> thread-> get()», а состояние не загружается.

Как я могу справиться с этим?

Спасибо!

+0

Ну, вы подтвердили, что 'государство :: load() 'на самом деле закончится? –

+0

Да, Состояние :: конец загрузки ~ 3 секунды спустя, но выполнение блока «get». (В «else» я хотел бы анимировать загрузчик) – LongDuZboub

+1

Мне нравится, как вы назвали «будущий» поток. Вы знаете, просто для путаницы:/ – sehe

ответ

1

Я не уверен, что проблема есть, но вот идея с использованием wait_for (compiled on Coliru):

#include <future> 
#include <chrono> 
#include <iostream> 

struct State 
{ 
    void load() { 
     std::cout << "working\n"; 
     std::this_thread::sleep_for(std::chrono::seconds(4)); 
     std::cout << "done\n"; 
    } 
}; 

struct Object 
{ 
    /* A method in a loop */ 
    bool run() 
    { 
     switch(future.wait_for(std::chrono::milliseconds(100))) 
     { 
      case std::future_status::ready: 
       { 
        /* do something */ 
       } 
       return false; 
      case std::future_status::timeout: 
       { 
        /* draw interface, manage event, … */ 
       } 
      case std::future_status::deferred: 
      default: 
       return true; 
     } 
    } 

    Object() { init(); } 
    ~Object() { if (future.valid()) future.wait(); } 
    private: 
    void init() 
    { 
     future = std::async(std::launch::async, &State::load, &stateInstance); 
    } 

    State stateInstance; 
    std::future<void> future; 
}; 

int main() 
{ 
    Object test; 

    while (test.run()); 
} 
+0

Спасибо! Теперь это работа (на IOS и Android с NDK) – LongDuZboub

+0

@LongDuZboub Это на самом деле приятно знать. – sehe

0

попробовать это

while(!this->thread.valid()) 
{ //do smthg 
}else{ 
} 

прибудет замки, потому что прибудет хочет получить результат в будущем this-> нить. поэтому он ожидает, что этот результат будет готов, и вернет его.

действительна только сказать, если это будущий результат готов

+0

Это вызовет 100% -ное использование ЦП, а также ничего не делает, ожидая в потоке. –

+0

Да, делать что-то «что-то», например, спать. Я не знаю, что планируется в этом сделать код – dzada

+1

Это все еще очень «хакерский» способ делать что-то. Даже если вы использовали 'Sleep()' или что-то еще, теперь есть латентность в том, как скоро поток может возобновиться, и поток должен будет просыпаться время от времени, чтобы увидеть, может ли он возобновиться. Почему бы просто не позволить операционной системе уведомлять ожидающую нить? –

Смежные вопросы