我正在编写一个在线游戏有两个原因,一个是在实时环境中熟悉服务器/客户端请求(而不是典型的Web浏览器,这不是实时的),实际上让我的手在那个区域弄湿了,所以我可以继续实际设计一个.
Anywho,我在C++中这样做,我一直在使用winsock来处理我的基本网络测试.我显然想要使用framelimiter并且在某些时候使用3D并且所有这些,我的主要问题是当我执行send()或receive()时,程序在那里闲逛并等待响应.即使是最好的互联网连接,这也许会导致8 fps.
所以对我来说显而易见的解决方案是将网络代码从主进程中取出并在自己的线程中启动它.理想情况下,我会在我的主进程中调用"发送",它将向网络线程传递指向消息的指针,然后定期(每帧)检查网络线程是否已收到回复,或超时,或者什么有你.在一个完美的世界中,我实际上会有两个或更多的网络线程同时运行,所以我可以说运行一个聊天窗口并进行一件盔甲的后台下载,并且仍允许玩家一次性跑来跑去.
我的大部分问题是这对我来说是个新事物.我理解线程的概念,但我可以看到一些严重的问题,比如如果两个线程同时尝试读/写相同的内存地址会发生什么,等等.我知道已经有方法来处理这种类型事情,所以我正在寻找关于实现这样的事情的最佳方法的建议.基本上,我需要线程A能够通过发送一大块数据来启动线程B中的进程,轮询线程B的状态,然后接收回复,也作为一大块数据.理想情况下不会发生任何重大崩溃.^ _ ^我会担心这些数据实际包含什么以及如何处理丢弃的数据包等等,我只需要先发生这种情况.
感谢您提供任何帮助/建议.
PS:想到这一点,可能会使问题更简单.有没有办法使用Windows事件处理系统对我有利?比如,是否有可能让线程A在某处初始化数据,然后在线程B中触发事件以使其获取数据,反之亦然,线程B告诉线程A它已完成?这可能会解决我的很多问题,因为我并不是真的需要两个线程同时处理数据,更多的是接力棒.我只是不知道两个不同线程之间是否可行.(我知道一个线程可以为事件处理程序创建自己的消息.)
最简单的事情
你要做的,就是简单地调用windows API QueueUserWorkItem.您必须指定的是线程将执行的函数以及传递给它的输入.将自动为您创建一个线程池,并在其中执行作业.将在需要时创建新线程.
http://msdn.microsoft.com/en-us/library/ms684957(VS.85).aspx
更多控制
您可以使用另一组API进行更详细的控制,这些API可以再次为您管理线程池 -
http://msdn.microsoft.com/en-us/library/ms686980(VS.85).aspx
自己做
如果你想控制线程创建和池管理的所有方面,你必须自己创建线程,决定它们应该如何结束,创建多少等等(beginthreadex是你应该用来创建线程的api.如果你使用MFC你应该使用AfxBeginThread函数).
将作业发送到工作线程 - Io完成端口
在这种情况下,您还必须担心如何沟通您的工作 - 我会建议IoCOmpletionPorts这样做.它是我目前知道为此目的而制作的最具伸缩性的通知机制.它还有一个额外的优点,就是它可以在内核中实现,这样你就可以避免在你决定自己动手操作时遇到的各种死胡同.
本文将向您展示如何使用代码示例 -
http://blogs.msdn.com/larryosterman/archive/2004/03/29/101329.aspx
沟通后退 - Windows消息
您可以使用Windows消息将状态传回给您的父线程,因为它正在执行消息等待.使用PostMessage函数执行此操作.(并检查错误)
ps:您还可以在专用指针上分配需要发送的数据,然后工作线程可以在发送后将其删除.这样你就可以避免返回指针流量.