Запускать несколько потоков графического интерфейса (WinForms), чтобы они могли работать отдельно от одного основного интерфейса в C #? - PullRequest
1 голос
/ 02 марта 2010

У меня есть одно окно MainForm, и от этого пользователя можно нажать 3 кнопки. Каждая кнопка запускает новую форму, в которой пользователь может делать все, что ему нравится (например, отнимает много времени в базе данных и т. Д.). Поэтому я решил поместить каждую из форм в свои темы:

   private Thread subThreadForRaportyKlienta;
   private Thread subThreadForGeneratorPrzelewow;
   private Thread subThreadForRaporty;
   private void pokazOplatyGlobalne() {
           ZarzadzajOplatamiGlobalneDzp varGui = new ZarzadzajOplatamiGlobalneDzp();
           varGui.ShowDialog();
    }
    private void pokazRaportyKlienta() {
          RaportyDzpKlient varGui = new RaportyDzpKlient();
           varGui.ShowDialog();
    }       
    private void pokazRaportyWewnetrzne() {
       RaportyDzp varGui = new RaportyDzp();
        varGui.ShowDialog();
    }
    private void pokazGeneratorPrzelewow() {
        ZarzadzajPrzelewamiDzp varGui = new ZarzadzajPrzelewamiDzp();
        varGui.ShowDialog();
    }
    private void toolStripMenuGeneratorPrzelewow_Click(object sender, EventArgs e) {
        if (subThreadForGeneratorPrzelewow == null || subThreadForGeneratorPrzelewow.IsAlive == false) {
            subThreadForGeneratorPrzelewow = new Thread(pokazGeneratorPrzelewow);
            subThreadForGeneratorPrzelewow.Start();
        } else {

        }

    }
    private void toolStripMenuGeneratorRaportow_Click(object sender, EventArgs e) {
        if (subThreadForRaporty == null || subThreadForRaporty.IsAlive == false) {
            subThreadForRaporty = new Thread(pokazRaportyWewnetrzne);
            subThreadForRaporty.Start();
        } else {

        }
    }
    private void toolStripMenuGeneratorRaportowDlaKlienta_Click(object sender, EventArgs e)
    {
        if (subThreadForRaportyKlienta == null || subThreadForRaportyKlienta.IsAlive == false) {
            subThreadForRaportyKlienta = new Thread(pokazRaportyKlienta);
            subThreadForRaportyKlienta.Start();
        } else {

        }
    }

У меня есть пара вопросов, и я надеюсь, что кто-нибудь сможет их объяснить:

  1. Когда я использую Show() вместо ShowDialog(), окна просто мигают на секунду и никогда не отображаются. Какая на самом деле разница между этими двумя и почему это происходит?
  2. Когда я использую ShowDialog все кажется нормальным, но я заметил, что не все заполняется должным образом в одном из графических интерфейсов (один listView остается пустым, даже если в Form_Load() есть 3 простых элемента добавления. Я заметил это только в одном графическом интерфейсе даже если вы на первый взгляд все прекрасно работаете в двух других графических интерфейсах, и я могу выполнять несколько задач внутри этих форм, обновляя эти формы также в фоновом режиме (изнутри методов форм). Почему эта будет другой?
  3. Что было бы правильным способом сделать это? Задачи, выполняемые в каждой из этих форм, могут занимать много времени, и я хотел бы дать пользователю возможность без проблем переключаться между этими 4 окнами, чтобы он мог выполнять то, что ему нравится.

Ответы [ 4 ]

3 голосов
/ 02 марта 2010

Show() показывает новую форму, затем возвращает. Если это все, что делает поток, то поток выйдет, и это уничтожит форму.

ShowDialog() показывает форму, а затем начинает запускать насос сообщений, пока форма не будет скрыта или уничтожена, ShowDialog() не возвращается, поэтому ваш поток продолжает работать.

Если Вы имеете в виду, что для этих форм каждая ведет себя как отдельное окно приложения. тогда вы также можете использовать Application.Run () после form.Show(), чтобы запустить насос сообщений для формы в этом потоке. Недостатком такого способа является то, что, когда любая из ваших форм закрыта, она может в итоге завершить весь процесс из-за способа обработки WM_QUIT.

Но кроме того, как вы будете иметь дело с закрытием приложения, Form.ShowDialog() очень похоже на Form.Show(), за которым следует Application.Run(). Условия, из-за которых насос сообщений выходит из этого режима, немного отличаются, поэтому вы выбираете одно или другое, в основном исходя из того, как вы хотите, чтобы ваше приложение обрабатывало закрытие одной из ваших форм.

3 голосов
/ 02 марта 2010

Разница в Модальные и немодальные формы Windows .

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

Show() метод используется для этой цели

1 голос
/ 02 марта 2010

Вы должны поместить трудоемкие задачи в их собственные потоки BackgroundWorker. Храните все формы в основной ветке.

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

0 голосов
/ 02 марта 2010

1: Show () не блокируется, то есть показывает окно, а затем возвращает. После этого переменная varGui выходит из области видимости и завершается сборщиком мусора => исчезает.

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

if (InvokeRequired) { 
   .Invoke(..); // call back this same method on the right thread
} else {
 // dowork 
}

для управления пользовательским интерфейсом.

3: Правильный способ - это то, что написал Джейк: использовать один поток для всего графического интерфейса и потоков BackgroundWorker для, ну, в общем, фоновой работы.

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