Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Refresh формы при запуске сторонней программы


Автор: camion8707 26.4.2010, 10:36
Здравствуйте, форумчане!

На Visual Basic .NET пытаюсь программировать около месяца.
Возник такой вот вопрос:

Есть программа, внутри кода программы вызывается другой процесс (CREATE.EXE - программка написанная на TurboPascal),
программа ждет, пока процесс завершится. Соответственно, во время выполнения процесса форма программы не прорисовывается.
Собственно вопрос в том, как заставить форму прорисовываться или быть активной, пока выполняется процесс CREATE.EXE?

Заранее спасибо!

Код


        For m = 1 To file_counter
            '--------------------------------------------------------
            'Запуск приложения CREATE
            Dim start_info As New ProcessStartInfo(path & "\CREATE.EXE")
            start_info.UseShellExecute = False
            start_info.CreateNoWindow = True

            Dim proc As New Process()
            proc.StartInfo = start_info

            proc.Start()
            proc.WaitForExit()

            ssProgBar.Value += (ssProgBar.Maximum - ssProgBar.Value - 10) / file_counter * m

            '--------------------------------------------------------

            file_name_count += 250
        Next

Автор: A5uKa 26.4.2010, 11:04
Использовать таймер прерываний ?
это первое, что пришло на ум...

Автор: KelTron 26.4.2010, 11:10
Не ждать завершения процесса методом WaitForExit, т.к. он блокирует основной поток, а подписаться на событие Process.Exited

Автор: camion8707 26.4.2010, 12:37
KelTron, СПАСИБО!

как я понял просто стоит выставить me.refresh до тех пор пока процесс не завершится.

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


Код

        For m = 1 To file_counter
            '--------------------------------------------------------
            'Запуск приложения CREATE
            Dim start_info As New ProcessStartInfo(path & "\CREATE.EXE")
            start_info.UseShellExecute = False
            start_info.CreateNoWindow = True

            Dim proc As New Process()
            proc.StartInfo = start_info

            proc.Start()

            Do
                Me.Refresh()
            Loop Until proc.HasExited = True

            ssProgBar.Value += (ssProgBar.Maximum - ssProgBar.Value - 10) / file_counter * m

            '--------------------------------------------------------

            file_name_count += 250
        Next

Автор: A5uKa 26.4.2010, 14:58
Возможно вместо Refresh хватит  
Код

Application.DoEvents();

Автор: camion8707 26.4.2010, 15:52
ОГРОМНОЕ спасибо A5uKa!!!

Вы меня просто очень сильно выручили!!!
А то я уже программу переделывать начал под параллельные процессы, а там свои сложности родились..

тему можно закрывать!! smile  smile 

Автор: A5uKa 26.4.2010, 16:08
^____^

Автор: KelTron 26.4.2010, 16:20
Нет, я говорил про другое. Хотя всё таки это событие не поможет, оно не срабатывает. 
Надо твою функцию запустить в отдельном потоке, для этого лучше всего подойдёт BackgroundWorker.
(в цикле вызывать Application.DoEvents() плохая идея, т.к. бессмысленная нагрузка на проц)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)