Несколько форм, несколько потоков, один процесс - PullRequest
2 голосов
/ 15 декабря 2010

Привет всем,

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

Я немного не уверен насчет идеальных мест для создания форм в отношении их потоков. Я предполагаю, что было бы лучше создавать и показывать формы в собственной ветке. Сказав, что я не уверен, что это работает правильно. Я попробовал это, но вызов перекрестного потока в формах собственного потока не работает (то есть вызов BeginInvoke не возвращает его обратно в метод ShowWindow в другом потоке) ...

    private void ShowWindow(string serialNumber)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke((MethodInvoker)(delegate() { ShowWindow(serialNumber); }));
        }
        else
        {
            this.Visible = true;
            this.WindowState = FormWindowState.Normal;
            if (serialNumber != string.Empty)
            {
                knavManagement.SelectedPage = knpActivate;
                activatePage.SerialNumber = serialNumber;
            }
            Application.DoEvents();
        }
    }

Я пробовал много разных способов вызова метода в его собственном потоке, но ни один из них не работает, что наводит меня на мысль, что это может быть как-то связано с базовой системой потоков, поэтому мой вопрос.

Thankyou!

Крис.

Ответы [ 2 ]

2 голосов
/ 15 декабря 2010

Формы Windows должны быть созданы основным потоком пользовательского интерфейса. Вы можете сделать так, чтобы каждая форма порождала рабочий поток для выполнения работы, которая должна быть выполнена. Рабочие потоки могут связываться друг с другом без IPC, хотя теперь вы находитесь в положении, когда вам нужно синхронизировать это межпотоковое взаимодействие.

0 голосов
/ 15 декабря 2010

Спасибо за ваши комментарии, ребята.

Один подход, который, как мне показалось, работает, заключается в использовании Application.Run в каждой форме, которая, как я полагаю, запускает форму в своем собственном потоке пользовательского интерфейса. Я не слишком уверен в последствиях этого, я сообщу ...

    public void StartManagementConsole()
    {            
        ThreadStart start = delegate
        {
            _managementConsole = new ManagementConsole();
            Application.Run(_managementConsole);
        };

        consoleThread = new Thread(start);
        consoleThread.SetApartmentState(ApartmentState.STA);
        consoleThread.Start();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...