如何暂停和重新启动现有工作线程而不是创建新线程?

时间:2010-12-08 07:44:18

标签: c# visual-studio xna

我有一个相当简单的问题要问所有的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()函数的每个循环中创建一个新线程,以便新线程正常运行..

这里有什么想法吗?

2 个答案:

答案 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();
    }
}

让线程永远循环,直到你告诉它是时候退出。