多线程计算Pi
西南交通大学
操作系统实验
Operation System Experiment
( 课 程 代 码 0474012)
实验地点: 实验学期: 实验名称: 学生班级: 学生学号: 学生姓名:
X7105 大二下学期 多 线 程 计 算 Pi 值 2014 级 软 件 一 班
2014112128 蒋妮妮
任课教师:胡晓鹏 信息科学与技术学院
namespace CalculatePi {
/// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window {
private int precision; private int count; private Thread PiThread;
private delegate void MyDelegate(); private double Charge;
public MainWindow() {
InitializeComponent(); count = 0; }
private void Window_Loaded(object sender, RoutedEventArgs e) {
实验结果
1、界面 2、开始计算后暂停 3、计算完成
多线程计算 Pi 值
实验目的
先接收用户输入的精度来控制 pi 值小数点后的位数。在主函数中 创建线程 myThread,并将委派 ThreadStart 所封装的方法定义为函 数 piMain()。再通过对线程的暂停、继续、终止来控制 pi 值得输出 位数,并了解线程的工作过程。
实验内容
边计算边输出,主线程与计算 Pi 的线程要进行通信,(线程 交互)更新进行输出到界面,主线程控制 UI 的逻辑,进行更新 数据(串行化),互斥,计算线程只进行计算。
}
}
private void GetThread() {
PiThread = new Thread(new ThreadStart(thread)); PiThread.SetApartmentState(ApartmentState.STA); //设置到主应 用程序的单元状态 PiThread.IsBackground = true; PiThread.Start(); }
private void Printnumber() {
if (count == precision - 1) {
btnPause.IsEnabled = false; btnStop.IsEnabled = false; btnReturn.IsEnabled = true; } this.ResultBox.Text = String.Concat(Charge); this.ResultBox.Select(0,this.ResultBox.Text.Length); }
实验代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Threading; using System.Windows.Threading;
}
private void btnStart_Click(object sender, RoutedEventArgs e) {
if (btnStart.IsEnabled == true) btnStart.IsEnabled = false;
if (this.InputBox.Text == "") {
} else
{ btnPause.Content = "暂停"; PiThread.Resume(); btnPause.IsEnabled = true; btnStart.IsEnabled = false; btnStop.IsEnabled = true; btnReturn.IsEnabled = true; this.ResultBox.Select(0,this.ResultBox.Text.Length);
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
}
private void InputBox_TextChanged(object sender, TextChangedEventArgs e)
{
}
private void btnQuit_Click(object sender, RoutedEventArgs e) {
private void thread() {
double pi = 0; int i = 0, k = 1; for (count = 0; count < precision; ++i, count++) {
pi += 1.0 / (2 * i + 1) * k; k = -k; Charge = pi * 4; Thread.Sleep(50); this.Dispatcher.Invoke(DispatcherPriority.Normal, new MyDelegate(Printnumber));//同步执行指定的委托 } MessageBox.Show("计算完成!");
}
private void btnStop_Click(object sender, RoutedEventArgs e) {
PiThread.Abort(); btnStart.IsEnabled = false; btnPause.IsEnabled = false; btnReturn.IsEnabled = true; btnStop.IsEnabled = false; }
MessageBox.Show("您还没有输入精度!","提示"); btnStart.IsEnabled = true; } else { precision = int.Parse(this.InputBox.Text); //将输入的数字类 型字符串转换为 int btnPause.IsEnabled = true; btnStop.IsEnabled = true; GetThread(); this.ResultBox.Select(0,this.ResultBox.Text.Length); }
PiThread.Abort(); .Close(); }
private void btnReturn_Click(object sender, RoutedEventArgs e) {
InputBox.Text = ""; ResultBox.Text = ""; PiThread.Abort(); btnStart.IsEnabled = true; btnPause.IsEnabled = false; btnReturn.IsEnabled = false; btnStop.IsEnabled = false; } } }
}
private void btnPause_Click(object sender, RoutedEventArgs e) {
if ((string)btnPause.Content == "暂停") {
btnPause.Content = "继续"; PiThread.Suspend(); btnStop.IsEnabled = true; btnPause.IsEnabled = true; btnStart.IsEnabled = false; btnReturn.IsEnabled = true;