From: C. <dig...@us...> - 2000-12-01 09:40:58
|
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 ] +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+ |