Перехват консольного вывода (Linux)

Вопросы программирования и использования MSEide + MSEgui.

Модератор: Модераторы

Перехват консольного вывода (Linux)

Сообщение coyot.rush » 20.01.2010 16:56:43

Итак имеем следуюший код, взят из Delphi Russian Knowledge Base (Kylix)
Код: Выделить всё
procedure tmainfo.get_c(const sender: TObject);
var
g_c:TgetConsoleTh;
begin
g_c:=TgetConsoleTh.create('/usr/bin/top');
end;

и собственно поток для обработки(прототип)
Код: Выделить всё
unit getconsole_th;
{$ifdef FPC}{$mode objfpc}{$h+}{$endif}//{$apptype console}
interface
uses
classes,msewidgets;
type
TgetConsoleTh=class(Tthread)
cur_data:string;
constructor create(run:string);

procedure dummy;

private
sh_line:string;
protected

procedure execute;override;

end;
//const

implementation
uses sysutils,libc,main;
//const

constructor TgetConsoleTh.create(run:string);
begin
inherited Create(False);
sh_line:=run;
//insert some code
end;

procedure TgetConsoleTh.dummy;
begin

end;

procedure TgetConsoleTh.execute;
var
CmdLine: string;
Output: PIOFile;
Buffer: PChar;
TempString: string;
Line_: string;
BytesRead: Integer;
Cmd_Result__:string;
const
BufferSize: Integer = 1000;
begin
showmessage('Run '+sh_line); 

Output := popen(PChar(sh_line), 'r');
GetMem(Buffer, BufferSize);
if Assigned(Output) then
try
   while feof(Output) = 0 do
   begin
     BytesRead := Libc.fread(Buffer, 1, BufferSize, Output);
     SetLength(TempString, Length(TempString)+BytesRead);
     memcpy(@TempString[length(TempString)-(BytesRead-1)], Buffer, BytesRead);
     
     showmessage('tempstr '+TempString);
     
     while Pos(#10, TempString) > 0 do
     begin 
       Line_ := Copy(TempString, 1, Pos(#10, TempString)-1);
       cur_data:=line_;
       if line_<>'' then   Cmd_Result__:= Cmd_Result__+Line_+#13;
       TempString := copy(TempString, Pos(#10, TempString)+1, Length(TempString));
     end;
     showmessage('curdata '+cur_data); 
   end;
finally
   Libc.pclose(output);
   wait(nil);
   FreeMem(Buffer,BufferSize);
end;
end;

end.


Итак если вызвать /usr/bin/free то увидим результат выполнения команды, но если вызвать top код работает только в MSE, или если запустить из терминала gnome (gnome-terminal).

Почему так происходит? Как правильно перехватить данные?
PS опция {$apptype console} не влияет на результат.(showmessage для отладки вне MSE)
PSS. хочу напистать свой вронтэнд для wget и arai2c.
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: Перехват консольного вывода (Linux)

Сообщение serg_iv » 20.01.2010 18:40:49

А вам не TProcess нужен?
Тут пример использования:
viewtopic.php?f=1&t=2311&st=0&sk=t&sd=a&start=15
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Re: Перехват консольного вывода (Linux)

Сообщение coyot.rush » 20.01.2010 19:43:36

Пробывал так, еще хуже. Совсем с top не работает. С free все нормально :?:
Код: Выделить всё
procedure tmainfo.get_c(const sender: TObject);
var
Const
  TheProgram = '/usr/bin/top';
Var
  S : TProcess;
    Buf, ss : ansistring;
    Count : longint;
begin
  S:=TProcess.Create(Nil);
  S.Commandline:=theprogram;
  S.Options:=[poUsePipes,poNoConsole];
  S.execute;
  SetLength(buf, 1000);
  Repeat
    Count:=s.output.read(buf[1], length(buf));
    ss:=ss + Copy(buf, 1, Count);
    showmessage(ss);
  until Count=0;
  writeln(ss);
  S.Free;
  writeln('finished Ok.');
end;


Есть идеи? Target Console в MSE нормально работает. :idea:

Добавлено спустя 1 час 58 минут 29 секунд:
Не дочитал коментарии к Drkb :?
Примечание - под отладчиком Kylix код может не работать. Надо запускать приложение не под Kylix для того чтобы удостовериться что код работает. Кроме того некоторые консольные приложения, типа top не совсем стандартно используют консоль, поэтому я наблюдала такое явление, что top можно запустить только если запускать готовое приложение в терминале.

Автор: Vit

Код писла девушка :o

Добавлено спустя 13 часов 56 минут 19 секунд:
немного подумав решил изучить xterm через strace
вот интересные момены
Код: Выделить всё
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
open("/proc/meminfo", O_RDONLY)         = 3
fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb8006000
read(3, "MemTotal:        1026552 kBnMemFr"..., 1024) = 1024
close(3)                                = 0
munmap(0xb8006000, 4096)                = 0
socket(PF_FILE, SOCK_STREAM, 0)         = 3
connect(3, {sa_family=AF_FILE, path=@"/tmp/.X11-unix/X0"...}, 20) = 0
getpeername(3, {sa_family=AF_FILE, path=@"/tmp/.X11-unix/X0"...}, [20]) = 0
uname({sys="Linux", node="localhost.localdomain", ...}) = 0

ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
stat64("/etc/terminfo", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
access("/etc/terminfo/x/xterm", R_OK)   = -1 ENOENT (No such file or directory)
stat64("/usr/share/terminfo", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
access("/usr/share/terminfo/x/xterm", R_OK) = 0
open("/usr/share/terminfo/x/xterm", O_RDONLY|O_LARGEFILE) = 6
read(6, "32\0010\0&\017\02351l5xterm|xterm terminal "..., 4097) = 3258

ioctl(5, TCFLSH, 0x1)                   = 0
chown32("/dev/pts/1", 0, 0)             = -1 EPERM (Operation not permitted)
chmod("/dev/pts/1", 0666)               = 0
close(5)                                = 0

видно что используються сокетты.
PIOFile-эт пайп?
Видимо все нужно делать через пайпы. Но как?

Добавлено спустя 8 минут 59 секунд:
Читаю про сокеты http://www.prog-gate.pp.ru/fido7.ru.free.pascal/417.html
Но там только как оргазовывать интернет соединение.
Может быть написать свой wget :D
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: Перехват консольного вывода (Linux)

Сообщение v-t-l » 22.01.2010 12:55:50

coyot.rush писал(а):PSS. хочу напистать свой вронтэнд для wget и arai2c.

wget: http://adenochrome.sourceforge.net/
aria2: лучше бы использовать XML-RPC.
v-t-l
энтузиаст
 
Сообщения: 727
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Перехват консольного вывода (Linux)

Сообщение coyot.rush » 22.01.2010 16:23:33

Спасибо что откликнулись v-t-l :D
Смотрел
мягко говоря тянет на 3 с минусом. Автор явно не слышал о потоках :shock:

aria2: лучше бы использовать XML-RPC.

Стандарт M$, мне он в Linux даром не нужен. Как минимум потянет сторонние библиотеки. Есть совои мехонизмы взаимодействия между программами

Нашел TMSEProcess (после раскопок Target Console :) ) , но как им пользоваться немного не понятно. Может кто даст пример
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: Перехват консольного вывода (Linux)

Сообщение v-t-l » 23.01.2010 13:15:30

coyot.rush писал(а):Стандарт M$, мне он в Linux даром не нужен. Как минимум потянет сторонние библиотеки. Есть совои мехонизмы взаимодействия между программами

http://aria2.sourceforge.net/ писал(а): aria2 has built-in XML-RPC interface. You can manipulate aria2 via XML-RPC interface. aria2 runs on Linux, FreeBSD, Mac OS X and Windows.

http://ru.wikipedia.org/wiki/XML-RPC
v-t-l
энтузиаст
 
Сообщения: 727
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Перехват консольного вывода (Linux)

Сообщение debi12345 » 24.01.2010 04:33:43

Лучше у Мартина спросить - в ньюс-конференции "public.mseide-msegui.talk" на "news://news.grid-sky.com", или через веб-интерфейс на сайте "msegui.org".
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Перехват консольного вывода (Linux)

Сообщение coyot.rush » 24.01.2010 14:27:14

v-t-l
aria2 has built-in XML-RPC interface. You can manipulate aria2 via XML-RPC interface. aria2 runs on Linux, FreeBSD, Mac OS X and Windows.

Сначала атор написал качлку с гуи, потом выкинул, затем прикрутил XML-RPC. Через год еще что нибуть :( Перехват консольного вывода стандарт для большинство Linix фронтэндов, имхо. Извиняюсь за офтопик aria2 можно упровлять через браузер. Везде примеры (русские) только как использовать в консоле.

Текст сообщения I'm written front-end for wget and aria2c. Please help, so uses TMSEProcess for getting console output. Need sample. Sorry for my English. My native language Russian

debi12345 что за каптча стоит на сайте msegui.org немогу понять. Что за слово... :? перестановка букв. Ника не зарегистрируюсь. :(

Добавлено спустя 2 часа 39 минут 31 секунду:
Зарегистрировался http://msegui.org/fudforum
Пишет
The administrator had chosen to review all accounts manually prior to activation. Until your account has been validated by the administrator you will not be able to utilize the full capabilities of your account.
Ждем :P
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: Перехват консольного вывода (Linux)

Сообщение wavebvg » 24.01.2010 17:38:11

Лично мой вывод закончился сообщением
GLib-WARNING **: g_main_context_prepare(): main loop already active in another thread

Может кто знает, как с этим бороться
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

Re: Перехват консольного вывода (Linux)

Сообщение debi12345 » 25.01.2010 01:36:18

Текст сообщения I'm written front-end for wget and aria2c. Please help, so uses TMSEProcess for getting console output. Need sample. Sorry for my English. My native language Russian

Точнее будет нечто вроде:

I'm writting a front-end for wget anf arai2c. Please help me to adopt TMSEProcess for managing their console I/O. A sample is needed.

debi12345 что за каптча стоит на сайте msegui.org немогу понять. Что за слово... :? перестановка букв. Ника не зарегистрируюсь. :(

Проще через ньюс-конференцию :) Проще всего настройть клиента из состава SeaMonkey.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Перехват консольного вывода (Linux)

Сообщение coyot.rush » 26.01.2010 15:32:49

wavebvg писал(а):Лично мой вывод закончился сообщением
GLib-WARNING **: g_main_context_prepare(): main loop already active in another thread

Может кто знает, как с этим бороться


Что за дистрибутив Linux,версия fpc, MSE. Скорее всего либо очень старая версия libc, либо эт бубунту (разработчики обещали сделать свой libc :o ). Код теститровался на Mandriva 2009.1+fpc 2.4.0+MSE2.2(stable).
Хотя пример еще времен кайликса :)
Кстати код потока я вынес в отдельный модуль.

debi12345
Все вопрос задал :D Жду ответа. об экспирементах отпишусь позже

Добавлено спустя 6 часов 27 минут 3 секунды:
Вот что ответил Мартин
tmseprocess has a pipereader property for output and erroroutput from the
process and a pipewriter for input into the process.
Activate tmseprocess.options pro_output, pro_erroroutput, pro_input in order
to activate the channels. The oninputavailable events of tmseprocess.output
and erroroutput are fired if there is data in the pipe, use them in order
to read the data. Use the procedures of tpipewriter in order to send data
to the process.
PS. There were some changes in tmseprocess so if you want to use the newest
use SVN trunk version.

Martin


Мой перевод :)

tmseprocess имеет два свойства pipereader и pipewriter для ввода и вывода потока данных.
Включить tmseprocess.options pro_output, pro_erroroutput, pro_input для
активирации каналов. Oninputavailable события tmseprocess.output
erroroutput срабатывают, если есть данные идут пайп, используйте их
для чтения данных. процедура tpipewriter для передачи данных
в процесс.
PS. Существовали некоторые изменения в tmseprocess так что если вы хотите использовать новейшую
использование SVN из транка.

Мартин

Буду эксперементировать :D
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48


Вернуться в MSEide + MSEgui

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru