AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
CRM
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.09.2010, 12:03   #1  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
Цитата:
Сообщение от Beast-L Посмотреть сообщение
В том то и дело что именно виснет. Скорее все распаковка происходит быстро (архив маленький) и поэтому ждать уже нечего, и событие завершения происходит до вызова ожидания, поэтому и виснет.
Windows Server 2008 R2 Ax2009 rollup 4 x64 - intel xeon 4x работает
сделал - архив файла 0(нуль) и 300 Мб. а также команда dir в пустом каталоге, а также несуществующая команда
не удалось повторить ошибку

а вот так что у вас вернет и будет ли результат? по вашей версии процесс уже выполнен и все нормально
X++:
process.Start();
//    process.WaitForExit();
 
    exitCode        = process.get_ExitCode();
    info(strFmt([COLOR=red]"%1"[/COLOR],exitCode ));
Старый 15.09.2010, 12:18   #2  
Beast-L is offline
Beast-L
Участник
Аватар для Beast-L
 
104 / 21 (1) +++
Регистрация: 20.10.2006
Адрес: Киев
Файл распакован, в результате - 0.
Старый 15.09.2010, 13:18   #3  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
Цитата:
Сообщение от Beast-L Посмотреть сообщение
Файл распакован, в результате - 0.
http://msdn.microsoft.com/en-us/library/ty0d8k56.aspx
Цитата:
Сообщение от цитата из ссылки
If you pass 0 (zero) to the method, it returns true only if the process has already exited.
Если вы передаете 0 (ноль) к методу, то возвращает истину, только если процесс уже завершился
предлагаю такой вариант
X++:
    while(!process.WaitForExit(0)) //проверяем, что процесс еще не закончен в Х++
    {
        sleep(100);
    }
За это сообщение автора поблагодарили: Beast-L (1).
Старый 16.09.2010, 19:44   #4  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Для запуска на стороне сервера различных консольных exe написал такую функцию (для DAX2009) в классе WinAPIServer.

Позволяет также управлять временем ожидания выполнения приложения.
Возвращает результат (успешное / не успешное завершение)

X++:
static server boolean shellExecuteWait(str _commandLine, str _arguments = "", int _waitTime = -1)
{
    System.Diagnostics.Process          process;
    System.Diagnostics.ProcessStartInfo startInfo;
    InteropPermission                   permission = new InteropPermission(InteropKind::ClrInterop);
    System.Exception                    exception;
    Boolean                             exited;
    ;
    permission.assert();

    startInfo   = new System.Diagnostics.ProcessStartInfo(_commandLine);
    process     = new System.Diagnostics.Process();

    if (_arguments)
    {
        startInfo.set_Arguments(_arguments);
    }

    try
    {
        startInfo.set_UseShellExecute(false); // для отключения диалога безопасности доступа к сетевым файлам

        process.set_StartInfo(startInfo);
        process.Start();
        process.WaitForExit(_waitTime);

        exited = process.get_HasExited();

        if (exited == false)
        {
            process.Kill();

            return false;
        }

        return true;
    }
    catch (Exception::CLRError)
    {
        exception = CLRInterop::getLastException();

        while (exception)
        {
            error(exception.get_Message());

            exception = exception.get_InnerException();
        }

        return false;
    }
}
За это сообщение автора поблагодарили: gl00mie (2), player (1).
Старый 17.09.2010, 16:03   #5  
Beast-L is offline
Beast-L
Участник
Аватар для Beast-L
 
104 / 21 (1) +++
Регистрация: 20.10.2006
Адрес: Киев
Цитата:
Сообщение от titov Посмотреть сообщение
http://msdn.microsoft.com/en-us/library/ty0d8k56.aspx


Если вы передаете 0 (ноль) к методу, то возвращает истину, только если процесс уже завершился
предлагаю такой вариант
X++:
    while(!process.WaitForExit(0)) //проверяем, что процесс еще не закончен в Х++
    {
        sleep(100);
    }
Вроде бы работает. Но почему то остаются висячие процессы 7z на сервере.


В общем для своей задачи я нашел решение которое меня полностью устроило, это библиотека .NET IonicZip.
Старый 21.03.2011, 12:48   #6  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Вот несколько измененная функция запуска приложения.

Возвращает текст, выданный запускаемым приложением, получаемый с консоли. Может быть полезно при запуске консольных утилит, возвращающих результат исполнения (или ошибки) выводом на экран. (например zip, rar и так далее).
Кроме того может управлять временем ожидания выполнения приложения. При превышении времени приложение будет принудительно завершено.

Может работать при запуске и на клиенте, и на сервере (написана для ax2009, для ax4 тоже должна работать).

Может быть пригодится кому - нибудь...

Например, при запуске:
X++:
static void test(Args _args)
{
    ;
    info(winapiserver::shellExecuteWaitInfo("cmd", "dir"));
}
Выдает:
Цитата:
Microsoft Windows [Version 5.2.3790]
(C) Copyright 1985-2003 Microsoft Corp.

C:\WINDOWS\system32>
Текст самой функции:
X++:
static server str shellExecuteWaitInfo(str _commandLine, str _arguments = "", int _waitTime = -1)
{
    System.String                       outputInfo;
    System.IO.StreamReader              streamReader;
    System.Diagnostics.Process          process;
    System.Diagnostics.ProcessStartInfo startInfo;
    InteropPermission                   permission = new InteropPermission(InteropKind::ClrInterop);
    System.Exception                    exception;
    Boolean                             exited;

    System.Text.Encoding                encoding;
    System.Text.Encoding                encoding866;
    System.Text.Encoding                encodingUTF;

    System.Byte[]                       tmp;
    str                                 ret;
    ;
    permission.assert();

    encodingUTF = System.Text.Encoding::get_Unicode();
    encoding866 = System.Text.Encoding::GetEncoding(866);


    startInfo   = new System.Diagnostics.ProcessStartInfo(_commandLine);
    process     = new System.Diagnostics.Process();

    if (_arguments)
    {
        startInfo.set_Arguments(_arguments);
    }

    try
    {
        startInfo.set_UseShellExecute(false); // для отключения диалога безопасности доступа к сетевым файлам
        startInfo.set_RedirectStandardOutput(true);

        process.set_StartInfo(startInfo);
        process.Start();

        streamReader = process.get_StandardOutput();

        encoding = streamReader.get_CurrentEncoding();

        outputInfo = streamReader.ReadToEnd();

        process.WaitForExit(_waitTime);

        exited = process.get_HasExited();

        if (exited == false)
        {
            process.Kill();

            return "";
        }

        tmp = encoding.GetBytes(outputInfo);

        tmp = System.Text.Encoding::Convert(encoding866, encodingUTF, tmp);

        ret = encodingUTF.GetString(tmp);

        if (ret)
            return ret;

        return "ok";
    }
    catch (Exception::CLRError)
    {
        exception = CLRInterop::getLastException();

        while (exception)
        {
            error(exception.get_Message());

            exception = exception.get_InnerException();
        }

        return "";
    }
}
За это сообщение автора поблагодарили: konfet (1).
Старый 14.06.2011, 19:00   #7  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Вот исправленный текст функции shellExecuteWaitInfo.

В прошлом варианте не работала настройка waitTime - время ожидания окончания процесса...

X++:
static client server str shellExecuteWaitInfo(str _commandLine, str _arguments = "", int _waitTime = -1)
{
    System.String                       outputInfo;
    System.IO.StreamReader              streamReader;
    System.Diagnostics.Process          process;
    System.Diagnostics.ProcessStartInfo startInfo;
    InteropPermission                   permission = new InteropPermission(InteropKind::ClrInterop);
    System.Exception                    exception;
    Boolean                             exited;

    System.Text.Encoding                encoding;
    System.Text.Encoding                encoding866;
    System.Text.Encoding                encodingUTF;

    System.Byte[]                       tmp;
    str                                 ret;
    ;
    permission.assert();

    encodingUTF = System.Text.Encoding::get_Unicode();
    encoding866 = System.Text.Encoding::GetEncoding(866);


    startInfo   = new System.Diagnostics.ProcessStartInfo(_commandLine);
    process     = new System.Diagnostics.Process();

    if (_arguments)
    {
        startInfo.set_Arguments(_arguments);
    }

    try
    {
        startInfo.set_UseShellExecute(false); // для отключения диалога безопасности доступа к сетевым файлам
        startInfo.set_RedirectStandardOutput(true);

        process.set_StartInfo(startInfo);
        process.Start();

        streamReader = process.get_StandardOutput();

        encoding = streamReader.get_CurrentEncoding();

        process.WaitForExit(_waitTime);

        exited = process.get_HasExited();

        if (exited == false)
        {
            process.Kill();

            return "";
        }

        outputInfo = streamReader.ReadToEnd();

        tmp = encoding.GetBytes(outputInfo);

        tmp = System.Text.Encoding::Convert(encoding866, encodingUTF, tmp);

        ret = encodingUTF.GetString(tmp);

        if (ret)
            return ret;

        return "ok";
    }
    catch (Exception::CLRError)
    {
        exception = CLRInterop::getLastException();

        while (exception)
        {
            error(exception.get_Message());

            exception = exception.get_InnerException();
        }

        return "";
    }
}
За это сообщение автора поблагодарили: Logger (5), Link (4).
Теги
64-bit, aos, ax2009, dllfunction, winapi, zip

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Connection к другому SQL Server Poleax DAX: Программирование 5 19.10.2010 10:49
emeadaxsupport: Unable to validate the AX 2009 Workflow Webservice URL on a Windows Server 2008 R2 x64 Blog bot DAX Blogs 0 05.01.2010 19:16
chrisfie: Project Server 2007 TechNet Webcasts recordings and decks Blog bot DAX Blogs 0 21.07.2009 10:05
dynamicsusers: SQL Server: x64 vs x86 Blog bot DAX Blogs 0 28.06.2007 17:00
aEremenko: Диагностика проблем при установке Microsoft Dynamics Ax 4.0 на Microsoft SQL Server 2005 Blog bot DAX Blogs 0 28.10.2006 16:01

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:05.