Flex: Вывод файла C в режиме реального времени с помощью PHP+Flex?


У меня есть исполняемый файл на языке Си (с именем myprogram). Когда я запускаю его с помощью ./myprogram, я получаю некоторые инструкции вывода на стандартном выходе моей оболочки Linux.

Я использовал run.php чтобы получить доступ ко всему, что выводится на стандартный вывод:

#run.php
<?php
$output = shell_exec('./myprogram');
echo $output;
?>

Затем я вызвал HTTPService с идентификатором="сервис", чтобы получить доступ к этому run.php файл, и я также установил для атрибута text текстовой области значение {service.lastResult}. Когда я запускаю свое приложение Flex, интерфейс на мгновение останавливается, а затем текстовая область отображает все 20 строк одновременно.

Но если программа запускается из оболочки Linux, они появляются один за другим.

Есть ли способ, с помощью которого я могу отобразить строку, как только она будет выведена на стандартный вывод? Это затем заставит текстовую область отображать выходные данные в режиме реального времени.

Или Flex не может этого сделать? Скорее, как программа PHP может достичь такого эффекта, т.е. показывать все, что печатается на стандартном выводе, одновременно в браузере в режиме реального времени?

Обновление: Давайте сделаем вопрос немного более конкретный и/или простой.

Моя программа выводит 20 строк каждая через несколько микросекунд. Я хочу, чтобы только первая строка стандартного вывода отображалась в текстовой области Flex или в браузере (но в режиме реального времени), в то время как программа может продолжить выполнение программы.

Не выглядит простым: P

 2
Author: Peter Mortensen, 2009-10-31

3 answers

HTTP так не работает. Вы можете смоделировать это с помощью кометы. В Java вы можете использовать BlazeDS для передачи данных с сервера на flash-клиент.

 1
Author: Maciek Sawicki, 2009-11-03 03:00:26

Можете ли вы изменить исходный код программы на языке Си? Причиной такого поведения может быть то, что стандартный вывод в C буферизован по строкам, но только в том случае, если программа выполняется в терминале. Он будет буферизировать большие куски, если (он думает, что) стандартный вывод в файл или канал. Поэтому ваша программа на языке Си, возможно, не отправляет никаких данных до конца. Вы можете добавить вызовы fflush для принудительной печати данных:

#include <unistd.h>
#include <stdio.h>

int main(void) {
    printf("Hi!\n");
    fflush(stdout); /* Add this! */
    sleep(3);
    printf("Ho!\n");    
    return 0;
}
 1
Author: Thomas Padron-McCarthy, 2009-10-31 13:13:10

Я не тестировал его, но вы, возможно, захотите взглянуть на функцию passthru().

Редактировать: Это, вероятно, не будет работать напрямую из-за вашего косвенного обращения через {service.lastResult}. Я не знаком с flex, но я предполагаю, что это будет ждать завершения последнего результата, прежде чем быть уволенным. Поэтому вам придется найти альтернативу, которая позволит вам получить результат вызова службы, пока он все еще обрабатывается - я не знаю, является ли это возможно.

Основной смысл использования passthru() заключается в том, что он будет напрямую отправлять вывод вызванной команды, давая вам, по крайней мере, шанс получить промежуточные результаты. exec(), system() и shell_exec(), с другой стороны, вообще ничего не отправит до завершения, поэтому для начала не может быть обходного пути.

 1
Author: Henrik Opel, 2009-10-31 13:17:39