2009-11-02 3 views
0

Мое приложение (C#, VS2008) загружает информацию из базы данных (SQL Server 2008 Express) по сети. Во время (возможно) долгожданных ожиданий я хочу, чтобы диалоговое окно «Загрузка ...» появилось в другом потоке, но только если операция занимает больше определенного периода времени (скажем, 500 мс).Настройка формы. Настроить форму из другой темы

Итак, я до сих пор показывал, что моя загрузочная форма отображается после 500 мс (если операция длится так долго), не устанавливая владельца формы диалогового окна загрузки (например, вызывая LoadDialog.ShowDialog()), но когда я пытаюсь вызвать LoadDialog .ShowDialog (владелец IWin32Window) с владельцем, установленным в основную форму (переданный через параметр потока). Я получаю InvalidOperationException о доступе к элементам управления по потокам.

Мой основной вопрос: могу ли я создать и ShowDialog форму с параметром владельца, установленным в форму в другом потоке? Я хочу сделать это, чтобы диалог загрузки был модальным для остальной части приложения, т. Е. Как и любой другой диалог, фокусируется и запрещает ввод в другом месте.

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

Пожалуйста, не стесняйтесь просить разъяснений, если вы не понимаете.

Merci (как они говорят по-французски),

Jacob.

+1

Нет, вы не можете сделать это, даже не пробовать. – leppie

+0

Зачем вам диалог в другом потоке? – SpaceghostAli

ответ

1

Вы должны запустить длительный процесс в фоновом потоке, а затем показать свою Загрузка ... форму как не модальное диалоговое окно. Таким образом, пользователь может видеть индикацию «Загрузка», но при этом продолжает взаимодействовать с другими частями системы.

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

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

RunInBackground(DoLongOperation); 
ShowLoadingDialog(); 
... 

DoLongOperation() 
{ 
    LongOperation(); 
    RunOnGUI(FinishLongOperation); 
} 

FinishLongOperation() 
{ 
    CloseLoadingDialog(); 
} 
1

Все компоненты пользовательского интерфейса работают на единственной подошве, которая проходит по контуру сообщения win32. Вы не можете запустить какой-либо компонент пользовательского интерфейса в другом потоке. Эта архитектура сохраняется с Windows 3.1.

+1

В Win32 вы _can_ запускаете пользовательский интерфейс для нескольких потоков, если каждый поток выполняет свой собственный цикл сообщений. В Win32 SDK есть хотя бы один образец, который демонстрирует это. Я не знаю, возможно ли это в WinForms, и у меня никогда не было причин делать это в Win32 или WinForms. –

1

Вы можете создать столько потоков пользовательского интерфейса, сколько хотите. Следующий код должен сделать трюк:

Thread thread = new Thread(new ThreadStart(() => Application.Run(new MyForm()))); 
    thread.SetApartmentState(ApartmentState.STA); 
    thread.IsBackground = true; 
    thread.Start(); 

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

  • Нет связанных вопросов^_^