2009-12-29 49 views
1

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

目标是获得“反向代理”状的东西。我发送一个HTTP请求,延迟得到答复 - 只要有人想联系我。我的线程应该继续,因为在此期间没有任何内容,并且一旦响应到达,应该在此线程中调用回调。请注意,我不想要第二个处理回复的线程(如果有必要,它应该只提供一些中断主线程来调用回调的机制)!

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

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

+0

如果你不想有第二个线程,你显然需要一些同步机制来检索调用该请求的线程中的通知 - 没有什么神奇的方法来调用忙于其他线程的回调的东西。 – 2009-12-29 22:43:40

+0

因此,InternetSetStatusCallback启动一个新的线程?你会建议什么同步机制? – Etan 2009-12-29 22:54:19

+0

“WaitForSingleObject”等似乎不适合,因为我不知道什么时候需要等待。我需要更多的“推”式同步机制,它会中断主线程来调用我的回调 – Etan 2009-12-29 23:12:27

回答

1

我的线程应该继续,如果有 没什么的同时,和 回调应在此 线程尽快被称为响应 到达。

你在这里要求的基本上是COME FROM(而不是转到)。这是一个真正不存在的神秘教学。调用代码的唯一方法是在发布线程中进行轮询,或者让一个单独的线程执行同步IO,然后在结果中执行回调(在该线程中或在另一个衍生线程中) 。

当我使用套接字在C++中工作时,我设置了一个专用线程来遍历所有打开的套接字,轮询可用的数据而不会阻塞,获取数据并将其填充到缓冲区中,并将缓冲区在特定情况下的回调(EOL,EOF等)。

1

除非你的主线程正在侦听类似消息队列的东西,否则没有办法只是劫持它并启动它执行的代码,而不是它正在执行的代码。看看boost :: asio是如何工作的,它基本上可以让你异步地进行连接,读取,写入等......例如,你用主(或任何)线程开始一个异步读取,然后使用asio重叠IO以要求操作系统通知IO完成。异步读取完成后,您的回调将由其中一个工作线程执行。

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

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

即使您不打算使用它,也可以查看documentation for asio,如果您想要解决这个问题,很多模式和想法都非常有趣。

如果您不想看它,请记住,在Windows上,执行异步IO的方法称为“Overlapped IO”。