嘿,我不确定这是否已被问过这个问题。 (至少我没有找到这个具体问题的答案)。但是:
我有一个程序,它在启动时在新的UI-Thread中创建一个Login窗口。
在此窗口中,用户可以输入必须由服务器验证的数据。 因为窗口仍然会响应用户的操作,所以它(它只是一个UI线程)不能处理它自己的线程中的传输和评估。 我希望UI线程将此工作委托给主线程。
此外:主线程(我的“客户端”线程)应管理所有正在进行的操作,如登录,处理从服务器接收的消息等...(不是窗口消息)
但我不知道该怎么做: 1.)我应该让UI-Thread Queue成为主线程的APC(但是主线程不知道正在发生的事情。 2.)我可以更好地使用事件对象等待并排队将数据从一个线程传输到另一个线程吗?...
或者有更好的选择吗?
例如:我启动客户端: 1.客户端从文件加载数据并执行一些初始化
客户端在新线程中创建一个窗口,用于处理用户输入的登录数据。
Window Thread应该通知并处理用户输入的内容。
客户端现在应该打包数据并将发送工作委托给另一个处理通过网络发送数据的对象(例如CSingleConnection)(当然这不需要新线程,因为它可以处理重叠的I / O ......
一个特殊的接收器线程从服务器接收数据并将其处理回客户端,客户端反过来评估数据。
如果数据是正确的并且从服务器收到了一些特殊的东西,那么主线程应该通知UI线程关闭窗口并终止...
然后客户端创建一个新窗口,该窗口将处理chat-UI
聊天UI线程和客户端线程应进行通信以处理要发送和接收的消息...
(希望这有助于得到我想要的东西)......
答案 0 :(得分:0)
这一切都取决于你准备使用什么。如果你正在使用Qt开发,他们的信号和插槽就是进行这种通信的东西。它们还提供网络库,因此您可以轻松省略接收器线程,因为它们network classes进行异步通信,并在您有数据时发送信号,这意味着您的线程不需要同时被阻止。
如果你不想使用Qt,boost也会提供thread safe signals and slots,但据我所知,他们的插槽将在调用线程的上下文中运行...
无论如何,我已经非常满意地使用了Qt sig和slot来达到这个目的。我全心全意地同意GUI不应该永远冻结。
答案 1 :(得分:0)
我不知道这是不是好风格(回答你自己的问题):
但我认为我选择了Event Objects和两个队列(一个用于Client和Connection之间的连接,另一个用于通信Client和UI)...