2013-05-09 4 views
1

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

Я предоставляю ему делегат и звоню ShowDialog. Он просто принимает делегата и выполняет его в событии Shown. После этого Hide().

Целью является то, что пользователь должен ждать, пока делегат будет запущен.

НО: Он начинает выполнять делегат ДО ТОГО, что он полностью отображается. Я имею в виду, что форма появляется на экране, но ярлык please wait застревает в рабочем коде, показывая его очень поздно или даже не показан. (Пустой прямоугольник остается в середине формы).

Я могу сделать форму wait, возможно, за две секунды до запуска делегата, но есть ли другой способ (лучше и уверен) позвонить делегату ПОСЛЕ того, как форма полностью раскрашена, с меткой, показанной ???

Спасибо.

+1

«форма появляется на экране, но ярлык« wait wait »застрял в запущенном коде, показывая его очень поздно или даже не показан (пустой прямоугольник остается в середине формы)». Похоже, вам нужно выполнить делегат в ** отдельном потоке **, чтобы форма могла правильно отображать и обновлять. –

+1

Вызов this.Update() перед запуском делегата. –

+0

@Idle_Mind, будет ли отдельный поток медленнее ??? Это тяжелый основной код. –

ответ

1

Попробуйте использовать BackgroundWorker Компонент BackgroundWorker имеет 4 события.

Вы должны были бы реализовать 2 из них: DoWork и RunWorkerCompleted

Метод DoWork выполняется в потоке, и где вы делаете свою работу (или в случае, вызовите делегат) RunWorkerCompleted называется когда работа закончена, и вы можете вызвать свой метод Hide().

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

Тогда просто сделайте свой рисунок как обычно, и вызовите рабочего рабочего RunWorkerAsync, чтобы вызвать его.

public class Wait : Form 
{ 
    BackgroundWorker _bgWorker = new BackgroundWorker(); 
    public delegate void toExecuteDele(object args); 

    public toExecuteDele ToExecute; 

    public Wait() 
    { 
     InitializeComponent(); 
     _bgWorker.DoWork += new DoWorkEventHandler(DoWork) 
     _bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler (WorkDone); 
    } 

    public void Execute(object args) 
    { 
     // Display Stuff (label, start a progress bar pulsing, maybe enable disable stuff 
      DispalyStuff(" Plate Wait"); 
     _bgWorker.RunBackgroundAsync(args); 
    } 

    private void DoWork(object sender, DoWorkEventArgs e) 
    { 

     if(ToExecute != null) 
      ToExecute(e.Argument); 

    } 

    public void WorkDone(object sender, RunWorkerCompletedEventArgs e) 
    { 
     // Display an Error if there is an exception in the event args 
     Hide(); 
    } 
} 

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

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

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