需求:
双色球:投注号码由6个红色球号码和1个蓝色球号码组成。
红色球号码从01--33中选择,不重复
蓝色球号码从01--16中选择
设计逻辑
点击开始按钮:7个球就应该变化
点击开始,都在变化,每一个都相互没有影响,每个球之间没有任何规律
要求每个球的变化:要相互不影响;完全独立---多线程的特点:多线程就是每个线程是完全独立的,相互没有影响的;
开始:
一、多线程完成
1、七个球->7个线程
2、每个线程负责一个球的不断变换
二、如何去变化
1.开启线程
2.在这个线程内部---要在需求指定的球号码所在范围内;取值
3.赋值给球
4.要不断的变化---循环---不断的取值,赋值--(不断的变)
三、重复怎么解决?
1.在赋值的时候,先判断一下,如果重复,再生成一个,重新去赋值;
2.加锁
四、开奖
1.应该让循环变化的球要停止下来
2.把界面上所有的球号码弹出来
代码部分
1、frmSSQ.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace StudyThread
{
public partial class FrmSSQ : Form
{
/// <summary>
/// 红球集合
/// </summary>
private string[] RedNums =
{
"01","02","03","04","05","06","07","08","09","10",
"11","12","13","14","15","16","17","18","19","20",
"21","22","23","24","25","26","27","28","29","30",
"31","32","33"
};
/// <summary>
/// 蓝球集合
/// </summary>
private string[] BlueNums =
{
"01","02","03","04","05","06","07","08","09","10",
"11","12","13","14","15","16"
};
private readonly static object _lock = new object();
private bool IsGon = true;
private List<Task> tasks = new List<Task>();
public FrmSSQ()
{
InitializeComponent();
}
private void btnstart_Click(object sender, EventArgs e)
{
// 初始化
tasks = new List<Task>();
this.btnstart.Text = "正在开始...";
this.btnstart.Enabled = false;
this.btnstop.Enabled = true;
// 把7个球都重置为00
this.labelBlue1.Text = "00";
this.labelRed1.Text = "00";
this.labelRed2.Text = "00";
this.labelRed3.Text = "00";
this.labelRed4.Text = "00";
this.labelRed5.Text = "00";
this.labelRed6.Text = "00";
foreach (var control in this.gboSSQ.Controls)
{
if(control is Label)
{
Label label = (Label)control;
tasks.Add(Task.Run(() =>
{
if(label.Name.Contains("Blue")) // 蓝色球
{
// BlueNums中取数据;通过索引来取
//随机的取: 随机的获取索引
while(IsGon)
{
// 索引最大是16
var index = new RandomHelper().GetRandomNumber(0, 16);
string num = BlueNums[index];
this.Invoke(new Action(() =>
{
label.Text = num;
}));
}
}
&nb