我正在使用Qt并希望编写一个类来执行一些类似于FTP/HTTP的网络类型操作。该类需要依次连接到大量机器,但我需要应用程序UI在此过程中保持(相对)响应,因此用户可以取消操作,退出应用程序等。我的第一个想法是使用一个独立的网络线程,但内置的Qt FTP/HTTP(和其他)类显然避免使用线程,而是依赖于信号和插槽。所以,我希望做同样的事情,并希望我可以做这样的事情:使用Qt信号/插槽而不是工作线程
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();
}
然而,这并不工作,UI冻结,直到所有操作完成。我希望发出的信号不会立即调用插槽,但会以某种方式被Qt排队,允许主UI仍然可以运行。
那么,为了做到这一点,我需要做些什么? Qt如何通过众多内置类来实现这一点,这些内置类似乎在单个线程上执行冗长的任务?
如果您想要确保插槽在发出信号时排队,您可以将其指定为连接功能的最终参数。 – 2010-04-01 17:37:36