【问题标题】:Pause and resume thread activity暂停和恢复线程活动
【发布时间】:2016-04-04 08:54:51
【问题描述】:

我有一个线程在某个时间间隔内将点添加到 zedgraph 组件上。我需要在按下复选框时暂停添加点,然后在再次按下复选框时继续添加它们。以下是我的线程:

public class myThread{

     ManualResetEvent pauseResumeThread = new ManualResetEvent(true);

     public void threadHeartrateGraph()
            {                                                           
                    for (int k = 15; k < _hr.Length; k++)
                    {
                        pauseResumeThread.WaitOne();
                        if (HRDataSummary.threadPause == true)
                        {
                            break;
                        }
                        x = k;
                        y = _hr[k];
                        list1.Add(x, y);
                    _displayHRGraph.Invoke(list1, graph_HeartRate, _GraphName[0]);
                    graph_HeartRate.XAxis.Scale.Min = k-14;
                    graph_HeartRate.XAxis.Scale.Max = k+1;                        
                    Thread.Sleep(_interval * 1000);
                }  
            }
            catch (NullReferenceException)
            {

            }
        }
    public void play()
    {
        pauseResumeThread.Set();
    }
    public void pause()
    {
        pauseResumeThread.Reset();
    }
}

然后,我从一个复选框中调用了播放和暂停线程。

private void checkBoxPause_CheckedChanged(object sender, EventArgs e)
        {
            if(checkBoxPause.Checked == true)
            {
                //HRDataSummary.threadPause = true;
                checkBoxPause.Text = "Play >";
                myThread mythread = new myThread();
                Thread pause = new Thread(mythread.pause);
                pause.Start();
            }
            if (checkBoxPause.Checked == false)
            {
                //HRDataSummary.threadPause = false;
                checkBoxPause.Text = "Pause ||";
                myThread mythread = new myThread();
                Thread play = new Thread(mythread.play);
                play.Start();
            }
        }

我错过了什么?还是使用 ManualResetEvent 是完全错误的?

【问题讨论】:

  • 为什么要在每个 if-Statement 中创建一个新的 myThread-Object?
  • 以下链接展示了您问题的答案。 [点击这里(stackoverflow.com/a/2431028/6007610)
  • @Anto 这就是他已经拥有的,但他的 Checkbox-Code 完全关闭了。
  • 直接调用pauseplay 就可以了,无需为它启动线程。
  • (1) if(checkBoxPause.Checked == true) ==> if(checkBoxPause.Checked)` 和 if(checkBoxPause.Checked == false) ==> if(! checkBoxPause.Checked) 或者更好的是 else (2) catch 没有关联try

标签: c# multithreading winforms


【解决方案1】:

首先,您在全局范围内声明您的 myThread 对象(只有一个!)。

myThread heartGraph = new myThread()

然后你想在一个新线程中启动你的 Worker-Method。

Thread worker = new Thread(heartGraph.threadHeartrateGraph);
worker.Start();

现在您可以使用 ManualResetEvent 来暂停/恢复工作。

if (checkBoxPause.Checked == true) {
    //HRDataSummary.threadPause = true;
    checkBoxPause.Text = "Play >";
    heartGraph.pause();
} else { 
    //HRDataSummary.threadPause = false;
    checkBoxPause.Text = "Pause ||";
    heartGraph.play();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2015-02-21
    相关资源
    最近更新 更多