Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
28 / 27 / 7
Регистрация: 11.06.2011
Сообщений: 387
1

Запустить программу и ждать завершения, не вешая основной программы

11.10.2011, 06:23. Показов 2517. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мне нужно запустить программу и дождаться её завершение, после продолжить работу

Вот что я нашел, для реализации этого.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Private Type PROCESS_INFORMATION
   hProcess As Long
   hThread As Long
   dwProcessID As Long
   dwThreadID As Long
End Type
 
Private Type STARTUPINFO
   cb As Long
   lpReserved As String
   lpDesktop As String
   lpTitle As String
   dwX As Long
   dwY As Long
   dwXSize As Long
   dwYSize As Long
   dwXCountChars As Long
   dwYCountChars As Long
   dwFillAttribute As Long
   dwFlags As Long
   wShowWindow As Integer
   cbReserved2 As Integer
   lpReserved2 As Long
   hStdInput As Long
   hStdOutput As Long
   hStdError As Long
End Type
 
     
 
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
 
Private Declare Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As Long, ByVal lpCommandLine As String, _
ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) _
As Long
 
 
 
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
 
Private Const INFINITE = -1&
Private Const NORMAL_PRIORITY_CLASS = &H20&
 
Dim FileName As String
 
 
Public Sub RunFile(FileName)
   
   Dim Process As PROCESS_INFORMATION
   
   Dim Prog As STARTUPINFO
   
   Prog.cb = Len(Prog)
   
   CreateProcessA 0&, FileName, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Prog, Process
   
   WaitForSingleObject Process.hProcess, INFINITE
   
   CloseHandle Process.hProcess
 
End Sub
Код работает, но окно основной формы перестает перерисовываться. Возможно ничего страшного нет, но выглядит не красиво и кажется что всё повисло. Что поправить в коде или подскажите другой способ для реализации этой идеи ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2011, 06:23
Ответы с готовыми решениями:

Запустить внешюю программу и дождаться ее завершения
Всем привет! Испольщую код: Private Declare Function WaitForSingleObject Lib "kernel32"...

Как запустить стороннее приложение и ждать завершения его работы?
В принципе, зная расположение какого-то приложения на диске запуск его особых трудностей не...

Не ждать завершения запущенной внешней программы
Я запускаю из своей программы внешний экзешник при помощи system(command). Но данный вариант меня...

Запустить внешнюю программу и дождаться ее завершения
Доброго времени суток. Я новичек в программировании и тем более в C#. Очень нужна помощь. Форма...

4
Частенько бываю
750 / 331 / 42
Регистрация: 20.06.2007
Сообщений: 854
11.10.2011, 07:49 2
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
'...58
If CreateProcessA(CreateProcessA 0&, FileName, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Prog, Process) = 0 Then Unload Me: Exit Sub
CloseHandle Process.hThread
Do
    DoEvents
    'Здесь можно подвигать какой нибудь прогресс бар
Loop Until WaitForSingleObject(Process.hProcess, 20) = 0
'59...
1
28 / 27 / 7
Регистрация: 11.06.2011
Сообщений: 387
11.10.2011, 08:43  [ТС] 3
Vlanib, Спасибо.
0
2 / 2 / 1
Регистрация: 16.03.2015
Сообщений: 45
09.06.2015, 23:25 4
Подскажите, почему VB ругается вот на эту строку? Ожидает разделителя. или скобки?

Visual Basic
1
If CreateProcessA(CreateProcessA 0&, FileName, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Prog, Process) = 0 Then Unload Me: Exit Sub
0
1484 / 579 / 106
Регистрация: 26.03.2012
Сообщений: 1,028
03.01.2016, 21:25 5
Цитата Сообщение от Regressor Посмотреть сообщение
Подскажите, почему VB ругается вот на эту строку? Ожидает разделителя. или скобки?
Visual Basic
1
If CreateProcessA(0&, FileName, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Prog, Process) = 0 Then Unload Me: Exit Sub
0
03.01.2016, 21:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.01.2016, 21:25
Помогаю со студенческими работами здесь

Ждать завершения backgroundWorker
Возможно ли в основном потоке подождать пока выполнится backgroundworker. например... private...

Ждать завершения ExecutorService
Добрый день уважаемые форумчане, подскажите пожалуйста... У меня есть поток, он в свою очередь...

Вызов подпрограммы из основной программы, с сохранением работоспособности основной программы?(подробно внутри)
Добрый день. Буду благодарен, если кто-нибудь подскажет как такое реализовать. Суть вопроса: ...

Как вызвать приложение и ждать его завершения
Люди! Как из проги на яве вызвать другое приложение и !ждать его завершения! , а потом продолжить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru