buffedcheesy Ответов: 1

Экземпляр новой формы в потоке


Моя проблема в том, что я хочу показать что-то вроде заставки, пока приложение занято. Я хотел создать поток, запускающий новую форму с панелью прогресса и небольшой информацией, которую пользователь должен ждать.
Пока все идет хорошо,но форма застывает, когда она появляется. (Если я не делаю обновление, я прокомментировал, форма даже не строится должным образом).

В чем тут проблема?

Что я уже пробовал:

public class WaitFormManager
    {
        private Thread waitFormThread;

        public WaitFormManager()
        {
            waitFormThread = new Thread(new ThreadStart(OpenWaitform));
        }

        public void ShowWaitForm()
        {
            if (!waitFormThread.IsAlive)
            {
                waitFormThread.Start();
            }
        }

        public void HideWaitForm()
        {
            if (waitFormThread.IsAlive)
            {
                waitFormThread.Abort();
            }
        }

        private void OpenWaitform()
        {
            WaitForm wf = new WaitForm();
            wf.Show();
            //wf.Update();
        }
    }


Я назвал форму так:
public static WaitFormManager wfm = new WaitFormManager();
wfm.ShowWaitForm();
//Here we get some stuff done
System.Threading.Thread.Sleep(2000);
wfm.HideWaitForm();

[no name]

Ну, вы не отформатировали свой код так, чтобы он был читабельным. И вы не отлаживали метод обновления, чтобы узнать, что он делает.

buffedcheesy

.. Поэтому я активировал XSS google для форматирования кода. Функция обновления является частью формы. Он просто перерисовывает области для пользователя. Я хотел проиллюстрировать, что нить работает не так, как я хочу.

Ralf Meier

Я думаю (но не совсем уверен), что ваша идея такого подхода совершенно неверна. Пожалуйста, напишите больше о том, что вы хотите сделать.

Чтобы сохранить ваш пользовательский интерфейс (User-Interface) живым, вам нужно сохранить ваше приложение responsiv - но этого не происходит, потому что вы отправляете свое приложение в спящий режим (2000 миллисекунд). Ваша нить сама по себе тоже ничего не делает - так что же вы думаете, что происходит ?

Dave Kreskowiak

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

Вы помещаете работу в фоновый поток, а не в пользовательский интерфейс.

Philippe Mori

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

1 Ответов

Рейтинг:
7

Rav! Srivastava

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