Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ожидание завершения другого приложения / 7 сообщений из 7, страница 1 из 1
17.12.2014, 14:05
    #38836008
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ожидание завершения другого приложения
Вот что я использовал:
Код: vbnet
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.
  Public Const PROCESS_QUERY_INFORMATION = &H400
  Public Const STILL_ACTIVE = &H103

  Public Declare Function OpenProcess Lib "kernel32" _
   (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Boolean, _
   ByVal dwProcessID As Integer) As IntPtr
  Public Declare Function GetExitCodeProcess Lib "kernel32" _
   (ByVal hProcess As IntPtr, ByRef lpExitCode As Integer) As Boolean


  Public Sub ShellAndContinue(ByVal AppToRun As String, ByVal mode As AppWinStyle)

    Dim RetVal As Integer

    'The next line launches AppToRun,
    'captures process ID
    Dim hProcess As IntPtr = OpenProcess(PROCESS_QUERY_INFORMATION, True, Shell(AppToRun, mode))
    Do
      'Get the status of the process
      GetExitCodeProcess(hProcess, RetVal)
      Application.DoEvents()
      'Loop while the process is active
    Loop While RetVal = STILL_ACTIVE

  End Sub



Вот так эквивалентно?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  Public Sub ShellAndContinueNet(ByVal AppToRun As String, ByVal mode As AppWinStyle)
    Dim MyProcess As Process = Process.GetProcessById(Shell(AppToRun, mode))
    Do While Not MyProcess.HasExited
      Application.DoEvents()
    Loop
  End Sub

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ShellAndContinueNet("notepad.exe", AppWinStyle.NormalFocus)
    MsgBox("closed")
  End Sub


(поведение вроде одинаково, причем в .Net я смотрю приложение полностью вменяемо, т.е. подвешивается лишь тек. процедура - это радует, в VB6 это кажется позволяло только выполнять параллельно код из-под таймера и м.б. реагировать на очередь сообщений окна, а здесь еще и на другие кнопки нажимать можно)

В Shell смотрю еще параметр Wait имеется.
Код: vbnet
1.
2.
3.
4.
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Shell("notepad.exe", AppWinStyle.NormalFocus, True)
    MsgBox("closed")
  End Sub


Но это боюсь не вариант - вешает всю прогу.
...
Рейтинг: 0 / 0
17.12.2014, 14:26
    #38836029
JeStone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ожидание завершения другого приложения
Дмитрий77,
Для меня плохо читабелен VB, поэтому приведу просто пример, как ожидается завершение в одном из моих проектов на C#. Думаю разберетесь.
Код: c#
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.
65.
66.
67.
68.
69.
70.
71.
72.
73.
public class Reporter
{
        public event EventHandler<EventArgs> ReportComplete = null;
        public event EventHandler<ReportOutputStreamEventArgs> ReportOutputStreamResponse = null;

        public virtual void Run()
        {
            Run(new Dictionary<string, string>());
        }

        public virtual void Run(Dictionary<string, string> arguments)
        {
            SynchronizationContext context = SynchronizationContext.Current;
            ThreadPool.QueueUserWorkItem((args) =>
            {
                using (Process process = new Process())
                {
                    ProcessStartInfo psi = new ProcessStartInfo(RegistrySettings.ActivityManagerPath,
                        GetArguments((Dictionary<string, string>)args));
                    psi.CreateNoWindow = true;
                    psi.RedirectStandardOutput = true;
                    psi.StandardOutputEncoding = Encoding.GetEncoding(RegistrySettings.ActivityManagerOutputCodePage);
                    psi.UseShellExecute = false;
                    process.StartInfo = psi;
                    process.Start();
                    if (ReportOutputStreamResponse != null)
                    {
                        StreamReader reader = process.StandardOutput;
                        do
                        {
                            string line = reader.ReadLine();
                            context.Post(
                                _ =>
                                {
                                    try
                                    {
                                        ReportOutputStreamResponse(this, new ReportOutputStreamEventArgs(line));
                                    }
                                    catch (NullReferenceException)
                                    {
                                        //Исключение происходит, когда подписчики отписываются после проверки условия на null
                                    }
                                }, null);
                        } while (!process.HasExited && ReportOutputStreamResponse != null);
                    }
                    process.WaitForExit();
                }
                if (ReportComplete != null)
                    context.Post(
                        _ =>
                        {
                            try
                            {
                                ReportComplete(this, new EventArgs());
                            }
                            catch (NullReferenceException)
                            {
                                //Исключение происходит, когда подписчики отписываются после проверки условия на null
                            }
                        }, null);
            }, arguments);
        }

        private static string GetArguments(Dictionary<string, string> arguments)
        {
            string argumentsString = "";
            foreach (var argument in arguments)
                argumentsString += String.Format(CultureInfo.InvariantCulture, "{0}=\"{1}\" ", 
                    argument.Key.Replace("\"", "\\\""), 
                    argument.Value.Replace("\"", "\\\""));
            return argumentsString; ;
        }
}


В данном случае можно хоть сотню приложений запустить, подписавшись заранее на событие ReportComplete, никаких "зависаний" не будет.
...
Рейтинг: 0 / 0
17.12.2014, 14:30
    #38836036
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ожидание завершения другого приложения
...
Рейтинг: 0 / 0
17.12.2014, 14:30
    #38836039
Ilya81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ожидание завершения другого приложения
А что после завершения? Там есть что-то, что мешает для ожидания использовать отдельный поток?
...
Рейтинг: 0 / 0
17.12.2014, 15:52
    #38836126
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ожидание завершения другого приложения
Ilya81для ожидания использовать отдельный поток?
Злоупотреблять ожиданиями в отдельных потоках думаю не стоит без необходимости, да об этом речь и не шла.
Собственно моя ShellAndContinue - это когда следующее действие (в той же процедуре) требует результата этого Shell (причем Shell длится не очень долго - к примеру запуск внешнего конвертера файла, скажем 0,5сек). Ну и к примеру эта конвертация делается из под Mailslot-таймера. DoEvents в принципе здесь достаточно, чтоб не мешать юзеру жать кнопки эти 0,5 сек. Либо наоборот юзер что-то конвертирует кнопкой и при этом работа таймера или какого CallBack-а (напр. в ответ на сообщение окну приложения) не должна стопориться и т.п.
Вопрос был: эквивалентны ли мои ShellAndContinue и ShellAndContinueNet? Хотя я и сам на 99% вижу что да.
...
Рейтинг: 0 / 0
17.12.2014, 16:07
    #38836152
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ожидание завершения другого приложения
Дмитрий77,

рекомендую срочно сменить профиль. иди в газетчики!

с такими-то способностями к словоблудию, с ходу целые вёдра слов.
талант не должен пропасть по чём зря!
...
Рейтинг: 0 / 0
17.12.2014, 16:30
    #38836169
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ожидание завершения другого приложения
hVostt,

тебе надо, ты и иди
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ожидание завершения другого приложения / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]