Eae coders, tudo jóia ?
Pessoal, tou com um pequeno probleminha aki na implementação das
interfaces...
Após o popen(), quando vamos receber do pipe as informações que vêm do
script, usamos a rotina fgets, assim:
fgets (buffer, 64, pipe_fd);
Só que nisso aí tem um bug!!!
Em programas gráficos, conforme expliquei num mail anterior, o toolkit
precisa estar o tempo todo no controle. Quando rodamos o fgets, ele pára
momentaneamente a execução do programa, e fica aguardando um EOF ou um
\n para retornar... e isso é mau, muito mau ... :)
O fgets só retorna quando encontra um EOF ou um \n ... sendo assim, as
informações que vêm do script ficam bufferizadas e não vão prá tela,
além de "travar" o programa (o usuário fica impossibilitado de clicar em
outra coisa (o botão de cancelar, por exemplo)).
Bom, então tentei usar o fscanf ... a vantagem é que o fscanf retorna
imediatamente, não fica parado esperando um EOF ou \n ... mas, ele só
pega um palavra por vez (geralmente) ... assim a seguinte rotina:
fscanf (pipe_fd, "%s" buffer);
Vai retornando uma palavra por vez, o que faz com que o usuário não
entenda porcaria nenhuma:
Para
Cancelar
a
discagem
Tecle
Ctrl
C
E por aí vai ... se é que me entendem ... :)
Poderíamos usar o fscanf assim:
fscanf (pipe_fd, "%s[^\n]", buffer);
Mas isso simplesmente tornaria o fscanf igual a um fgets ...
Tentei tb usar umas rotinas malucas e ir "montando" a linha de saída ...
infelizmente não funcionou (até agora não sei porque) ...
fscanf (pipe_fd, "%s", buffer);
if (strchr (buffer, '\n')) {
strcat (temp, buffer);
mostra_msg (temp);
}
else {
strcat (temp, buffer);
strcat (temp, " ");
}
A idéia é a seguinte: vai pegando palavra por palavra, até o fim da
linha, quando, então, seria exibida na tela...
Aparentemente o fscanf remove o caracter de nova linha '\n' da string,
pq sempre cai no else ... se vcs puderem me dizer onde que tá o bug ae
... :P
Coders, já tentei um monte de coisa por aki, e até agora não encontrei
solução pro caso ... se vcs tiverem com a "cuca" mais fria e souberem a
solução, agradeceria se me indicassem ;-)
[]'s
--
André Casteliano
Analista de Sistemas
+-=-=[ dig...@us...]=-=-+
[ Linux User: # 178853 Machine: # 79923 ]
[ Linux Heavy User - Powered by Slackware 7.1 ]
[ http://www.geocities.com/andre_casteliano/ ]
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
[ LinuxCall - The Linux Dialer ]
[ http://linuxcall.sourceforge.net ]
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
|