Jump to content


Photo

Setinterval() Ele Ou Tem Outra FunçãO?


  • Faça o login para participar
24 replies to this topic

#1 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 16/01/2010, 10:33

Galera, bom dia ! :D

Estou desenvolvendo aqui na empresa onde trabalho um CHAT interno que ta muito parecido com o MSN. já ta funcionando quase tudo menos a parte de quando usuário X envia uma mensagem para outro usuário Y e o mesmo está com a janela de conversação fechada, fazendo ela abri-la para iniciar a conversa. mas isso e de menos =)

bom meu problema mesmo é com a função setInterval(); eu estou utilizando a mesma com um tempo MENOR que 1000(1s) pra checar se o usuário está digitando, se teve alteração de avatar(fotinhu XD) e se tem nova msg. até ai tá funcionado de boa. porém, o que eu percebo e que o Internet Explorer começa a consumir memória e processamento, e o APACHE começa a ficar sobrecarregado (MB). ou seja se o usuário deixar mais de 5min a janela de conversa aberta o APACHE começa a dar erro e o IE nem se fala :wacko: .

Assim, gostaria de saber como usar corretamente esta função pra este tipo de "sisteminha" que estou usando ou tenho que usar no meu caso o IFRAME =/ (Quero evitar de usar o IFRAME pq acho feio :assobio:, já consegui montar tudo sem ele, só usando DIV ^^' só que DIV editável que não seja o IE, não funciona a função execCommand pra ter um editor wysiwyg <_< )

Obrigado,

T+
-----------------------------------------------------------------------
PALMEIRAS - Primeiro campeão do mundo em 1951

#2 Thiago Retondar

Thiago Retondar

    Turista

  • Usuários
  • 30 posts
  • Sexo:Masculino
  • Localidade:São Paulo

Posted 16/01/2010, 12:17

Como é que está feito?

Faça assim:

// Se for criar a função na hora

setInterval(function(){
	// Sua funçao aqui	
}, 1000);

// Ou se a função já estiver definida e não possui parâmetros

setInterval(suaFuncao, 1000);

// Ou se a funçao ja estiver definida mas precisa de parâmetros

setInterval(function(){
	suaFuncao(param1, param2, param3);
}, 1000);
Veja que se você está construindo sua função dinamicamente - com o objeto Function (new Function()), o que eu acho improvável - vai ficar lento mesmo, pois ele é compilado todas as vezes é chamado.

;)

Edição feita por: Thiago Retondar, 16/01/2010, 12:20.

<!--
Blog OGordo: http://ogordo.com //Eu só escrevo aí, mas não sou gordo. :P
Twitter: @thiagoretondar
-->

#3 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 16/01/2010, 15:18

Obrigado por responder Thiago....

Então, pior que não velho. segue um exemplo:

function FUNCAO_TESTE() {
 
  setInterval(function() {

   var http = getHTTPObject();

   var URL = '.....';

   http.open("GET",  noCache(URL), true);
   http.onreadystatechange = function() {
    if (http.readyState == 4)
      alert('OI');
   };

   http.send(null);
  }, 100);

 }

Como você pode ver, estou executando a função setInterval e dentro dela estou usando AJAX, pra resgatar/gravar/atualizar dados em meu banco de dados. porém, com um tempo menor que 1s.

Agora um detalhe, utilizo 3 dessa função ao mesmo tempo, com tempos diferentes, pois cada uma faz um tipo de ação ou tratamento de dados =/ será esse meu erro?

Obrigado,
-----------------------------------------------------------------------
PALMEIRAS - Primeiro campeão do mundo em 1951

#4 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

  • Ex-Admins
  • 1079 posts
  • Sexo:Masculino
  • Localidade:Brasil - São Paulo

Posted 16/01/2010, 21:36

vc precisa matar a função quando não usar mais, se não vc vai ter varias instancia do set interval rodando ao mesmo tempo, se vc executar essa função duas vezes, vc vai ter dois setInterval rodando, tem que usar o window.clearInterval

#5 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 17/01/2010, 11:14

Muito obrigado, por responder Édipo Costa Rebouças já adicionei aqui em meu código esta função e já fiz alguns testes porém com apenas 2 usuários e os processamentos e memória do IE do serviço do APACHE não subiareram =)

Amanhã estarei testando com mais de 5 usuários e deixando por mais tempo a janela aberta pra ver se da algum tipo de erro!

PS: com isso já estou quase finalizando este sisteminha tipo MSN... só falta criar area administrativa e botar pra funcionar. o resto já fiz tudo... ^^'

Obrigado, e tenham um ótimo domingo.

mais um coisa que já ia esquecendo :assobio:

você conhece a função document.execCommand ?

se sim, como posso fazer pra quando eu inserir uma imagem, não ficar selecionada e também não deixar o usuário redimensionar a mesma no campo que digita a msg?


PS: uê kd o botão editar do fórum?
-----------------------------------------------------------------------
PALMEIRAS - Primeiro campeão do mundo em 1951

#6 Thiago Retondar

Thiago Retondar

    Turista

  • Usuários
  • 30 posts
  • Sexo:Masculino
  • Localidade:São Paulo

Posted 17/01/2010, 16:34

Posta aí a solução usando o clearInterval. ^_^

Sobre o método document.execCommand eu não conheço não, mas acho que já o vi sendo usado naquele editores feitos em JavaScript.

;)

Edição feita por: Thiago Retondar, 17/01/2010, 16:36.

<!--
Blog OGordo: http://ogordo.com //Eu só escrevo aí, mas não sou gordo. :P
Twitter: @thiagoretondar
-->

#7 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 17/01/2010, 21:12

Posta aí a solução usando o clearInterval. ^_^

Sobre o método document.execCommand eu não conheço não, mas acho que já o vi sendo usado naquele editores feitos em JavaScript.

;)



então do clearInterval eu fiz como o Édipo Costa Rebouças falou, deixando a função dentro da função setInterval();

o processamento e a memória tbm.. agora quero ver se apartir de 2 usuário como fica o serviço do APACHE, se terei que deixa-la em outro local ou chama-la depois ^^'


sobre a função document.execCommand, isso mesmo estou usando para criar um editor de texto wysiwyg ^^'.

mas obrigado por responder.

T+
-----------------------------------------------------------------------
PALMEIRAS - Primeiro campeão do mundo em 1951

#8 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

  • Ex-Admins
  • 1079 posts
  • Sexo:Masculino
  • Localidade:Brasil - São Paulo

Posted 18/01/2010, 09:03

esse função é só do Internet Explorer.

#9 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 18/01/2010, 12:49

Uhhh =/ e pro firefox tem alguma solução do tipo?

você conhece a função execCommand? se sim, você sabe como posso fazer para bloqueiar quando o usuário adicionar uma imagem por esta função, não deixar selecionada e nem se quer deixar o usuário redimensionar a mesma?

Obrigado,
-----------------------------------------------------------------------
PALMEIRAS - Primeiro campeão do mundo em 1951

#10 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 26/01/2010, 20:58

E pensei que tinha resolvido mas errei feio Posted Image

Consegui ajustar o código para não comer tanto processamento e tanta memoria... porém ao usar essa função setInterval() a quantidade de memória que o navegador usa a cada X tempo definido na função só vai aumentando a cada requisição de AJAX... ou seja se ficar mais de 5min já tenho quase que 100MB usado pelo navegador e vai aumentando o uso de memória...

Tem ou existe alguma maneira de contornar este problema? para a cada Xs definido na função não aumente a memória usada pelo navegador ou limpe a cada finalização de requisição?

Preciso que essa função fique verificando o banco de dados a cada 1 ou 2s pra ver se tem nova atualização, se tiver exibe os dados novos se não continua checando e o navegador fica com a memoria instável... Posted Image

Edição feita por: Goku Jr, 26/01/2010, 21:10.

-----------------------------------------------------------------------
PALMEIRAS - Primeiro campeão do mundo em 1951

#11 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

  • Ex-Admins
  • 1079 posts
  • Sexo:Masculino
  • Localidade:Brasil - São Paulo

Posted 27/01/2010, 02:19

Goku, se esta usando muito memoria, provavelmente vc esta usando de maneira incorreta a função, poste o código de como vc esta chamando, no caso dó códido de cima, o setTimeinterval esta configurado para cada centesimo de segundo, um segundo é "1000"milisegundos e não "100"milisegundos

#12 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 27/01/2010, 06:47

sobre o milisegundos eu sei ^^'

segue o código:

function dphpVIEWUsers ( idUSER, objVLD1, objVLD2, objVLD3, objVLD4 ) {

  var httpVIEWUsers = getHTTPObject();
  
  var URL = 'funcoes.php?dphpVIEWUsers=' + objVLD1 + '&idUSER=' + idUSER;

  setInterval(function() {
  
   httpVIEWUsers.open("GET",  noCache(URL), true);
   
   httpVIEWUsers.onreadystatechange = function() {
	if (httpVIEWUsers.readyState == 4)
 	document.getElementById('dphpMEIO').innerHTML = httpVIEWUsers.responseText;
   };

   dphpVIEWSTSuser( objVLD3, idUSER ); // VERIFICA SE O USUÁRIO ENTROU OU nÃO SE SIM EXIBE POP-UP função em AJAX
   dphpVIEWMsgNEW ( objVLD2, idUSER );  // VERIFICA SE TEM NOVAS MSG's.. se SIM ABRE POP-UP DE CHAT
   dphpVIEWImg ( objVLD4, idUSER, false, 'dphpVIMG', false, false, false ); // se eu estiver na tela de chat e mudar popup muda a img da janela pai
   
   httpVIEWUsers.send(null);
   window.clearInterval(); // PERCEBI Q TIRANDO OU NÃO ESTA LINHA DA NA MESMA ¬¬
  }, 2000);

 }




-----------------------------------------------------------------------
PALMEIRAS - Primeiro campeão do mundo em 1951

#13 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

  • Ex-Admins
  • 1079 posts
  • Sexo:Masculino
  • Localidade:Brasil - São Paulo

Posted 27/01/2010, 11:50

Então Goku, é que você esta usando a função errado mesmo.

basicao:

window.setInterval(funcao, tempo_mili);

essa função vai ser executada a cada "tempo_mili",

se vc tem uma função que chama um setInterval e a chama duas vezes, você vai ter dois setInterval rodando.

a cada vez que você chamar a função vai ter mais um setInterval rodando

então a maneira correta de se trabalhar com o setInterval é pegando o id dele

var id_interval = window.setInterval(funcao, tempo_mili);

e matando quando vc não precisar mais dele

window.clearInterval(id_interval)


no seu caso eu creio que você só precise chamar as funções do interval uma vez, e mudar as o valor das variaves que ele esta consultando

Exe:
var user_id = '12235'; var my_interval_id = window.setInterval(function(){ alert(user_id); },2000);

se durante a execução você mudar o valor da variavel user_id, a função que esta no window.setInterval vai trabalhar com o valor modificado da variavel.

Edição feita por: Édipo Costa Rebouças, 27/01/2010, 11:53.


#14 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 27/01/2010, 13:56

Édipo Costa Rebouças, ajustei meu código aqui para ter somente um setInterval(); e ajustei quase igual o exemplo que você colocou porém, o que eu percebi e que a cada requisição do AJAX onde tem o processamento do PHP com o MySQL o navegador IE acaba alocando memória e só vai somando nunca libera Posted Image

ou seja no meu caso como eu uso um CHAT - MSN XD poderá ficar + de 5hrs aberta e se ficar alocando memória vai explodir tudo aqui Posted Image

Obrigado,
-----------------------------------------------------------------------
PALMEIRAS - Primeiro campeão do mundo em 1951

#15 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

  • Ex-Admins
  • 1079 posts
  • Sexo:Masculino
  • Localidade:Brasil - São Paulo

Posted 27/01/2010, 17:33

você pode postar o novo código?
qualquer coisa se esse for o caso, vc mata o setInterval e chama outro pra liberar memoria.

Edição feita por: Édipo Costa Rebouças, 27/01/2010, 17:39.
nova info add





2 user(s) are reading this topic

0 membro(s), 2 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq