From: C. <dig...@us...> - 2000-11-20 21:42:41
|
Eae pessoal, tudo jóia ??? Pessoal, nesse fim de semana dei uma adiantada boa nos trecos do LinuxCall... a coisa ainda tá feia pro meu lado aki, mas já deu prá implementar um monte de coisa... :) Estou mandando uns screens dessa interface em gtk procês verem como tá ficando e poderem opinar... ;-) O BETA da interafce em gtk está quase lá... as telas já estão prontas, e agora estou trabalhando na interligação com os scripts (muda completamente a maneira, em relação à interface em XSTEP.) Gostaria, inclusive, de uma opinião dos coders... ;-) Coders, em aplicativos gráficos, não é possível a utilização de loops infinitos, whiles demorados, etc. Pq o toolkit precisa estar o tempo todo no controle, para que possa redesenhar a janela na tela, interagir com o window manager, etc... Quando abrimos o pipe que interliga os scripts (popen(comando...)) precisamos ler as saídas dele ... fgets(....)... o problema, é que esse loop de leitura pára o toolkit... Com a ajuda do Marcelo Samsoniuk (autor da xstep), consegui implementar isso na interface XSTEP da seguinte forma: Criei um rotina que recebe os dados do pipe (com o fgets, tal) e associei-a ao evento broadcast da xstep. Esse evento broadcast, seria o evento de redesenho da tela. Setando animate=1 no programa, o toolkit gera esses eventos permanentemente... Ou seja, fiz com que o toolkit chamasse de tempos em tempos (coisa de milissegundos) a func que recebe as saídas do pipe. Preciso implementar a mesma coisa no GTK, mas ele não possui o broadcast como o da Xstep... :) Pensei em usar threads, mas adicionaríamos uma complexidade enorme para algo simples... Olhando alguns programas feitos em GTK que trabalham em tempo real, observei que eles fazem o seguinte: Através da função gtk_timeout_add, eles especificam uma determinada função para que seja executada de tempos em tempos (se não me engano, uma vez por segundo)... Bem, essa seria a solução, mas ao implementar a seguinte rotina, tenho obtido seguidos "SegFaults".... com broken pipes.... static void dial_to_isp(GtkWidget *widget, gpointer data) { pipe_ptr = popen(comando, "r"); if (!pipe_ptr) g_print("Problemas com o pipe de discagem!!!\n"); else { zera_buffers(); /* Limpa os labels */ g_print("Labels limpos...\n"); gtk_widget_show(fix_disca); /* Modifica a janela */ g_print("Tela de discagem exibida...\n"); tmp_timer = gtk_timeout_add(T_MAX, get_messages, janela_principal); g_print("Timer ativado...\n"); } } Ok. Na timeout_add, eu passo como parâmetros: T_MAX ... definido no começo do arkivo com o valor 100000 ... trata-se do número de vezes que o timeout irá rodar... chutei alto ??? :P get_messages ... função que recebe a saída do pipe e manda prá tela (nos labels)... janela_principal ... widget ao qual o timeout está associado... se destruirmos ela, o timeout vai junto (pelo que eu entendi... ;-))) Ok. Pessoal, alguém aí poderia me ajudar ??? ;-) Ah! ... depois que o pipe encerra (o script termina), devemos remover o timer, com a função gtk_timeout_remove (timer)... É isso ae coders, falta muito pouco prá que o BETA gtk esteja tão funcional quanto o feito em XSTEP... :) vamos lá, não desanimem... []'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 ] +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+ |