Консольные данные не попадают в Pipe

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Консольные данные не попадают в Pipe

Сообщение CodeName33 » 25.10.2007 (Чт) 8:21

Всем привет. Такой во вопросец:

Делаю кодер/декодер OGG файлов, используемый внутри приложения. Хотелось бы видеть проценты. Пользую код из DOSOutputs:

Код: Выделить всё
'Create the Pipe2
    sa.nLength = Len(sa)
    sa.bInheritHandle = 1&
    sa.lpSecurityDescriptor = 0&
    ret = CreatePipe(hReadPipe, hWritePipe, sa, 0)
   
    If ret = 0 Then
        'If an error occur during the Pipe creation exit
        MsgBox "CreatePipe failed. Error: " & Err.LastDllError, vbCritical
        Exit Function
    End If
   
    'Launch the command line application
    start.cb = Len(start)
    start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
    'set the StdOutput and the StdError output to the same Write Pipe handle
    start.hStdOutput = hWritePipe
    start.hStdError = hWritePipe
    'Execute the command
    ret& = CreateProcessA(0&, mCommand, sa, sa, 1&, _
        IDLE_PRIORITY_CLASS, 0&, 0&, start, proc)
       
    If ret <> 1 Then
        'if the command is not found ....
        MsgBox "File or command not found", vbCritical
        Exit Function
    End If
   
    'Now We can ... must close the hWritePipe
    ret = CloseHandle(hWritePipe)
    mOutputs = ""

   
    'Read the ReadPipe handle
    Do
             
            strBuff = String(256, " ")
            ret = ReadFile(hReadPipe, strBuff, Len(strBuff), lngBytesread, 0&)
           
            mOutputs = mOutputs & Left(strBuff, lngBytesread)
            'Send data to the object via ReceiveOutputs event
            RaiseEvent ReceiveOutputs(Left(strBuff, lngBytesread))
        'End If
    Loop While ret <> 0


Для oggdec - всё ок, и проценты идут. А вот для oggenc всё зависает на ReadFile пока программа не завершится, а потом уже поступают все данные. Через PeekNamedPipe проверил, что в пайпе, действительно ничего нет, до завершения программы, однако если запускать в нормальной консоли - то там всё замечательно и проценты бегут. В чём может быть проблема? Почему я не могу считать данные из пайпа во время её работы?
Программисты не глючат - глючат компиляторы...

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 25.10.2007 (Чт) 12:30

Извиняюсь за топик-ап, но решил добавить пример, в котором наглядно можно увидеть проблему: по кнопке OggDec - всё работает, а по OggEnc - подвисает до завершения. In Console - вызывают это же через Shell и в консоли всё нормально.
Вложения
OggEncDec_PROBLEM.zip
(1.29 МиБ) Скачиваний: 38
Программисты не глючат - глючат компиляторы...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.10.2007 (Чт) 13:26

Посмотри тут:
http://bbs.vbstreets.ru/viewtopic.php?t=24079

Возможно с кодером как раз этот случай.
Lasciate ogni speranza, voi ch'entrate.

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 25.10.2007 (Чт) 13:42

Нет, в теме не нашел ничего интересного. WriteConsoleOutput - там не используется. Специально скачал и скомпилил исходник OggEnc - тоже самое. А проценты выполнения выводятся по-обычному

С++
Код: Выделить всё
fprintf(stderr, _("\t[%5.1f%%] [%2dm%.2ds remaining] %c "),
         done*100.0/total, minutes, seconds, spinner[spinpoint++%4]);


Как видно из кода, просто в StdErr загоняются. Однако, до завершения программы это всё на моём конце пайпа по-прежнему не вылезает... :shock:
Программисты не глючат - глючат компиляторы...

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 25.10.2007 (Чт) 16:39

Кажись сам разобрался. Оказывается СИшные проги, юзающие fprintf имеют свои собственные буферы чтения/записи. И когда я редирекчу StdErr/StdOut - то они это узнают и для увеличения быстродействия кешируют запись и не выводят её сразу в трубу. Лечить это можно только прописав fflush(); после каждой операции записи, а если прога не моя или же просто без исходников - то стреляться/биться головой об стену/рвать волосы на всех месах - сделать ничего нельзя :(

Тему можно закрывать...
Программисты не глючат - глючат компиляторы...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 27

    TopList  
cron