我有一个相当简单的问题要问所有的C#多线程大师......我正在制作这个多线程的XNA游戏,其中Update()
函数正在一个单独的线程中执行(即不在主线程)..我所做的设置如下:
此问题假设您了解XNA特定的面向游戏功能的重要性,例如Update()
,Draw()
,LoadContent()
等。
现在这就是我正在做的事情:
在Update()
函数中,我有以下代码:
protected override void Update(GameTime gameTime)
{
//creating the thread
updateThread = new Thread(new ThreadStart(UpdateThreadRoutine));
updateThread.Name = "UpdateThread";
updateThread.Start(); //starting the thread
updateFrameStart.Set(); //giving the signal to the new thread to start processing stuff ..
updateFrameEnd.WaitOne(); // waiting for the new thread to signal back that its finished
}
这是UpdateThreadRoutine()
函数的代码,由新创建的线程执行:
public void UpdateThreadRoutine()
{
updateFrameStart.WaitOne(); // wait for the signal from the main thread to start processing
//--> Doing all Updating stuff here <--
updateFrameEnd.Set(); //Signaling back to the main thread that updating process has finished ..
}
问题是,一旦UpdateThreadRoutine()
完成其处理,创建的工作线程就会关闭(自行销毁),这就是为什么我当前被迫在每次执行main时显式定义一个新线程的原因Update()
功能......
如果我能找到一种方法让新线程在完成UpdateThreadRoutine()
之后不关闭,而只是等待等等,我可以在LoadContent()
阶段只定义一次线程本身主线程..
同样,我被迫在主线程的Update()
函数的每个循环中创建一个新线程,以便新线程正常运行..
这里有什么想法吗?
答案 0 :(得分:2)
为什么你要使用额外的线程?你一开始就等待它完成,所以它不像你实现任何并行性。
你可以有效地编写自己的工作队列 - 并让线程等待工作到达。但是,您将复制线程池的工作...您 创建新线程而不是仅使用ThreadPool.QueueUserWorkItem
的任何原因?
答案 1 :(得分:0)
您可以提前启动更新主题,并在需要工作时发出信号:
protected override void Update(GameTime gameTime)
{
updateFrameStart.Set();
updateFrameEnd.WaitOne();
}
public void UpdateThreadRoutine()
{
while (!timeToQuit)
{
updateFrameStart.WaitOne();
//--> Doing all Updating stuff here <--
updateFrameEnd.Set();
}
}
让线程永远循环,直到你告诉它是时候退出。