@Mercury13
Программист на «си с крестами» и не только

Какие есть в Qt способы синхронизировать кусок кода с интерфейсным потоком?

Собственно, вопрос.
Хотелось бы сделать что-то вроде
syncWithUi([](){
   someModel.beginResetModel();
   doSmthElse();
   someModel.endResetModel();
});


Задача. Остновить интерфейсный поток, сделать что-то, запустить его снова.
  • Вопрос задан
  • 171 просмотр
Решения вопроса 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Многопоточность
Седой и строгий
Сигналы.
Ответ написан
Комментировать
@Mercury13 Автор вопроса
Программист на «си с крестами» и не только
К сожалению, только сигналы — и ключевое слово BlockingQueuedConnection.
А всё остальное — это как сделать синхроблок рядом с процедурой, а сигнал-слот — где-нибудь в главном окне. Скажем, так.

class AsyncSimpleContext {  // интерфейс
public:
  virtual void syncExec(const Runnable& body) = 0;
  template <class Body>
  void syncExecT(const Body& body); // тело упущу, тут всё стандартно,
                                         // идиома «виртуальный шаблон»
}

class FmMain : public AsyncSimpleContext
{
  // Разрешите не писать реализацию syncExec — тут всё просто:
  // в конструкторе соединить сигнал со слотом методом BlockingQueuedConnection
  // в syncExec проверить id потока и или вызвать прямо, или возбудить сигнал.
signals:
   void sigSyncExec(const Runnable&);
private slots:
   void slotSyncExec(const Runnable&);
}


…и передавая куда-нибудь как-нибудь интерфейс AsyncSimpleContext, мы можем синхронизировать что-то с интерфейсом.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы