2015-07-02 5 views
0

У меня есть форма, которая запускает процесс инициализации установки кабины. Когда процесс создается и запускается, мой текущий пользовательский интерфейс зависает (у меня есть значок загрузки, запущенный с использованием таймера потока).Пользовательский интерфейс текущей формы замерзает при создании процесса инициализации установщика кабины

//When the form initializes, the following timer is created to start the animation 
System.Threading.TimerCallback TimerDelegate = new System.Threading.TimerCallback(animationTimer); 
timer = new System.Threading.Timer(TimerDelegate, null, 0, 100); 

//After i started the following snippet to create a process to start cab installation, the animation freezes in my current Form 
ProcessInfo pi = new ProcessInfo(); 
byte[] si = new byte[128]; 
string szImageName = "\\Windows\\wceload.exe"; 
string destPath = swPath; 
string szCmdLine = @"/noaskdest /noui " + (char)34 + destPath + (char)34; 
bool result = CreateProcess(szImageName, szCmdLine, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, IntPtr.Zero, si, pi); 
System.Threading.Thread.Sleep(100); 
if (result == true) 
{ 
     int waitResult = 0; 
     waitResult = WaitForSingleObject(pi.hProcess, INFINITE); 
     CloseHandle(pi.hThread); 
     CloseHandle(pi.hProcess); 

     label1.Text = "Update is complete. Rebooting device..."; 
     label1.Refresh(); 
     System.Threading.Thread.Sleep(1000); 
     SetSystemPowerState(IntPtr.Zero, 0x00800000, 0x00001000); 

} 

Как я могу обеспечить, чтобы анимация в моей текущей форме продолжала работать, в то же время запущенный процесс запущен? Пожалуйста, совет, спасибо.

ответ

1

В зависимости от того, как работает таймер, он может быть заблокирован. Это так, если таймер использует сообщения WM_TIMER внутри. Это сообщение должно обрабатываться обработчиком сообщений, но когда насос сообщений недоступен, как при блокировании кода таймер не будет выполнен.

Вам необходимо запустить свой процесс и вызов WaitForSingleObject в отдельном потоке. Таким образом, WaitFor не блокирует ваш код пользовательского интерфейса (с помощью насоса сообщений).

Вы можете реализовать делегат и обработчик событий, чтобы поток мог обновлять пользовательский интерфейс. Затем в WaitForSingleObject не используйте INFINITE, а значение TimeOut, а затем в переключателе case проверьте результат ожидания. Если это WAIT_TIMEOUT, вы можете использовать это для обновления пользовательского интерфейса (с помощью обработчика событий).

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

+0

Да, переключение createprocess в другой поток и создание триггера для уведомления моего основного потока пользовательского интерфейса после завершения процесса выполнения работ. – Ytan