Исчезающая WindowsForm - PullRequest
       4

Исчезающая WindowsForm

3 голосов
/ 16 сентября 2009

Я разрабатываю плагин для приложения, которое "потребляет" мой код (classLibrary) и выполняет метод Init() внутри своего собственного Thread. Внутри Init () у меня есть оператор while(true), так что мой плагин может работать непрерывно.

Вчера я начал создавать windowsForm для настройки моего плагина (используя XML), и теперь я хочу показать его, но он продолжает исчезать. Мой код выглядит следующим образом:

При этом будет показана форма, но она не будет перерисовываться, потому что запускается в том же потоке, что и while (true).

MaForm settingsForm = null;

void init(){
    While(true){
      if(settingsForm == null){
         settingsForm = new MaForm();
         settingsForm.show();
      }

    }
}

Версия, которая показывает, но затем исчезает.

MaForm settingsForm = null;
Thread worker = null;
void init(){
    While(true){
      if(worker == null){         
         worker = new Thread(new ThreadStart(formStuff));
         worker.Start();
      }    
    }
}
void formStuff()
{
     if(settingsForm == null){
         settingsForm = new MaForm();
         settingsForm.show();
      }
}

Что я делаю не так? Что-то в Threading мне не хватает? Что вы, ребята, думаете?

Ответы [ 3 ]

1 голос
/ 16 сентября 2009

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

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

Один из вариантов - вызвать функцию для отображения вашей формы в вашем основном потоке. Это заставит вашу форму загружаться (и работать) в основном потоке.

В качестве альтернативы, вы можете запустить весь поток сообщений в потоке формы и установить поток в STA (это важно). Тем не менее, я предлагаю избегать такого подхода, если это возможно.

0 голосов
/ 16 сентября 2009

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

if(settingsForm == null){
   settingsForm = new MaForm();
   settingsForm.show();
}


while (settingsForm != null && settingsForm.Visible)
{
    System.Windows.Forms.Application.DoEvents();
}

РЕДАКТИРОВАТЬ: возможно, вы можете заменить условие true проверкой видимости SettingsForm. Когда форма закрыта, оставаться в бесконечном цикле - пустая трата времени.

0 голосов
/ 16 сентября 2009

Хороший способ справиться с проблемами многопоточности в C # - это закомментировать using System.Threading; в верхней части ваших классов и форм. У вас может быть веская причина показывать формы с Thread, но, вероятно, нет, поскольку Form.Show() не является блокирующим вызовом.

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

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