gpt4 book ai didi

c++ - 等待 SLOT 完成

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:33 24 4
gpt4 key购买 nike

我使用 QNetworkAccessManager 进行表单 POST。

我已将信号和插槽连接为:

connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(readCookies(QNetworkReply*)));

现在,我通过以下方式发出请求:

manager->post(request,postData);

现在 readCookies(QNetworkReply *) 将在 SIGNAL 发出后立即运行。现在,使用我在这个插槽中获得的 Cookie,我必须再发一个 POST..

由于信号和槽是异步的,我想等到我从我的第一个 POST 中获得 cookie,然后我再次想使用我在第一个 POST 中获得的 cookie 来做另一个帖子,比如

//Setting new request, headers etc...
manager->post(request2,postData2);

我希望后者始终在第一个执行后执行(以便我获得正确的 cookie 值)。

要走的路是什么?我是所有这些信号和插槽的新手,所以请多多包涵。

最佳答案

您可以在您的 readCookies() 插槽中发布:

void readCookies( QNetworkReply* reply ) {
if ( ...error? ) {
report error...
return;
}

...
manager->post(request2,postData2);
}

读取 cookie 后我会被调用,然后您可以继续您的帖子。将其连接到第二个插槽,依此类推。但是,如果您在单个对象中管理多个异步操作,那么像这样管理多个可能并行运行的异步操作可能会变得容易出错。我建议使用命令模式 - here I described 为什么我发现它在这种情况下非常有用。请求序列和异步操作被封装在一个对象中(缩写,带有一些伪代码):

class PostStuffOperation : public QObject {
Q_OBJECT
public:
enum Error {
NoError=0,
Error=1,
...
};

Error error() const; //operation successful or not?
QString errorString() const; //human-readable error description

... setters for all the information the operation needs
...
void start() {
...start your first request and connect it to cookiesRead
}

public Q_SLOTS:
void cookiesRead( QNetworkReply * ) {
if ( error ) {
// set error and errorString...
emit finished( this ); //couldn't read cookies, so the operation fails
return;
}
... do post
}

void postFinished( QNetworkReply* ) {
if ( error ) {
// set error and errorString...
}

emit finished( this ); //post finished - that means the whole operation finished
}
Q_SIGNALS:
void finished( PostStuffOperation* );
};

要开始操作,您需要做

PostStuffOperation op* = new PostStuffOperation( this );
... pass data like server, port etc. to the operation
connect( op, SIGNAL(finished()), this, SLOT(postOperationFinished()) );
op->start();

void postOperationFinished( PostStuffOperation* op ) {
if ( op->error != PostStuffOperation::NoError ) {
//handle error, e.g. show message box
}
}

为此类操作设置一个公共(public)基类是有意义的,参见例如KDE 的 KJob .

关于c++ - 等待 SLOT 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4518675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com