Jump to content


Photo

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


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

#16 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 27/01/2010, 18:44

Segue o código atualizado:

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

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

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

   dphpVIEWSTSuser( objVLD3, idUSER );
   dphpVIEWMsgNEW ( objVLD2, idUSER );
   dphpVIEWImg ( objVLD4, idUSER, false, 'dphpVIMG', false, false, false );
   
   httpVIEWUsers.send(null);
  }, 2000);



 }

Apartir desse código, como posso fazer para executar o setInterval() ou não necessáriamente ele de ínicio, parar e depois automáticamente sem que o usuário clique em algo na página chame a função novamente para poder verificar se houve alteração no banco de dados?

Após a ultima requisição do Ajax coloquei a baixo da linha httpVIEWUsers.send(null); a função clearInterval(); e logo em seguida chamei a função novamente mas ai e como se eu tive-se num loop infinito sem precisar do setInterval() e mesmo assim ainda continua a aumentar a memória do navegador =(

probleminha difícil esse de se resolver...
-----------------------------------------------------------------------
PALMEIRAS - Primeiro campeão do mundo em 1951

#17 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

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

Posted 27/01/2010, 23:07

Goku,
estou anexando a esse post uma classe em javascript que fiz para tentar ajudar no seu problema,

vou postar o código aqui e comentar.

aquivo chat.js
[codebox] var Chat = function(params){
//atributos
var chatIntervalID;
var userID;
var objVLD1;
var objVLD2;
var objVLD3;
var objVLD4;
var delay;
var count_req = 0; //se quiser pode tirar esse atributo

//construtor
this.constructor = function(){
//esse if's não para garantir que os atributos sera colocados como parametro
//caso algum valor não seja atribuido, sera lançada uma
if(typeof(params.delay)!='number')
throw 'delay tem que ser number';

if(typeof(params.userID)!='string')
throw 'userID tem que ser string';

if(typeof(params.objVLD1)!='string')
throw 'objVLD1 tem que ser string';

if(typeof(params.objVLD2)!='string')
throw 'objVLD2 tem que ser string';

if(typeof(params.objVLD3)!='string')
throw 'objVLD3 tem que ser string';

if(typeof(params.objVLD4)!='string')
throw 'objVLD4 tem que ser string';

//caso tudo ocorra bem, as atributos serão setados
delay = params.delay;
userID = params.userID;
objVLD1 = params.objVLD1;
objVLD2 = params.objVLD2;
objVLD3 = params.objVLD3;
objVLD4 = params.objVLD4;
}

//métodos

//inicia o setInterval
this.startChat = function(){
if(typeof(chatIntervalID)=='undefined')
chatIntervalID = window.setInterval(
function(){
//seu code vai aqui, esse é um code de exemplo que conta as iterações do setInterval
document.title = 'requisições http : '+(++count_req);
},
delay
);
}

//mata o setInterval
this.stopChat = function(){
if(typeof(chatIntervalID)=='number'){
window.clearInterval(chatIntervalID);
chatIntervalID = undefined;
}
}

//métodos de acesso
this.getUserID = function(){
return userID;
}
this.getObjVLD1 = function(){
return objVLD1;
}
this.getObjVLD2 = function(){
return objVLD2;
}
this.getObjVLD3 = function(){
return objVLD1;
}
this.getObjVLD4 = function(){
return objVLD4;
}
this.getDelay = function(){
return delay;
}
//retorna se o setInterval esta rodando(true) ou não(false)
this.getStatus = function(){
if(typeof(chatIntervalID)=='undefined')
return false;
else
return true;
}

//métodos modificadores
this.setUserID = function(value){
if(typeof(value)!='string')
throw 'userID tem que ser string';
userID = value;
return this;
}
this.setObjVLD1 = function(value){
if(typeof(value)!='string')
throw 'objVLD1 tem que ser string';
objVLD1 = value;
return this;
}
this.setObjVLD2 = function(value){
if(typeof(value)!='string')
throw 'objVLD2 tem que ser string';
objVLD2 = value;
return this;
}
this.setObjVLD3 = function(value){
if(typeof(value)!='string')
throw 'objVLD3 tem que ser string';
objVLD3 = value;
return this;
}
this.setObjVLD4 = function(value){
if(typeof(value)!='string')
throw 'objVLD4 tem que ser string';
objVLD4 = value;
return this;
}
//altera o tempo de delay, caso o chat esteja rodando, ela vai parar o chat atribuir o novo delay e iniciar novamente.
this.setDelay = function(value){
if(typeof(value)!='number')
throw 'delay tem que ser number';

if(this.getStatus()){
this.stopChat();
delay = value;
this.startChat();
}
else{
delay = value;
}
return this;
}
//chamada método construtor
this.constructor();
}


[/codebox]

aquivo html
[codebox]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR...l1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-BR" lang="pt-BR">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title> </title>
<script type="text/javascript" src="chat.js"></script>
<script type="text/javascript">
var myChat; //deixe a variavel myChat fora do onload para ser acessivel a qualquer js

window.onload = function(){
//criando instancia da class Chat
myChat= new Chat({
userID:'123AFK',
objVLD1:'teste1',
objVLD2:'teste2',
objVLD3:'teste3',
objVLD4:'teste4',
delay: 2000
});

//iniciando chat, alterar o códgio dentro do setInterval
myChat.startChat();

//código de teste para trabalhar com a classe
window.setTimeout(function(){
alert('vou para o chat por 10 seg, chat status: '+myChat.getStatus());
myChat.stopChat();
alert('chat status: '+myChat.getStatus());
},10000);

window.setTimeout(function(){
alert('voltando com o chat');
myChat.startChat();
},20000);

window.setTimeout(function(){
alert('acessando propriedade delay: '+myChat.getDelay());
myChat.setDelay(4000);
alert('alterado tempo de atualização para 4 segundos');
alert('acessando propriedade delay: '+myChat.getDelay());
},20000);

//os metodos set tem como retorno o proprio objeto(this) então, para esses métodos a da para fazer assim:
alert('acessando propriedade delay: '+myChat.getDelay());
alert('acessando propriedade userID: '+myChat.getUserID());
myChat.setDelay(6000).setUserID('bobesponja1122');
alert('alterado userID e delay');
alert('acessando propriedade delay: '+myChat.getDelay());
alert('acessando propriedade userID: '+myChat.getUserID());
}

//exemplo tratamento de exceção
try{
myChat= new Chat({
userID:'123AFK',
objVLD1:'teste1',
objVLD2:'teste2',
objVLD3:'teste3',
objVLD4:'teste4'
});
}catch(e){
if(e=='delay tem que ser number'){
//seu código para tratar a exceção de não ter setado o delay
alert('exemplo exceção');
}
}


</script>
</head>
<body>
</body>
</html> [/codebox]

na classe Chat eu fiz 4 método de suma importancia,
o startChat, para iniciar as requisições
o stopChat, para para as requisões
o setDelay para alterar o delay de requisão
o getStatus para ver se o chat esta on/off

dentro do startChat eu deixei um code de exemplo pra você alterar e colocar o seu code, tem mais códigos ai na classe que são para as outras varieveis que vc usa.

no html, eu crio uma varivel myChat e crio uma instancia da class Chat nela no onload, pois no onload todo html vai estar acessivel para vc manipular.

todos os parmetros são requeridos, se deixar de especificar um vai lançar um exceção javascript no browser, os métodos set também lançam exceções caso não sejam devidamente parametrizados.

Um abraço.

Attached Files


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


#18 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 28/01/2010, 10:19

OK! vou fazer uns testes aqui.

mas será irá resolver meu problema, do navegador não ficar mais armazenando memória a cada requisição do ajax ?

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

#19 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

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

Posted 28/01/2010, 11:15

o problema era em relação ao setInterval cara, se você só alterar a parte que eu indiquei no js do chat.js você não vai ter esse problema.

#20 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 02/02/2010, 18:00

Édipo Costa Rebouças nada feito... usei seu código (JS e HTML) e só adicionei o código AJAX para fazer a consulta e a unica coisa que mudou foi que demora um pouco mais pra aumentar a quantidade de memória do navegador... a cada requisição está ainda acumulando...

no código PHP cheguei a fazer a consulta e fechar a conexão e também usar as funções mysql_free_result(); e a função unset() pra limpar todas as variaveis... acho que resolveu 40% do problema... mas ainda continua a aumentar a memória do navegador =/

na função de AJAX eu não deixo pra ter CACHE... será que esse é o motivo? se for ferrou pq se eu deixar pra ter CACHE e tiver mudança no banco ele não vai atualizar =/

segue o código que uso pro AJAX
function noCache(uri) {
  return  uri.concat(/\?/.test(uri) ? "&" : "?", "noCache=", (new Date).getTime(), ".", Math.random()*1234567);
};

function getHTTPObject() {
  var req;
  try {
   if (window.XMLHttpRequest) {
	req = new XMLHttpRequest();
	if (req.readyState == null) {
	req.readyState = 1;
	req.addEventListener("load", function () {
  	req.readyState = 4;
  	if (typeof req.onReadyStateChange == "function")
   	req.onReadyStateChange();
	}, false);
	}
	return req;
   }

   if (window.ActiveXObject) {
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	for (var i = 0; i < prefixes.length; i++) {
	try {
  	req = new ActiveXObject(prefixes[i] + ".XmlHttp");
  	return req;
	}
	catch (ex) {};
	}
   }
  }
  catch (ex) {}
  alert("XmlHttp Objects not supported by client browser");
}

String.prototype.reverse = function() {
  return this.split('').reverse().join('');
};

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

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);

e agora? =(

Edição feita por: Goku Jr, 02/02/2010, 18:02.

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

#21 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

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

Posted 02/02/2010, 20:50

tenta deixar o chat rodando por uns 30 segundos, ai vc da um stop de 10 para o browser desalocar a memoria, e da play denovo.faça isso repetidas vezes, talvez com um tempo maior para dar um stop, esse site www.gabrielmatarazzo.com.br que fiz, experimenteai deixar o delay dele para 2000ms hoje esta em cinco, teve o mesmo problema, dei um stop e a memoria do navegador abaixou em poucos segundos. experimente isso, nunca implementei um chat, talvez alguem tenha uma solução melhor.
normalmente uso Jquery nos meus trabalhos, e ja tem a função pronta do ajax., então não estou apto a avaliar o seu, sorry.

#22 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 02/02/2010, 21:04

entendo.. e que Jquery sei lá.. deixa o programador muito "preso" ao código.. mas vou tentar com o JQUERY, pra ver se melhora ...

obrigado Édipo Costa Rebouças e desculpe qualquer coisa !!!

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

#23 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

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

Posted 02/02/2010, 21:09

achei essa implementação na web

http://www.packtpub....mentation-php-2

esse é o link da parte 2 depois vc vai pro link da parte 1.

o cara usa o setTimeout depois que o ajax carregou o arquivo, que pensando bem, parece ser um escolha mais saiba.

Edição feita por: Édipo Costa Rebouças, 02/02/2010, 21:10.


#24 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 13/04/2010, 08:02

Bom dia Édipo tudo bem cara?

então consegui desenvolver aqui o CHAT, Brigadãoooo =)

Porém não tem como eu motrar pra você (conforme prometido) e nem para os usuários do fórum Online pq ta na rede interna aq da empresa, mas se alguém quiser eu envio por email!

Estou criando agora a ferramente administrativa... hoje to indo direto no banco e cadastrando os usuários na mão XD

Abraços cara.

PS: com o setTimeout e muitoooo melhor.
-----------------------------------------------------------------------
PALMEIRAS - Primeiro campeão do mundo em 1951

#25 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

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

Posted 13/04/2010, 12:42

valeu pela dica goku!




2 user(s) are reading this topic

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

IPB Skin By Virteq