Несколько форм в отдельных темах - PullRequest
3 голосов
/ 25 марта 2012

Я пытаюсь запустить симуляцию банкомата в C # с Windows Forms, которая может иметь более одного экземпляра банкомата, одновременно осуществляющего операции с банковским счетом.

Идея заключается в использовании семафоров / блокировки длязаблокировать критический код, который может привести к условиям гонки.

Мой вопрос такой:

Как я могу одновременно запускать две формы в разных потоках?В частности, как все это сочетается с 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?*/));

Но какой метод я должен добавить в конструктор ThreadStart, поскольку форма ATM управляется событиями, и нет ни одного метода, управляющего ею?

РЕДАКТИРОВАТЬ:

Я пытался заменить 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();

в банке конструктора.Ничего не отображается, и программа завершает работу функции Main ().

Ответы [ 3 ]

8 голосов
/ 25 марта 2012

Вот что я думаю вам нужно сделать:

Thread ATM2 = new Thread(new ThreadStart(ThreadProc));
ATM2.Start();

Он вызывает этот метод:

private void ThreadProc()
{
    var frm = new ATM();
    frm.ShowDialog();
}
0 голосов
/ 24 июня 2016

Вышеуказанный код небезопасен

Найдите код безопасности потока:

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();
}
0 голосов
/ 25 марта 2012

В Bank.Main(), попробуйте поменять Application.Run(new ATM(acc)) с new ATM(acc).Show().Вы можете использовать метод Form.Show() столько раз, сколько захотите.Если я правильно помню, приложение закроется, когда все формы будут закрыты (хотя я могу ошибаться - попробуйте это с отладчиком VS)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...