生产者与消费者(C#)
18 Mar 2012这图片500KB,还凑活。以下程序运行模样如上图。
PS:今天没去图书馆,没去食堂,头有点晕。
还有,上边贴的那首歌怎么样,摇滚,我感觉还不错。
还有,我整天写代码,心仍感不足,仍愧疚,虽然已经到了极限。
累,
持续用声音刺激神经。
001 using System;
002 using System.Collections.Generic;
003 using System.ComponentModel;
004 using System.Data;
005 using System.Drawing;
006 using System.Text;
007 using System.Windows.Forms;
008 using System.Threading;
009
010 namespace Producer_and_Consumer
011 {
012 public partial class Form1 : Form
013 {
014 private int PoolNum = ;//缓冲池数目
015 private int Pnum = ;//生产者数目
016 private int Cnum = ;//消费者数目
017 private bool isPRunning = false;//生产者线程状态
018 private bool isCRunning = false;//消费者线程状态
019 private int outPnum = ;//生产数目
020 private int outCnum = ;//消费数目
021 private int persent = ;//进度条百分比
022
023 private delegate void PDelegate(int num);//生产者委托
024 private delegate void CDelegate(int num);//消费者委托
025
026 public Form1()
027 {
028 InitializeComponent();
029 }
030
031 private void Form1_Load(object sender, EventArgs e)
032 {
033 producerText.Text = “10″;//初始化生产者数目
034 consumerText.Text = “4″;//初始化消费者数目
035 stopBtn.Enabled = false;
036 }
037
038 private void button1_Click(object sender, EventArgs e)//开始
039 {
040 stopBtn.Enabled = true;
041 startBtn.Enabled = false;
042 try
043 {
044 int.Parse(producerText.Text);
045 int.Parse(consumerText.Text);
046 }
047 catch
048 {
049 if (MessageBox.Show(“请输入数字”, “错误”, MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)
050 {
051 producerText.Clear();
052 producerText.Focus();
053 consumerText.Clear();
054 startBtn.Enabled = true;
055 }
056 }
057 if (producerText.Text == “” || consumerText.Text == “”)
058 {
059 MessageBox.Show(this, “请输入数目”, “错误”);
060 }
061 else
062 {
063 outPnum = Convert.ToInt32(producerText.Text);//获取生产者数目
064 outCnum = Convert.ToInt32(consumerText.Text);//获取消费者数目
065 }
066 for (int i = ; i < outPnum; i++)
067 {
068 Thread pthread = new Thread(PMethod);
069 isPRunning = true;
070 pthread.IsBackground = true;
071 pthread.Start();
072 }
073 for (int j = ; j < outCnum; j++)
074 {
075 Thread cthread = new Thread(CMethod);
076 isCRunning = true;
077 cthread.IsBackground = true;
078 cthread.Start();
079 }
080
081 }
082 private void PMethod()//生产者方法
083 {
084 while (isPRunning)
085 {
086 if (persent < 100)
087 {
088 Pnum++;
089 PAdd(Pnum);
090 Thread.Sleep(1000);
091 }
092 else
093 {
094 PAdd(Pnum++);
095 Thread.Sleep(1000);
096 }
097 }
098 }
099 private void PAdd(int num)
100 {
101 if (producerText.InvokeRequired)
102 {
103 PDelegate p = new PDelegate(PAdd);
104 productNum.Invoke(p, num);
105 }
106 else
107 {
108 productNum.Text = “”;
109 productNum.AppendText(Convert.ToString(num));
110 if (outPnum - outCnum > 100)
111 { PoolNum = 100; }
112 else if (outPnum - outCnum < )
113 { PoolNum = ; }
114 else
115 { PoolNum = outPnum - outCnum; }
116 poolCount.Text = Convert.ToString(PoolNum);
117 }
118 try
119 {
120 persent = (int)(100 * (((float)Pnum - (float)Cnum) / 100.0));
121 progressBar1.Value = persent;
122 if (persent >= 100)
123 label6.Text = “生产者等待中…”;
124 else
125 label6.Text = “未等待”;
126 }
127 catch { }
128 }
129 private void CMethod()//消费者方法
130 {
131 while (isCRunning)
132 {
133 if (persent > )
134 {
135 Cnum++;
136 CAdd(Cnum);
137 Thread.Sleep(1000);
138 }
139 else
140 {
141 CAdd(Cnum++);
142 Thread.Sleep(1000);
143 }
144 }
145 }
146 private void CAdd(int num)
147 {
148 if ( consumeNum.InvokeRequired)
149 {
150 CDelegate c = new CDelegate(CAdd);
151 consumeNum.Invoke(c, num);
152 }
153 else
154 {
155 consumeNum.Text = “”;
156 consumeNum.AppendText(Convert.ToString(num));
157 if (outPnum - outCnum< )
158 { PoolNum = ; }
159 else if (outPnum - outCnum >=100)
160 { PoolNum = 100; }
161 else
162 { PoolNum = outPnum - outCnum; }
163 poolCount.Text = Convert.ToString(PoolNum);
164 }
165 try
166 {
167 persent = (int)(100 * (((float)Pnum - (float)Cnum) / 100.0));
168 progressBar1.Value = persent;
169 if (persent <= )
170 label7.Text = “消费者等待中…”;
171 else
172 label7.Text = “未等待”;
173 }
174 catch { }
175 }
176
177 private void stopBtn_Click(object sender, EventArgs e)
178 {
179 isPRunning = false;
180 isCRunning = false;
181 startBtn.Enabled = true;
182 stopBtn.Enabled = false;
183 }
184
185 }
186 }
002 using System.Collections.Generic;
003 using System.ComponentModel;
004 using System.Data;
005 using System.Drawing;
006 using System.Text;
007 using System.Windows.Forms;
008 using System.Threading;
009
010 namespace Producer_and_Consumer
011 {
012 public partial class Form1 : Form
013 {
014 private int PoolNum = ;//缓冲池数目
015 private int Pnum = ;//生产者数目
016 private int Cnum = ;//消费者数目
017 private bool isPRunning = false;//生产者线程状态
018 private bool isCRunning = false;//消费者线程状态
019 private int outPnum = ;//生产数目
020 private int outCnum = ;//消费数目
021 private int persent = ;//进度条百分比
022
023 private delegate void PDelegate(int num);//生产者委托
024 private delegate void CDelegate(int num);//消费者委托
025
026 public Form1()
027 {
028 InitializeComponent();
029 }
030
031 private void Form1_Load(object sender, EventArgs e)
032 {
033 producerText.Text = “10″;//初始化生产者数目
034 consumerText.Text = “4″;//初始化消费者数目
035 stopBtn.Enabled = false;
036 }
037
038 private void button1_Click(object sender, EventArgs e)//开始
039 {
040 stopBtn.Enabled = true;
041 startBtn.Enabled = false;
042 try
043 {
044 int.Parse(producerText.Text);
045 int.Parse(consumerText.Text);
046 }
047 catch
048 {
049 if (MessageBox.Show(“请输入数字”, “错误”, MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)
050 {
051 producerText.Clear();
052 producerText.Focus();
053 consumerText.Clear();
054 startBtn.Enabled = true;
055 }
056 }
057 if (producerText.Text == “” || consumerText.Text == “”)
058 {
059 MessageBox.Show(this, “请输入数目”, “错误”);
060 }
061 else
062 {
063 outPnum = Convert.ToInt32(producerText.Text);//获取生产者数目
064 outCnum = Convert.ToInt32(consumerText.Text);//获取消费者数目
065 }
066 for (int i = ; i < outPnum; i++)
067 {
068 Thread pthread = new Thread(PMethod);
069 isPRunning = true;
070 pthread.IsBackground = true;
071 pthread.Start();
072 }
073 for (int j = ; j < outCnum; j++)
074 {
075 Thread cthread = new Thread(CMethod);
076 isCRunning = true;
077 cthread.IsBackground = true;
078 cthread.Start();
079 }
080
081 }
082 private void PMethod()//生产者方法
083 {
084 while (isPRunning)
085 {
086 if (persent < 100)
087 {
088 Pnum++;
089 PAdd(Pnum);
090 Thread.Sleep(1000);
091 }
092 else
093 {
094 PAdd(Pnum++);
095 Thread.Sleep(1000);
096 }
097 }
098 }
099 private void PAdd(int num)
100 {
101 if (producerText.InvokeRequired)
102 {
103 PDelegate p = new PDelegate(PAdd);
104 productNum.Invoke(p, num);
105 }
106 else
107 {
108 productNum.Text = “”;
109 productNum.AppendText(Convert.ToString(num));
110 if (outPnum - outCnum > 100)
111 { PoolNum = 100; }
112 else if (outPnum - outCnum < )
113 { PoolNum = ; }
114 else
115 { PoolNum = outPnum - outCnum; }
116 poolCount.Text = Convert.ToString(PoolNum);
117 }
118 try
119 {
120 persent = (int)(100 * (((float)Pnum - (float)Cnum) / 100.0));
121 progressBar1.Value = persent;
122 if (persent >= 100)
123 label6.Text = “生产者等待中…”;
124 else
125 label6.Text = “未等待”;
126 }
127 catch { }
128 }
129 private void CMethod()//消费者方法
130 {
131 while (isCRunning)
132 {
133 if (persent > )
134 {
135 Cnum++;
136 CAdd(Cnum);
137 Thread.Sleep(1000);
138 }
139 else
140 {
141 CAdd(Cnum++);
142 Thread.Sleep(1000);
143 }
144 }
145 }
146 private void CAdd(int num)
147 {
148 if ( consumeNum.InvokeRequired)
149 {
150 CDelegate c = new CDelegate(CAdd);
151 consumeNum.Invoke(c, num);
152 }
153 else
154 {
155 consumeNum.Text = “”;
156 consumeNum.AppendText(Convert.ToString(num));
157 if (outPnum - outCnum< )
158 { PoolNum = ; }
159 else if (outPnum - outCnum >=100)
160 { PoolNum = 100; }
161 else
162 { PoolNum = outPnum - outCnum; }
163 poolCount.Text = Convert.ToString(PoolNum);
164 }
165 try
166 {
167 persent = (int)(100 * (((float)Pnum - (float)Cnum) / 100.0));
168 progressBar1.Value = persent;
169 if (persent <= )
170 label7.Text = “消费者等待中…”;
171 else
172 label7.Text = “未等待”;
173 }
174 catch { }
175 }
176
177 private void stopBtn_Click(object sender, EventArgs e)
178 {
179 isPRunning = false;
180 isCRunning = false;
181 startBtn.Enabled = true;
182 stopBtn.Enabled = false;
183 }
184
185 }
186 }
转载请注明:于哲的博客 » 生产者与消费者(C#)