1

我已经使用 wininet 发送了一些同步 HTTP 请求。现在,我想更进一步,想异步请求一些内容。

目标是获得类似“反向代理”的东西。我发送了一个延迟响应的 HTTP 请求 - 只要有人想联系我。我的线程应该继续进行,就好像同时没有任何东西一样,并且一旦响应到达,就应该在这个线程中调用回调。请注意,我不想要处理回复的第二个线程(如果有必要,它应该只提供一些中断主线程以在那里调用回调的机制)!

更新:也许,描述我想要的最好的方法是像 JavaScript 中的行为,你只有一个线程,但可以发送 AJAX 请求,然后导致在这个主线程中调用回调。

因为我想了解它是如何工作的,所以我不想要图书馆解决方案。有人知道一些很好的教程来解释我如何实现我想要的行为吗?

4

2 回答 2

1

我的线程应该继续进行,就好像同时没有任何东西一样,并且一旦响应到达,就应该在这个线程中调用回调。

你在这里要求的基本上是来自(而不是去)。这是一个神话般的指令,实际上并不存在。调用代码的唯一方法是在发出线程中进行轮询,或者让一个单独的线程执行同步 IO,然后使用结果执行回调(在该线程中或在另一个衍生线程中) .

当我在 C++ 中使用套接字时,我设置了一个专用线程来迭代所有打开的套接字,轮询可以在没有阻塞的情况下可用的数据,获取数据并将其填充到缓冲区中,将缓冲区发送到回调给定的情况(EOL,EOF,那种事情)。

于 2009-12-30T01:40:16.320 回答
1

除非您的主线程正在侦听消息队列之类的东西,否则实际上没有办法劫持它并启动它执行当前正在执行的代码之外的代码。

看看 boost::asio 是如何工作的,它基本上可以让你异步执行连接、读取、写入等操作……例如,你使用主(或任何)线程启动异步读取,然后 asio 使用重叠 IO 来询问操作系统通知它IO完成。当异步读取完成时,您的回调将由其中一个工作线程执行。

您需要做的就是确保使用您的主线程或工作线程调用 io_service::run() 来处理 IO 完成队列。您调用 run 的任何线程都将是执行回调的线程。

如果您遵守规则,Asio 有一些保证可以使这种多线程方法相当健壮。

即使您不打算使用它,也请查看 asio的文档,如果您想自己解决这些问题,很多模式和想法都会非常有趣。

如果你不想看,请记住,在 Windows 上进行异步 IO 的方法称为“重叠 IO ”。

于 2009-12-30T07:02:36.143 回答