Flex: вывод файла C в режиме реального времени через PHP + Flex? - PullRequest
2 голосов
/ 31 октября 2009

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

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

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

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

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 31 октября 2009

Можете ли вы изменить исходный код программы на C? Причиной такого поведения может быть то, что стандартный вывод в C буферизуется строкой, но только если программа работает в терминале. Он будет буферизовать большие куски, если (он думает, что) стандартный вывод - в файл или канал. Следовательно, ваша 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 голос
/ 03 ноября 2009

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

1 голос
/ 31 октября 2009

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

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

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

...