【发布时间】:2010-06-30 21:02:46
【问题描述】:
嘿,我不确定这是否已经被这样问过。 (至少我没有找到这个特定问题的答案)。但是:
我有一个程序,它在启动时会在一个新的 UI 线程中创建一个登录窗口。
在此窗口中,用户可以输入必须由服务器验证的数据。 因为窗口仍应响应用户的操作,它(它只是一个 UI 线程)不应在它自己的线程中处理传输和评估。 我希望 UI 线程将这项工作委托给主线程。
此外:主线程(我的“客户端”线程)应管理所有正在进行的操作,例如登录、处理从服务器接收到的消息等...(不是窗口消息)
但我不确定如何执行此操作: 1.)我应该让 UI-Thread Queue 一个 APC 到主线程吗(但是主线程不知道正在发生的事情。 2.) 我可以更好地使用要等待的事件对象和队列来将数据从一个线程传输到另一个线程吗?...
还是有更好的选择?
例如:我启动客户端: 1.客户端从文件中加载数据并进行一些初始化
客户端在处理来自用户的登录数据输入的新线程中创建一个窗口。
Window Thread 应通知并处理用户输入的,交给客户端。
客户端现在应该打包数据并将发送工作委托给另一个处理通过网络发送数据的对象(例如 CSingleConnection)(当然这不需要新线程,因为它可以处理重叠的 I/O...
一个特殊的接收器线程从服务器接收数据并将其处理回客户端,然后客户端评估数据。
如果数据正确并且从服务器接收到一些特殊的东西,主线程将通知 UI 线程关闭窗口并终止...
然后客户端创建一个新窗口,它将处理聊天-UI
聊天 UI 线程和 Client 线程应通信以处理要发送和接收的消息...
(希望这有助于得到我正在尝试的东西)......
【问题讨论】:
-
让“客户端”线程处理消息毫无意义。如果客户端线程阻塞,UI 也会阻塞,因为消息没有被传递!
-
我不完全明白你的意思...... UI 线程永远不会阻塞,聊天窗口不会再无响应,因为它有自己的线程...... .客户端只是管理传入的消息在解析后重定向到UI线程......它将等待接收多个事件/消息......或者你的意图是什么?
-
应用程序被标记为“无响应”的原因是该应用程序不再处理消息。如果您的客户端线程阻塞并负责将消息传递给您的客户端窗口,那么客户端窗口是在它自己的线程上创建的并不重要,它不处理消息。将消息与 UI 分开也会导致诸如
DefWindowProc之类的问题,这些问题需要在触发消息的同一线程上进行处理,并且需要能够更改 UI。您不能跨线程更改 UI。 -
哦......我很抱歉让这个细节变得清晰:客户端正在处理的 kinf od 消息是通过网络接收/发送的消息......(简单的字符缓冲区,我适合进入我自己的“消息”结构)不是任何类型窗口的窗口消息......
标签: c++ multithreading client