2016-03-21 4 views
1

Мне нужна помощь для реализации асинхронного вызова funtion в C++. Я новичок в многопоточности на C++.Асинхронный вызов функции с методом проверки прогресса

Здесь могут быть две функции: одна для запуска работы в другом потоке, а другая - для проверки прогресса, и если работа завершена.

Я попробовал его с кодом из разных ответов на этом сайте, но он не работает.

int __stdcall Test::asyncStartWork() 
{ 
    asyncReady = false; 
    std::thread workThread = std::thread(&Test::doWork, this); 
    return 0; 
} 

int __stdcall Test::asyncGetProgress() 
{ 
    if (asyncReady = true) 
    { 
     workThread.join(); 
     return 100; 
    }  
    else 
    { 
     return asyncProgress; 
    } 
} 

int __stdcall Test::doWork() 
{ 
    //do work and write progress to asyncProgress 

    //at the end 
    asyncReady = true 
} 

При вызове asyncStartWork я получаю следующее сообщение об ошибке:

enter image description here

+1

[MCVE] необходим. И описание вашей реальной проблемы. – Yakk

+0

Ваш объект потока является локальным и будет разрушен в конце 'asyncStartWork'. Быстрое исправление будет «отсоединено». – knivil

ответ

1

В методе Test::asyncStartWork(), вы образующие локальные переменную workThread, которая скрывает свой член класса.

Так в asyncGetProgress() при вызове workThread.join() вы вызываете его для объекта потока, который не представляет поток (см. here).

В результате получается std::system_error с условием ошибки no_such_process. Если ваша программа не использует исключения, это приведет к прерыванию процесса.

Попробуйте удалить часть std::thread в asyncStartWork(), например.

int __stdcall Test::asyncStartWork() 
{ 
    asyncReady = false; 
    workThread = std::thread(&Test::doWork, this); 
    return 0; 
} 

Кроме того, __stdcall 's кажется не нужно.

+0

спасибо. какая глупая ошибка. теперь, похоже, работает – rkgghz

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