Я использую Qt и хочу написать класс, который будет выполнять некоторые операции сетевого типа, подобные FTP / HTTP. Класс должен подключаться к множеству машин, один за другим, но мне нужно, чтобы пользовательский интерфейс приложений оставался (относительно) отзывчивым во время этого процесса, чтобы пользователь мог отменить операцию, выйти из приложения и т. Д. Первой мыслью было использовать отдельный поток для сетевых вещей, но встроенные классы Qt FTP / HTTP (и другие), очевидно, избегают использования потоков и вместо этого полагаются на сигналы и слоты. Итак, я хотел бы сделать что-то подобное и надеялся, что смогу сделать что-то вроде этого:
class Foo : public QObject
{
Q_OBJECT
public:
void start();
signals:
void next();
private slots:
void nextJob();
};
void Foo::start()
{
...
connect(this, SIGNAL(next()), this, SLOT(nextJob()));
emit next();
}
void Foo::nextJob()
{
// Process next 'chunk'
if (workLeftToDo)
{
emit next();
}
}
void Bar::StartOperation()
{
Foo* foo = new Foo;
foo->start();
}
Однако это не работает, и пользовательский интерфейс останавливается, пока все операции не будут завершены. Я надеялся, что испускаемые сигналы на самом деле не вызовут слоты сразу, а будут как-то поставлены в очередь Qt, что позволит основному интерфейсу все еще работать.
Итак, что мне нужно сделать, чтобы заставить эту работу? Как Qt достигает этого с множеством встроенных классов, которые, кажется, выполняют длинные задачи в одном потоке?