Можно ли использовать QtConcurrent :: run с умными указателями на объекты? - PullRequest
0 голосов
/ 06 февраля 2019

Документация Qt утверждает, что QtConcurrent::run можно использовать для запуска функции-члена в другом потоке, передав указатель на объект в качестве первого аргумента.Однако я не смог найти никакой информации, можно ли использовать умные указатели в этом случае.В частности, я хотел использовать его с std::shared_ptr.

1 Ответ

0 голосов
/ 06 февраля 2019

Нельзя передать умный указатель в QtConcurrent :: run, так как не существует соответствующей перегрузки.

Я бы предложил решение с использованием лямбда-выражений:

std::shared_ptr<Obj> obj_ptr(new Obj());
QtConcurrent::run([obj_ptr](){ obj_ptr->func(); });

Из-завнутренний счетчик ссылок в shared_ptr, вам не нужно беспокоиться о времени жизни объекта, принадлежащего интеллектуальному указателю, поскольку вы захватываете копию в лямбда-функции.

Другим решением будет передача необработанного указателя:

std::shared_ptr<Obj> obj_ptr(new Obj());
QtConcurrent::run(obj_ptr.get(), &Obj::func);

Но это довольно рискованно, поскольку вам нужно беспокоиться о времени жизни вашего объекта.

В конце я бы предпочел первый метод, поскольку он намного безопаснее.

...