Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2013, 21:24   #1
updaite
Пользователь
 
Регистрация: 11.01.2013
Сообщений: 40
Радость Консоль

Программа выводить текст с консоли в Memo, но только после завершения консольного приложения.
Как сделать вывод в реальном времени?

Код:
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
#define READ_BUFFER_SIZE 1024
String AppName = "E:\\1.exe"; //Консольный Hello World
SECURITY_ATTRIBUTES Security;
HANDLE ReadPipe, WritePipe;
STARTUPINFO Start;
TProcessInformation ProcessInfo;
char *Buffer, Data;
DWORD BytesRead, Apprunning;
int Result, DataSize;
 
Security.nLength = sizeof(TSecurityAttributes);
Security.bInheritHandle = true;
Security.lpSecurityDescriptor = NULL;
 
if (CreatePipe(&ReadPipe, &WritePipe, &Security, 0))
  {
  Buffer = new char[READ_BUFFER_SIZE + 1];
 
  memset(&Start, 0, sizeof(Start));
  Start.cb = sizeof(Start) ;
  Start.hStdOutput = WritePipe;
  Start.hStdInput = ReadPipe;
  Start.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
  Start.wShowWindow = SW_HIDE;
 
  if (CreateProcess(NULL, AppName.c_str(), &Security, &Security, true, NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, NULL, NULL, &Start, &ProcessInfo))
    {
    do
      {
      Apprunning = WaitForSingleObject(ProcessInfo.hProcess, 100);
      Application->ProcessMessages();
      // вычитываем данные работающей консоли
      do
        {
        Result = PeekNamedPipe(ReadPipe, NULL, 0, NULL, (LPDWORD) &DataSize, NULL);
        if ((Result) && (DataSize))
          {
          if (DataSize > READ_BUFFER_SIZE) DataSize = READ_BUFFER_SIZE;
          ReadFile(ReadPipe, Buffer, DataSize, &BytesRead, NULL);
          Buffer[BytesRead] = 0;
          OemToAnsi(Buffer, Buffer);
          Memo->Text = Memo->Text + (AnsiString) Buffer;
          }
        }
      while ((Result) && (DataSize));
      }
    while (Apprunning == WAIT_TIMEOUT);
    }
 
  delete [] Buffer;
 
  CloseHandle(ProcessInfo.hProcess);
  CloseHandle(ProcessInfo.hThread);
  CloseHandle(ReadPipe);
  CloseHandle(WritePipe);
  }
}
updaite вне форума Ответить с цитированием
Старый 08.08.2013, 16:33   #2
updaite
Пользователь
 
Регистрация: 11.01.2013
Сообщений: 40
По умолчанию

вверх........
updaite вне форума Ответить с цитированием
Старый 09.08.2013, 15:15   #3
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Вот склепал пример работы с анонимным каналом.
Вложения
Тип файла: zip src_pipe.zip (20.9 Кб, 11 просмотров)
Nuklon вне форума Ответить с цитированием
Старый 09.08.2013, 17:30   #4
updaite
Пользователь
 
Регистрация: 11.01.2013
Сообщений: 40
По умолчанию

Спасибо, но это не совсем то что мне нужно, на форме кнопка и memo, есть сторонние приложение оно консольное, мне нужно по кнопке запустить консольное приложение и вести лог, в мемо. Мой код в первом посте работает, но только после завершения приложения, нельзя ли сделать его в реальном времени? или с небольшой задержкой.
updaite вне форума Ответить с цитированием
Старый 09.08.2013, 17:35   #5
updaite
Пользователь
 
Регистрация: 11.01.2013
Сообщений: 40
По умолчанию

Грубо говоря нужна оболочка, консольного приложения.
updaite вне форума Ответить с цитированием
Старый 09.08.2013, 18:28   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

В вашем первом примере что-то не совсем понятно - вы создаете pipe, два дескриптора, и потом передаете их *оба* созданному процессу. Это ведь вроде два конца одной трубы, получается, что процесс сам с собой разговаривает, разве нет?
waleri вне форума Ответить с цитированием
Старый 09.08.2013, 18:30   #7
updaite
Пользователь
 
Регистрация: 11.01.2013
Сообщений: 40
По умолчанию

Пример из интернета, вы можете показать как сделать правильное?
updaite вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Консоль iopklm Помощь студентам 0 28.04.2013 21:51
Консоль madmaniac Общие вопросы C/C++ 2 30.10.2011 11:24
C# Консоль. Gray_Jagger C# (си шарп) 6 29.10.2011 14:26
консоль Volkogriz Общие вопросы Delphi 2 23.03.2011 09:28
Консоль Voliume Общие вопросы C/C++ 2 12.02.2010 19:48