异步网络调用
Asynchronous network calls
我创建了一个具有异步OpenWebPage()
函数的类。一旦调用OpenWebPage(someUrl)
,就会调用一个处理程序- OnPageLoad(reply)
。我一直在使用一个名为lastAction
的全局变量来处理页面加载后的东西-处理程序检查lastAction
是什么并调用适当的函数。例如:
this->lastAction == "homepage";
this->OpenWebPage("http://www.hardwarebase.net");
void OnPageLoad(reply)
{
if(this->lastAction == "homepage")
{
this->lastAction = "login";
this->Login(); // POSTs a form and OnPageLoad gets called again
}
else if(this->lastAction == "login")
{
this->PostLogin(); // Checks did we log in properly, sets lastAction as new topic and goes to new topic URL
}
else if(this->lastAction == "new topic")
{
this->WriteTopic(); // Does some more stuff ... you get the point
}
}
现在,当我们有大量的"动作"时,这是相当难以编写和跟踪的。当我用Python(同步)做事情时,它要简单得多,比如:
OpenWebPage("http://hardwarebase.net") // Stores the loaded page HTML in self.page
OpenWebpage("http://hardwarebase.net/login", {"user": username, "pw": password}) // POSTs a form
if(self.page == ...): // now do some more checks etc.
// do something more
想象一下,现在我有一个队列类,其中包含操作:主页、登录、新主题。我应该如何通过异步回调执行所有这些操作(以适当的顺序,一个接一个!)?第一个例子显然是完全硬编码的。
我希望你能理解我的问题,因为坦率地说,我担心这是有史以来最糟糕的问题:x
注:
如果您尝试使用单个成员变量来维护任意数量的异步操作的状态,就会招来各种各样的bug,正如您在上面描述的那样。您无法确定OpenWebPage
调用完成的顺序,因此也无法将lastAction
在任何给定时间的值与任何特定操作关联起来。
有很多方法可以解决这个问题,例如:
- 将网页加载封装在一个不可变的类中,每个实例处理一个页面
- 从
OpenWebPage
返回一个对象,用于跟踪进程并存储操作状态 - 在操作完成时触发一个信号,并将操作的上下文附加到信号
您需要在每个"if"分支的末尾添加"return"语句:在您的代码中,所有"if"分支都在第一次OnPageLoad调用中执行。
一般来说,异步状态管理总是比同步状态管理更复杂。考虑用枚举类型替换lastAction类型。此外,如果OnPageLoad线程上下文是任意的,则需要同步访问全局变量。相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- Active Directory:从网络服务帐户下运行的Windows服务调用ADsOpenObject时失败
- 从C++调用网络摄像头并在 Python 中显示图像
- 使用openCV从网络摄像头捕获图像的函数仅在第一次调用时起作用
- 通过网络调用函数的最佳方式是什么
- 是否有API调用为Linux禁用网络
- 异步网络调用
- 在网络URL上调用函数cvCreateFileCapture时,有时会出现分段故障