繁体   English   中英

通过主线程控制工作线程的工作

[英]Controlling the work of worker threads via the main thread

嘿,我不确定是否已经这样询问过。 (至少我没有找到这个具体问题的答案)。 但:

我有一个程序,该程序在启动时会在新的UI线程中创建一个登录窗口。

用户可以在此窗口中输入必须由服务器验证的数据。 因为窗口仍将响应用户的操作,所以它(仅是UI线程)不应在其自己的线程中处理传输和评估。 我希望UI线程将这项工作委派回主线程。

另外:主线程(我的“客户端”线程)应管理所有正在进行的操作,例如登录,处理从服务器接收到的消息等(不是窗口消息)。

但是我不确定如何执行此操作:1.)我是否应该让UI-Thread将APC排队到主线程(但是主线程不知道发生了什么事情。2.)我可以更好地使用等待事件对象并排队将数据从一个线程传输到另一个线程?...

还是有更好的选择?

例如:我启动客户端:1.客户端从文件加载数据并进行一些初始化

  1. 客户端在新线程中创建一个窗口,该窗口处理来自用户的登录数据输入。

  2. 窗口线程应通知并处理用户输入的,直到客户端。

  3. 客户端现在将打包数据并将发送工作委托给另一个对象(例如CSingleConnection),该对象处理通过网络发送数据(当然,这不需要新线程,因为可以使用重叠I / O进行处理)。 。

  4. 一个特殊的接收器线程从服务器接收数据并将其处理回客户端,客户端依次对数据求值。

  5. 如果数据正确并且从服务器接收到一些特殊的东西,则主线程应向UI线程发出信号以关闭窗口并终止...

  6. 然后,客户端创建一个新窗口,该窗口将处理聊天UI

  7. 聊天UI线程和客户端线程应进行通信以处理要发送和接收的消息...

(希望这有助于获得我正在尝试的东西)...

这完全取决于您准备使用什么。 如果您使用Qt进行开发,那么它们的信号和插槽就是进行此类通信的方法。 它们还提供了一个网络库,因此您可以轻松地省略接收器线程,因为它们的网络类执行异步通信,并在有数据时发送信号,这意味着您的线程在此期间不需要被阻塞。

如果您不想使用Qt,boost还会提供线程安全信号和插槽 ,但据我所知,它们的插槽将在调用线程的上下文中运行...

无论如何,我为此非常满意地使用了Qt信号和插槽。 我完全同意,GUI永远都不应冻结。

我不知道这是否是好的风格(回答您自己的问题):

但是我想我可以使用事件对象和两个队列(一个用于客户端和连接之间的连接,另一个用于通信客户端和UI)...

暂无
暂无

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

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