同步兩個執行緒, 當Counter1++完成, 換Counter2++,

利用AutoResetEvent機制交換控制權

由於同步的關係, 儘管兩組計數器跳動很快, 但下列條件成立 |Counter1 -Counter2| <= 1

public class Worker
{
int m_cnt1 = 0, m_cnt2 = 0;
Thread m_thread1;
Thread m_thread2;
TextBox m_textBox1, m_textBox2;
readonly AutoResetEvent m_syncEvent1 = new AutoResetEvent(false);
readonly AutoResetEvent m_syncEvent2 = new AutoResetEvent(true);
ManualResetEvent m_pauseEvent = new ManualResetEvent(true);
ManualResetEvent m_shutdownEvent = new ManualResetEvent(false);
void Job1()
{
while (true)
{
m_pauseEvent.WaitOne(Timeout.Infinite);
if (m_shutdownEvent.WaitOne(0))
break;
m_syncEvent2.WaitOne();
m_cnt1++;
m_textBox1.BeginInvoke((MethodInvoker)delegate {
m_textBox1.Text = m_cnt1.ToString();
});
Thread.Sleep(1);
m_syncEvent1.Set();
}
}
void Job2()
{
while (true)
{
m_pauseEvent.WaitOne(Timeout.Infinite);
if (m_shutdownEvent.WaitOne(0))
break;
m_syncEvent1.WaitOne();
m_cnt2++;
m_textBox2.BeginInvoke((MethodInvoker)delegate
{
m_textBox2.Text = m_cnt2.ToString();
});
Thread.Sleep(1);
m_syncEvent2.Set();
}
}
public Worker() { }
public Worker(TextBox textBox1, TextBox textBox2)
{
m_textBox1 = textBox1;
m_textBox2 = textBox2;
}
public void Start()
{
m_thread1 = new Thread(new ThreadStart(Job1));
m_thread2 = new Thread(new ThreadStart(Job2));
m_thread1.Start();
m_thread2.Start();
}
public void Pause()
{
m_pauseEvent.Reset();
}
public void Resume()
{
m_pauseEvent.Set();
}
public void Stop()
{
m_shutdownEvent.Set();
m_pauseEvent.Set();
m_thread1.Join();
m_thread2.Join();
m_thread1 = null;
m_thread2 = null;
}
}


UI測試worker

public partial class Form1 : Form
{
Worker m_worker;

public Form1()
{
InitializeComponent();
}

private void startToolStripMenuItem_Click(object sender, EventArgs e)
{
//if(m_worker == null)
m_worker = new Worker(textBox1, textBox2);
m_worker.Start();
}

private void pauseToolStripMenuItem_Click(object sender, EventArgs e)
{
m_worker.Pause();
}

private void resumeToolStripMenuItem_Click(object sender, EventArgs e)
{
m_worker.Resume();
}

private void stopToolStripMenuItem_Click(object sender, EventArgs e)
{
m_worker.Stop();
m_worker = null;
GC.Collect();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (m_worker != null)
{
m_worker.Stop();
m_worker = null;
}
GC.Collect();
}
}

文章標籤
全站熱搜
創作者介紹
創作者 me1237guy 的頭像
me1237guy

天天向上

me1237guy 發表在 痞客邦 留言(0) 人氣(81)