繁体   English   中英

在主线程上启动对话框等待工作线程的结果

[英]Launch dialog on main thread waiting for result of worker thread

我有一个应用程序,它发送 HTTP 请求并处理收到的响应。 主线程被阻塞,直到响应回来,否则我们无法处理数据。 要发送这些请求,用户必须经过身份验证。 我希望捕获 401 响应,并在返回响应以供我的应用程序处理之前,提示用户进行身份验证。 根据成功,我想重试发送原始请求并返回响应,或者,如果身份验证失败,则返回原始 401 响应。

我正在使用 C++ REST SDK 发送 HTTP 请求。 这些发生在另一个线程(pplx::task)中。 我还使用 MFC 模式对话框来提示进行身份验证。 你们中的一些人可能会看到发生的死锁。 如果没有,让我再解释一下。

主线程等待 HTTP 请求完成。 在该线程中,我捕获了 401 并希望启动一个对话框。 为此,我使用了boost::signal 此信号将SendMessage调用到我希望显示对话框的句柄。 在 MFC 消息循环处理消息后,它将启动对话框(在主线程上)。 这依赖于 MFC 消息循环,它被阻止等待 HTTP 请求。 简而言之,主线程已经在等待请求完成,因此它无法运行其消息循环来接收来自SendMessage的调用。

主线程正在等待工作线程。 工作线程需要在主线程上启动一个对话框才能继续。 僵局。 有没有人有任何巧妙的解决方案来解决这个问题?

我认为这里最简单的解决方案是重新设计处理线程的方式。

我建议您不要为请求使用单个线程,而是为每个请求生成一个新线程,然后让它返回状态代码(无论它是什么),然后您可以处理任何逻辑以在主线程中使用身份验证进行重试(即显示身份验证对话框,然后使用凭据重新生成身份验证线程)。

这也使您可以更好地封装请求处理程序,这是一个很大的优势。 为了正确封装此逻辑(因此您不必检查每个请求),您应该定义某种请求处理程序(类或函数)。 例如

StatusCode make_reqeust(...) {
  // Deal with the logic on authentication here
}

其中 StatusCode 是 HTTP 状态代码的类型。

当然,这并不能解决您的 UI 线程可能等待您的工作线程完成的问题,因此您还需要某种 UI 刷新方法,该方法每 x 时间调用一次并检查所有工作线程的状态(即通过检查返回的std::future )。 你还想改变我上面的例子,在这种情况下可能会产生一个单独的线程并返回一个std::future

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM