宿題の特定の問題に対するセマフォの適用例を示したいと思います。C# フォームに 3 つのボタンを追加しました。特定の時間に 1 つのボタンだけがコード内で銀行口座機能を実行することを示したいと思います。2 秒間に 3 つのボタンをクリックすると、銀行口座機能は 1 回だけ実行する必要があります。Thread.Sleep(6000) が銀行口座関数で 6 秒間待機しているためです。しかし、私のクリックの 3 つが 6 秒間隔で連続して実行されます。3 つのボタンを連続して押したときにコードを 1 回だけ実行するように変更するにはどうすればよいですか。コードは次のとおりです。
名前空間 semafor_form
{
public partial class Form1 : Form
{
Semaphore semafor=new Semaphore(1,1);
delegate void SetTextCallback(string text);
private void SetText(string text)
{
if (this.textBox2.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox2.Text = text;
}
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void BankAccount()
{
semafor.WaitOne();
double a = Convert.ToDouble (textBox1.Text) + Convert.ToDouble (textBox2.Text);
Thread.Sleep(6000);
semafor.Release();
SetText(a.ToString());
}
private void btnATM_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(BankAccount));
t.Start();
}
private void btnCOUNTER_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(BankAccount));
t.Start();
}
private void btnINT_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(BankAccount));
t.Start();
}
}
}