Оболочка

Тема в разделе "Машинное отделение", создана пользователем Binary, 4 дек 2006.

  1. Mustitz Заслуженный

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    30.09.2006
    Сообщения:
    3.546
    Симпатии:
    1.265
    Репутация:
    36
    Адрес:
    Киев
    Оффлайн
    Ну... эта проблема решается десятью строчками кода :) Когда я добился того, что ввод-вывод происходит более-менее нормально, то такие мелочи меня уже не интересовали :) Тем более, что у меня настраивается разделитель в потоке (это может быть перевод строки или просто пробел).
  2. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    А где зависает?
    Пришли мне весь свой код. Я посмотрю в чем проблема.
  3. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    В пятом посте полностью рабочий код с четыремя Трубами (две к движку, две к GUI),
    с готовой процедурой покомандного чтения.
    Зачем изобретать велосипед?
  4. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    его б еще на си переписал бы кто-нибудь :rolleyes:
  5. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    На Си это пишется точно так-же.
    Сейчас перепишу.
  6. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    вот весь код ... делал в Builder 6 - Форму , Мемо , и кнопку ты и сам создашь :)
    Код:
    //—————————————————————————————————————-
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "baldaGUIx42.h"
    //—————————————————————————————————————-
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    HANDLE  read_handle       = NULL;
    HANDLE  write_handle      = NULL;
    HANDLE  e_read_handle     = NULL;
    HANDLE  e_write_handle    = NULL;
    
    CHAR    ch_buffer[3000];
    //—————————————————————————————————-
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //—————————————————————————————————-
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        STARTUPINFO         sui;
        PROCESS_INFORMATION pi;
        SECURITY_ATTRIBUTES sa ;
    
        DWORD            dw_readed,
                         err = 0;
    
        sa.nLength                  = sizeof(sa);
        sa.lpSecurityDescriptor     = NULL;
        sa.bInheritHandle           = true;
    
        if(OpenDialog1->Execute())
        {
            ZeroMemory(ch_buffer, 6000);
            err = GetLastError();
            Memo1->Lines->Strings[0] = OpenDialog1->FileName;
    
    // Главный баг : если закомментировать один из
    // CreatePipe , то программа работает
    // В противном случае - зависает!
    
            CreatePipe(&e_read_handle, &write_handle, &sa , 3000);
    //ShowMessage(IntToStr(err));
            CreatePipe(&read_handle, &e_write_handle, &sa , 3000);
    //ShowMessage(IntToStr(err));
    
            err = GetLastError();
    
            ZeroMemory(&sui, sizeof(sui));
    
            sui.cb          = sizeof(sui);
            sui.dwFlags     = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
            sui.wShowWindow = SW_HIDE;
    
            sui.hStdOutput  = write_handle;
            sui.hStdError   = write_handle;
            sui.hStdInput   = read_handle;
    
    //ShowMessage("done1");
    //ShowMessage(IntToStr(err));
    
            CreateProcess(0,
                          OpenDialog1->FileName.c_str(),
                          0,
                          0,
                          true,
                          0,
                          0,
                          0,
                          &sui,
                          &pi
                          );
    
            err = GetLastError();
    
            Sleep(250);
     //ShowMessage(IntToStr(err));
    
            ReadFile(e_read_handle, ch_buffer, 300, &dw_readed, 0);   // ЗАВИСАЕТ ЗДЕСЬ
            Memo1->Lines->Strings[1] = ch_buffer;
    
     //ShowMessage("done2");
    
            Sleep(150);
            WriteFile(e_write_handle, "bench", 300, &dw_readed, 0);
    
     //ShowMessage("done3");
            
    
        }
    
    
    }
  7. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Конечно зависает - ReadFile ждет Строку в буфере.
    Чтоб не ждал - нужен PeekNamedPipe()
  8. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    ReadFile returns when one of the following is true: a write operation completes on the write end of the pipe
    Так что ничего не буферизируется, и PeekNamedPipe() не нужен.
  9. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Все у тя работает, только я не понял как запускать без первого параметра.
    Попробуй в качестве консольного приложения любой шахматный движок. Все будет работать.

    Видимо твое тестовое приложение вместо того, чтобы писать в пайп просто буферизирует. Буфер надо очищать! Или отключи буферизацию.
  10. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Если ничего не передавалось в трубу - то ReadFile() ждет передачи.
    Проверяется любым тестом...
  11. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Да. Так это нам и надо.

Поделиться этой страницей