Что такое НЕОБХОДИМОСТЬ ПОКРЫТИЕ в моей презентации Groovy? [закрытый]

Я не мог понять, почему popen / pclose отсутствует в Codeblocks / MinGW. Поэтому я работал над проблемой, используя вместо этого CreateProcess () и CreatePipe (). Вот решение, которое сработало для меня:

//C++11
#include <cstdio>
#include <iostream>
#include <windows.h>
#include <cstdint>
#include <deque>
#include <string>
#include <thread>

using namespace std;

int SystemCapture(
    string         CmdLine,    //Command Line
    string         CmdRunDir,  //set to '.' for current directory
    string&        ListStdOut, //Return List of StdOut
    string&        ListStdErr, //Return List of StdErr
    uint32_t&      RetCode)    //Return Exit Code
{
    int                  Success;
    SECURITY_ATTRIBUTES  security_attributes;
    HANDLE               stdout_rd = INVALID_HANDLE_VALUE;
    HANDLE               stdout_wr = INVALID_HANDLE_VALUE;
    HANDLE               stderr_rd = INVALID_HANDLE_VALUE;
    HANDLE               stderr_wr = INVALID_HANDLE_VALUE;
    PROCESS_INFORMATION  process_info;
    STARTUPINFO          startup_info;
    thread               stdout_thread;
    thread               stderr_thread;

    security_attributes.nLength              = sizeof(SECURITY_ATTRIBUTES);
    security_attributes.bInheritHandle       = TRUE;
    security_attributes.lpSecurityDescriptor = nullptr;

    if (!CreatePipe(&stdout_rd, &stdout_wr, &security_attributes, 0) ||
            !SetHandleInformation(stdout_rd, HANDLE_FLAG_INHERIT, 0)) {
        return -1;
    }

    if (!CreatePipe(&stderr_rd, &stderr_wr, &security_attributes, 0) ||
            !SetHandleInformation(stderr_rd, HANDLE_FLAG_INHERIT, 0)) {
        if (stdout_rd != INVALID_HANDLE_VALUE) CloseHandle(stdout_rd);
        if (stdout_wr != INVALID_HANDLE_VALUE) CloseHandle(stdout_wr);
        return -2;
    }

    ZeroMemory(&process_info, sizeof(PROCESS_INFORMATION));
    ZeroMemory(&startup_info, sizeof(STARTUPINFO));

    startup_info.cb         = sizeof(STARTUPINFO);
    startup_info.hStdInput  = 0;
    startup_info.hStdOutput = stdout_wr;
    startup_info.hStdError  = stderr_wr;

    if(stdout_rd || stderr_rd)
        startup_info.dwFlags |= STARTF_USESTDHANDLES;

    // Make a copy because CreateProcess needs to modify string buffer
    char      CmdLineStr[MAX_PATH];
    strncpy(CmdLineStr, CmdLine.c_str(), MAX_PATH);
    CmdLineStr[MAX_PATH-1] = 0;

    Success = CreateProcess(
        nullptr,
        CmdLineStr,
        nullptr,
        nullptr,
        TRUE,
        0,
        nullptr,
        CmdRunDir.c_str(),
        &startup_info,
        &process_info
    );
    CloseHandle(stdout_wr);
    CloseHandle(stderr_wr);

    if(!Success) {
        CloseHandle(process_info.hProcess);
        CloseHandle(process_info.hThread);
        CloseHandle(stdout_rd);
        CloseHandle(stderr_rd);
        return -4;
    }
    else {
        CloseHandle(process_info.hThread);
    }

    if(stdout_rd) {
        stdout_thread=thread([&]() {
            DWORD  n;
            const size_t bufsize = 1000;
            char         buffer [bufsize];
            for(;;) {
                n = 0;
                int Success = ReadFile(
                    stdout_rd,
                    buffer,
                    (DWORD)bufsize,
                    &n,
                    nullptr
                );
                printf("STDERR: Success:%d n:%d\n", Success, (int)n);
                if(!Success || n == 0)
                    break;
                string s(buffer, n);
                printf("STDOUT:(%s)\n", s.c_str());
                ListStdOut += s;
            }
            printf("STDOUT:BREAK!\n");
        });
    }

    if(stderr_rd) {
        stderr_thread=thread([&]() {
            DWORD        n;
            const size_t bufsize = 1000;
            char         buffer [bufsize];
            for(;;) {
                n = 0;
                int Success = ReadFile(
                    stderr_rd,
                    buffer,
                    (DWORD)bufsize,
                    &n,
                    nullptr
                );
                printf("STDERR: Success:%d n:%d\n", Success, (int)n);
                if(!Success || n == 0)
                    break;
                string s(buffer, n);
                printf("STDERR:(%s)\n", s.c_str());
                ListStdOut += s;
            }
            printf("STDERR:BREAK!\n");
        });
    }

    WaitForSingleObject(process_info.hProcess,    INFINITE);
    if(!GetExitCodeProcess(process_info.hProcess, (DWORD*) &RetCode))
        RetCode = -1;

    CloseHandle(process_info.hProcess);

    if(stdout_thread.joinable())
        stdout_thread.join();

    if(stderr_thread.joinable())
        stderr_thread.join();

    CloseHandle(stdout_rd);
    CloseHandle(stderr_rd);

    return 0;
}

int main()
{
    int            rc;
    uint32_t       RetCode;
    string         ListStdOut;
    string         ListStdErr;

    cout << "STARTING.\n";

    rc = SystemCapture(
        "C:\\Windows\\System32\\ipconfig.exe",    //Command Line
        ".",                                     //CmdRunDir
        ListStdOut,                              //Return List of StdOut
        ListStdErr,                              //Return List of StdErr
        RetCode                                  //Return Exit Code
    );
    if (rc < 0) {
        cout << "ERROR: SystemCapture\n";
    }

    cout << "STDOUT:\n";
    cout << ListStdOut;

    cout << "STDERR:\n";
    cout << ListStdErr;

    cout << "Finished.\n";

    cout << "Press Enter to Continue";
    cin.ignore();

    return 0;
}
11
задан Yeldar Kurmangaliyev 14 July 2015 в 07:50
поделиться

7 ответов

Я ничего не знаю об отличном так в некотором смысле, я квалифицировал для ответа на это...

Я хотел бы Вас к:

  • Скажите мне, почему я хотел бы использовать Сценарии (в целом) в противоположность Java - что делает это, позволяют мне сделать более быстрый (как во время разработки), что делает это делает более читаемыми. Дайте дразнящие примеры способов, которыми я могу использовать блоки сценариев в моем главным образом приложение Java. Вы хотите сделать это относящимся к Java devs moreso, чем технические наркоманы.
  • С этим из пути, почему Groovy? Почему не Ruby, Python или безотносительно (которые все выполнимы на JVM).
  • Не показывайте мне синтаксис, что Java может уже сделать (если операторы, циклы и т.д.) или если Вы действительно делаете его быстрым. Это столь же скучно как ад, чтобы наблюдать, что кто-то идет через синтаксис языка 101 в течение 20 минут.
    • Для синтаксиса, который имеет comparible функцию в Java, возможно, показывают им рядом быстро.
    • Для синтаксиса, который не находится в Java (закрытия и т.д.) можно говорить с ними в немного большем количестве деталей.
  • Помните те примеры от первой точки. Покажите мне один, полностью рабочий (или по крайней мере сходство с ним).
  • В конце имеют время для вопросов. Это сумасшедшее важный, и с этим прибывает нагрузка в Вас, чтобы быть psuedo-гуру :P.

Я не уверен в том, как Java6, пишущий сценарий поддержки, работает, но я абсолютно уверен, что это может быть сделано безопасным. Я помню что-то об определении API, который может использовать сценарий, прежде чем это будет выполнено.

Если это верно, затем примером, который Вы могли показать, будет некоторое приложение толстого клиента (например, аудиоплеер), где пользователи могут записать свои собственные сценарии с API, Вы обеспечиваете их в Groovy, который позволяет им писать сценарий своего приложения интересными и безопасными способами (например, создающий пользовательские столбцы в плей-листе)

8
ответ дан 3 December 2019 в 05:14
поделиться

Я пошел бы для:

  1. Закрытия
  2. Утиный ввод
  3. Разработчики (разработчик XML и slurper)
  4. GStrings
  5. Grails
8
ответ дан 3 December 2019 в 05:14
поделиться

Я упомянул бы следующие вещи в дополнение к тому, что было уже указано:

  • GDK - расширения/дополнения существующих классов JDK
  • Взаимодействие между Groovy и кодом Java (в основном надуманный вопрос)
  • Компиляция Groovy кодирует к Java .class файлы
  • Парсинг XML и механизмы для доступа к содержанию документа

Одна вещь, которую мне нравится делать с Groovy, реализует интерфейс, определенный в Java как карта от имен методов до закрытий. Это - прохладная вещь, которую можно сделать с Groovy, но вероятно далеко за пределами вводной презентации все же.

3
ответ дан 3 December 2019 в 05:14
поделиться

Включайте пример того, как создание Java кодировать более отличный устраняет так много кода. Ожидайте их для собирания их челюстей от пола перед продолжением. У Scott Davis есть простой пример в начале Рецептов Groovy, который проводит 35 строк Java или 3 строки Groovy.

2
ответ дан 3 December 2019 в 05:14
поделиться

Необходимо определенно показать им, как создать быстрое приложение Grails. Два доменных класса, которые связаны. Создайте основное Приложение типа CRUD. Объясните, что таблицы составляются негласно с помощью GORM (В спящем режиме). Затем объясните, что можно создать военный файл и развернуть его, поскольку Вы были бы любой другой военный файл Java. Можно также добавить Grails/Groovy к существующему проекту Java/JSP, таким образом, он не требует огромного обязательства или изменения парадигмы.

Groovy/Grails является просто Ruby/направляющие для людей Java. Я покрыл бы плагины для Netbeans/Eclipse также. Groovy/Grails сейчас получает полную поддержку в главном IDE.

Наконец, если можно найти хорошую схему, которая показывает, как Grails создается сверху Spring, Будьте в спящем режиме, Кварц, Sitemesh и Groovy, я думаю, что люди поймут, что существует сокровищница, ожидающая, чтобы быть разблокированной.

1
ответ дан 3 December 2019 в 05:14
поделиться

[Больше комментария, чем ответ] Les, Хорошо сделанный на презентации Groovy. Прохождение через него напомнило мне о дюжине функций Groovy, что я забыл о. (Я довольно хорош в Groovy, но это настолько богато с функциями...), я собираюсь использовать Ваши слайды презентации как карты флэш-памяти, пока я не изучаю все это.Спасибо.

0
ответ дан 3 December 2019 в 05:14
поделиться

вот недавняя презентация отличных и чаш Грааля, который кажется представительным: http://jshingler.blogspot.com/2009/01/codemash-2009-groovy-and-grails.html

0
ответ дан 3 December 2019 в 05:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: