[Rio-pm] Tk travando, devo usar threads?

Bruno Buss bruno.buss em gmail.com
Sexta Julho 6 09:09:49 PDT 2012


2012/7/6 Aureliano Guedes <guedes_1000 em hotmail.com>

>  Eu modifiquei, o projeto, não entendi como encaixar o AnyEvent (na
> verdade o AnyEvent ainda é muito complexo para mim), então usei threads.
>

> *https://github.com/acpguedes/Chat.git*
>
> Mas ainda está problematico.
>

Percebe-se, pois o modo que você está usando threads não está servindo de
absolutamente nada. Seu programa não está multi-thread em nada...


>
> Eu consigo enviar apenas uma msg, da segunda para frente não é enviada,
> alem disso, quando coloco para receber msg ele recebe de boa mas a
> interface fica travada, nem fechar ela eu consigo.
>

Sobre o update e o fato dele estar travando seu código:

https://github.com/acpguedes/Chat/blob/master/InterfaceSB.pm#L33-34

Logo depois de criar uma thread, você está dando join() nela o que
simplesmente bloqueia a "thread original" da sua interface gráfica enquanto
espera a sua thread recém criada retornar... o que não acontece NUNCA, já
que ele fica preso em um "while(1)" [1] para sempre, já que você nunca seta
$work como zero, nem faz um "last;".

Talvez você tenha tentado contornar isso usando a chamada do update() (que
vem do Tk::Widget), mas talvez ele não esteja pegando nenhuma mensagem
nova, não entra no if nem no elsif e nunca faz esse update e por isso a
interface fica "travada"?

No mais, apenas mais uma questão: Você está em um "loop infinito",
bombardeando o servidor com uma cacetada de requisições com o seu
get_msg... talvez fosse um pouco mais educado colocar um tempo entre uma
requisição e outra, não?






Sobre o envio da 2a mensagem em diante falhar:

Primeiro, assim como no caso acima a sua thread não serve de nada....

Como não conheço o sistema em questão (forum invaders, shoutbox, etc) vou
fazer algumas perguntas:
https://github.com/acpguedes/Chat/blob/master/Shoutbox.pm#L25

1) Esse "SECURITYTOKEN" muda? Se for estático, você poderia pegar ele uma
única vez, talvez logo depois de fazer o login na hora que você faz uma
instância da sua classe? [2]

2) Porque você usa (.*?) ou invés de um simples (.*) no matching?

3) Veja bem que você está assumindo, que toda página contem
esse SECURITYTOKEN, independente do que você fez por último com o seu
$url... infelizmente a maneira como seu código está, não é nem um pouco
"side-effect free", logo acho que você não deveria contar com isso...

Se por algum problema, ele não encontrar nada (eg. nem toda página do forum
tem esse SECURITYTOKEN ou então por algum motivo a última requisição falhou
ou não retornou esse token), o que terá na variável $1 e consequentemente
na sua variável $token?

4) Assim como no caso anterior, você está assumindo que a sua variável $url
sempre terá um "Bem vindo" em algum lugar dela... isso poderia não
acontecer? Talvez você estivesse assumindo isso porque após se logar
aparece algo escrito "Bem-vindo"? Mais especificamente, depois de fazer o
post da 1a mensagem [4], será que o conteúdo de $url ainda contem um
SECURITYTOKEN ou ainda mesmo um "Bem-vindo" em alguma parte do html?




[1] https://github.com/acpguedes/Chat/blob/master/InterfaceSB.pm#L49

[2] https://github.com/acpguedes/Chat/blob/master/Shoutbox.pm#L12-17

[3] https://github.com/acpguedes/Chat/blob/master/Shoutbox.pm#L27

[4] https://github.com/acpguedes/Chat/blob/master/Shoutbox.pm#L29-31

[ ]'s
-- 
Bruno C. Buss
http://www.brunobuss.net
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20120706/849b5b59/attachment.html>


Mais detalhes sobre a lista de discussão Rio-pm