我正在使用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