【问题标题】:Controlling the work of worker threads via the main thread通过主线程控制工作线程的工作
【发布时间】:2010-06-30 21:02:46
【问题描述】:

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

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

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

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

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

还是有更好的选择?

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

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

  2. Window Thread 应通知并处理用户输入的,交给客户端。

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

  4. 一个特殊的接收器线程从服务器接收数据并将其处理回客户端,然后客户端评估数据。

  5. 如果数据正确并且从服务器接收到一些特殊的东西,主线程将通知 UI 线程关闭窗口并终止...

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

  7. 聊天 UI 线程和 Client 线程应通信以处理要发送和接收的消息...

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

【问题讨论】:

  • 让“客户端”线程处理消息毫无意义。如果客户端线程阻塞,UI 也会阻塞,因为消息没有被传递!
  • 我不完全明白你的意思...... UI 线程永远不会阻塞,聊天窗口不会再无响应,因为它有自己的线程...... .客户端只是管理传入的消息在解析后重定向到UI线程......它将等待接收多个事件/消息......或者你的意图是什么?
  • 应用程序被标记为“无响应”的原因是该应用程序不再处理消息。如果您的客户端线程阻塞并负责将消息传递给您的客户端窗口,那么客户端窗口是在它自己的线程上创建的并不重要,它不处理消息。将消息与 UI 分开也会导致诸如 DefWindowProc 之类的问题,这些问题需要在触发消息的同一线程上进行处理,并且需要能够更改 UI。您不能跨线程更改 UI。
  • 哦......我很抱歉让这个细节变得清晰:客户端正在处理的 kinf od 消息是通过网络接收/发送的消息......(简单的字符缓冲区,我适合进入我自己的“消息”结构)不是任何类型窗口的窗口消息......

标签: c++ multithreading client


【解决方案1】:

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

如果您不想使用 Qt,boost 也提供 thread safe signals and slots,但据我了解,它们的插槽将在调用线程的上下文中运行...

无论如何,我已经非常满意地使用了 Qt sig 和 slot 来实现这个目的。我完全同意 GUI 永远不应该冻结。

【讨论】:

  • 我不想使用任何外部库...我只想使用通常的 c++ 东西和 Win32 API 来完成这个...
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    相关资源
    最近更新 更多