2009-09-16 2 views
3

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

Вчера я начал создавать 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, которого я не вижу? Что вы, ребята, думаете?

ответ

0

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

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


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

EDIT: может быть, вы можете заменить условие true проверки на SettingsForm видимость. Когда форма закрыта, отходы остаются в бесконечном цикле.

+0

Можете ли вы рассказать мне, почему голос, я тоже здесь, чтобы узнать. Если DoEvents выглядит злым, это то же самое, когда в приложении WinForms мы вызываем Application.Run(); – manji

+0

Я отказался, потому что при нормальных обстоятельствах вам никогда не придется использовать DoEvents. Создание формы и ее отображение - это «нормальное обстоятельство» в приложении WinForms и не требует потоковой передачи вообще, и определенно не требует бесконечного цикла с вызовом DoEvents в середине. Кроме того, я не уверен, что ваш код все равно исправит его проблему (не пробовал), но даже если бы это было сделано, было бы нецелесообразно использовать его. – MusiGenesis

+0

Ничего личного, хотя, и ваш парусник аватар делает меня мягко счастливым. :) – MusiGenesis

1

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

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

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

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

+0

Это плагин, мой основной метод - init() (только у меня есть прямой доступ), и там запускается мой код, отображается форма, но внутри ничего нет (вы знаете, когда вы создаете некоторое время (true) внутри кнопки button.click без потоковой передачи). –

+0

Неважно, это плагин или нет. Все, что я написал, правда, есть. «В то время как (правда)» обычно лучше избегать, особенно если вы ничего не делаете. Вы должны предоставить свой плагин ~ something ~, который он может использовать для работы с потоком пользовательского интерфейса, если ваш плагин будет работать с пользовательскими интерфейсами - если не что иное, передайте init аргумент ISynchronizeInvoke (ваша основная форма), чтобы он мог синхронизироваться с поток пользовательского интерфейса. См. Http://msdn.microsoft.com/en-us/library/system.componentmodel.isynchronizeinvoke.aspx –

0

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

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

Смежные вопросы