单独线程中的多个窗体
本文关键字:窗体 线程 单独 | 更新日期: 2023-09-27 18:28:50
我正在尝试使用Windows窗体在C#中运行ATM模拟,该模拟可以让多个ATM机实例同时与银行帐户进行交易。
这个想法是使用信号量/锁定来阻止可能导致竞争条件的关键代码。
我的问题是:
如何在不同的线程上同时运行两个窗体?特别是,所有这些如何与已经存在的Application.Run()
相适应?
这是我的主要课程:
public class Bank
{
private Account[] ac = new Account[3];
private ATM atm;
public Bank()
{
ac[0] = new Account(300, 1111, 111111);
ac[1] = new Account(750, 2222, 222222);
ac[2] = new Account(3000, 3333, 333333);
Application.Run(new ATM(ac));
}
static void Main(string[] args)
{
new Bank();
}
}
...that I want to run two of these forms on separate threads...
public partial class ATM : Form
{
//local reference to the array of accounts
private Account[] ac;
//this is a reference to the account that is being used
private Account activeAccount = null;
private static int stepCount = 0;
private string buffer = "";
// the ATM constructor takes an array of account objects as a reference
public ATM(Account[] ac)
{
InitializeComponent(); //Sets up Form ATM GUI in ATM.Designer.cs
this.ac = ac;
}
...
我试过使用
Thread ATM2 = new Thread(new ThreadStart(/*What goes in here?*/));
但是,既然ATM表单是事件驱动的,并且没有一个方法控制它,那么我应该在ThreadStart构造函数中放入什么方法呢?
编辑:
我试着用代替Application.Run(new ATM(ac));
ATM atm1 = new ATM(ac);
ATM atm2 = new ATM(ac);
Thread ATM2_T = new Thread(new ThreadStart(atm1.Show));
Thread ATM1_T = new Thread(new ThreadStart(atm2.Show));
ATM1_T.Start();
ATM2_T.Start();
在Bank构造函数中。没有显示任何内容,程序从Main()函数的末尾脱落。
以下是我认为您需要做的:
Thread ATM2 = new Thread(new ThreadStart(ThreadProc));
ATM2.Start();
它调用这个方法:
private void ThreadProc()
{
var frm = new ATM();
frm.ShowDialog();
}
以上是不安全的代码
请查找线程安全代码:
Thread ATM2 = new Thread(new ThreadStart(ThreadProc));
ATM2.Start();
它调用这个方法:
private void ThreadProc()
{
if(InvokeRequired)
{
this.Invoke(new Action(() => CreateAndShowForm()));
return;
}
CreateAndShowForm();
}
private void CreateAndShowForm()
{
var frm = new ATM();
frm.ShowDialog();
}
在Bank.Main()
中,尝试用new ATM(acc).Show()
重新调整Application.Run(new ATM(acc))
的间隔。可以根据需要多次使用Form.Show()
方法。如果我记得正确的话,当所有表单都关闭时,应用程序就会关闭(尽管我可能错了——用VS调试器试试这个)