LINUX.ORG.RU

Многопоточность в Qt: как правильно?

 , ,


1

2

Привет всем.

Тема избитая, изъезженная, но все же. Предположим я хочу выполнять некоторые операции в отдельном потоке. Во всех учебниках, что я видел и в документации Qt это описывается примерно так:

class MyClass : public QThread
{
	Q_OBJECT
public:
	void run()
	{
		do something
	}
}

int main(int argc, char** argv)
{
	auto thread = new MyClass();
	thread->start();
}
В связи с этим вопросы: 1. Правильно ли так делать с идеологической точки зрения? 2. Какие сложности могут возникнуть с обработкой завершения потоков, ожидающих некоторые ресурсы, чтобы не было «QThread: destroyed while still running»?

Всем спасибо.

★★★★★

Последнее исправление: LongLiveUbuntu (всего исправлений: 1)

Какие сложности могут возникнуть с обработкой завершения потоков, ожидающих некоторые ресурсы, чтобы не было «QThread: destroyed while still running»?

Надо уметь синхронизировать.

А вообще в одном из кутешных блогов проскакивала мысль о том, что наследовать QThread и переопределять run() - моветон, идеологически верно делать moveToThread() объектам, которые должны «жить» в другом потоке. Ну и общаться с ними сигналами/слотами. Выгугливается по ключевым словам «qt threads you are doing it wrong»

yoghurt ★★★★★
()

Предположим я хочу выполнять некоторые операции в отдельном потоке

Фоновые задачи лучше делать с помощью QThreadPool, он не даст загрузить систему слишком сильно. С лямбдами в C++ 2011 это выглядит так:

quiet_readonly ★★★★
()
Ответ на: комментарий от Sakura

Вопрос к специалистам, а как мне работу с QTcpSocket'ами в отдельный тред правильно выделить и в каком порядке тогда создавать объекты?

Gorthauer ★★★★★
()
Ответ на: комментарий от Gorthauer

Смотря для чего ты сокеты используешь. Если что-то более осмысленное, чем послать несколько байтиков на хост, или считать с хоста, то советую посмотреть QNetworkAccessManager.

Если же слишком толсто, тогда посмотри тут или тут там много полезного.

Sakura
()
Ответ на: комментарий от Sakura

Мне как раз нужен обмен не по http, мне нужен постоянный обмен, причем так, чтобы поток интерфейса ни в коем случае не мог его заблокировать. Фактически, мне нужно реальное время.

Gorthauer ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.