Является ли назначение текущего потока новым потоком безопасным? - PullRequest
1 голос
/ 07 января 2020

Фон

У меня есть QObject (myClass), который работает в своем собственном потоке. Пользовательский интерфейс может вызвать длительный интервал в myClass. Этот слот будет обрабатывать вещи, обновлять интерфейс, обрабатывать больше вещей, а затем обновлять переменные, используемые для фоновой обработки. Если слот запускается быстрее, чем он может обработать, первое обновление пользовательского интерфейса будет происходить быстро, но последующие обновления должны будут ждать (так как myClass по-прежнему обрабатывает перебор y() & z()).

void myClass::mySlot() {
    x(); // Fast
    emit updateUI();
    y(); // Slow
    z(); // Slow
    emit processingComplete();
}

Чтобы преодолеть это, я использовал QtConcurrent::run для медленной обработки, чтобы последующие обновления также быстро обновляли пользовательский интерфейс (так как им не нужно ждать y() & z()).

void myClass::mySlot() {
    x(); // Fast
    emit updateUI();

    // future is a member variable of myClass of type QFuture<void>
    future = QtConcurrent::run([&]() {
        y(); // Slow
        z(); // Slow
        emit processingComplete();
    });

}

Я пытался сделать код чище, используя cancel(), если поток все еще работает, но он не работает как "... будущее, возвращаемое QtConcurrent :: run () нельзя отменить "

    ...
    emit updateUI();

    if(future.isRunning())
        future.cancel();
    future.waitForFinished()

    future = QtConcurrent::run([&]() {
    ...

Вопросы

  1. Безопасно ли переназначение работающего QFuture<T> при использовании QMutexLocker? В этом ответе утверждается, что это безопасно, но не распространяется на мьютексы.
  2. Будут ли «перезаписанные» потоки работать в фоновом режиме, осиротеть, до истечения времени ожидания или прекратят выполнение независимо от строка, на которой они находятся?
  3. Можно ли перезапустить QFuture<T> с начала его выполнения (если да, можно ли перезапустить его независимо от его состояния: запущено / завершено / отменено / приостановлено)?
  4. Существуют ли другие обходные пути, если переназначение не безопасно? (Я не могу использовать это решение , поскольку y() & z() являются линейными, а не петлями).

Предположим, что приведенный выше код является единственным местом, где обращается к переменной future.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...