Verificar ociosidade do sistema

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Verificar ociosidade do sistema

Mensagem por MARCELOG »

Olá pessoal, para atualizar os dados e exibir os mesmos ao cliente criei a rotina abaixo que funciona em segundo plano (timer).
Entretanto, para evitar que o cliente seja surpreendido com uma atualização no meio de alguma atividade (digitação, impressão, etc.), optei por apenas avisar de que a base de dados estava desatualizada.
Todavia, gostaria que o momento de ociosidade do sistema fosse utilizado para realizar a tarefa.
Alguém conhece algum procedimento ou API que pode de retornar a informação de que o sistema está ocioso.
É até engraçado já que, quando efetuar essa consulta o sistema não vai estar ocioso né!
Obrigado.

MarceloG

/*
Tipo....: PROCEDURE
Nome....: MYTIMER
Objeto..: Informar sobre base de dados desatualizada.
Retorno.: Nenhum.
Detalhe.: SHOW TABLE não funciona porque o campo UPDATE da tabela não é atualizado quando ocorre atualização, mas somente inclusão.
*/

Código: Selecionar todos

STATIC PROCEDURE MYTIMER()

LOCAL cQuery, oQuery

STATIC dUpdate := ''

cQuery := 'SELECT MAX(ASSINATURA) FROM TABELA' // "SHOW TABLE STATUS LIKE 'TABELA'"

oQuery := oServer:QUERY(cQuery)

IF oQuery:NETERR()

   MSGSTOP(cQuery+CRLF+;
           ALLTRIM(STR(oQuery:ERRORNO()))+CRLF+;
           oQuery:ERROR())

   oQuery:DESTROY()

   RETURN

ENDIF

IF EMPTY(dUpdate)

   dUpdate := oQuery:GETROW(1):FIELDGET(1)

ENDIF

IF dUpdate # oQuery:GETROW(1):FIELDGET(1)

   PRC.LBL1.SHOW // Avisa cliente

   dUpdate := oQuery:GETROW(1):FIELDGET(1)

ENDIF

RETURN
Água mole em pedra dura tanto bate que até espirra!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Verificar ociosidade do sistema

Mensagem por sygecom »

A função HB_IdleAdd() diz que faz o que você esta querendo, porem nunca usei ela, apenas uso HB_BackGroundAdd().

Olha o que diz o Help do xHarbour:
Function HB_IdleAdd() adds the passed codeblock to the list of background tasks that will be executed when the main program enters an idle state. There is no limit for the number of idle tasks.
The idle state is the state of the xHarbour virtual machine (VM) when it waits for user input from the keyboard or the mouse. The VM enters idle state during Inkey() calls. All applications that do not use Inkey() function calls can signal the idle state with a call to the HB_IdleState() function.
Note: tasks for regular background processing are created with function HB_BackGroundAdd().
An alternative for background tasks is provided with threads. Refer to function StartThread() for running parts of an application simultaneously in multiple threads.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Verificar ociosidade do sistema

Mensagem por cjp »

Gostaria de saber se a função chamada com HB_idleAdd() só roda se o sistema estiver em algum @...get ou inkey(). Pra estas estou usando sem problema.

Mas estou tentando usar essa mesma função para interromper a execução de um select no MySQL, quando essa execução estiver muito demorada. Não está funcionando. Isso é possível?
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Verificar ociosidade do sistema

Mensagem por JoséQuintas »

No próprio MySQL não teria algo desse tipo? algum tipo de timeout?
Afinal, como disse, o comando vai estar sendo executado no MySQL.

Se isso é eventual, pode olhar no painel do HeidiSQL, ou pedindo a lista de tarefas do MySQL.

Ou sofisticar um pouquinho, e executar os comandos com multithread, já com teste embutido.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Verificar ociosidade do sistema

Mensagem por cjp »

Achei algumas informações na internet sobre timeout no MySQL, mas, se eu entendi bem, é para aumentar ou diminuir o tempo de desconexão. No meu caso, o problema é num select, não na conexão em si.

É eventual sim.

Como assim olhar o painel do HeidiSQL?

Também não sei como pedir a lista de tarefas do MySQL. Pode me ajudar?

Em relação à multithread, não sei mexer com isso. Há um tempo eu tentei, mas não consegui.

Agradeceria se vc pudesse me dar mais detalhes.
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Verificar ociosidade do sistema

Mensagem por JoséQuintas »

HeidiSQL é um programa pra manuseio do MySQL.
Na aba servidor, dá pra ver os processos em andamento, e vai poder confirmar qual é o comando que está lento.

Até esqueci, tem um jeito simples que uso que serviria pra isso.
Quando dá erro, gravo no log qual foi o comando SQL.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Verificar ociosidade do sistema

Mensagem por cjp »

Eu uso o HeidiSQL normalmente, mas acho que não entendi bem o que vc disse.

Na aba servidor contam várias opções. Veja:
heidisql.png
Mas na aba processos, não me aparecem as querys em andamento no meu sistema.

Veja o que me ocorreu hoje, por exemplo: entre 21:10 e 21:52h, um dos meus sistemas ficou executando um update ("UPDATE tarefas SET tempoestim="+alltrim(str(te))+",prioridade="+alltrim(str(pr))+",soluc='"+sol+"',exibe='"+ex+"',dtcarga='"+alltrim(str(year(dtcg)))+"-"+substr(dtoc(dtcg),4,2)+"-"+substr(dtoc(dtcg),1,2)+"'"+if(ati="S",",atind='A'","")+" WHERE nrtarefa='"+arq+"'").

Não havia razão para tanta demora, normalmente essa query não leva mais do que alguns segundos. Inclusive, neste caso, ela alterou apenas 42 registros.

Isso causou o travamento do sistema todo, pra todos os usuários. Como eu não estava disponível nesse horário, não tive como resolver na hora. Por sorte, em razão da hora, só tinha um usuário usando o sistema no momento.

O que eu queria é que, num caso desses, o sistema interrompesse o update, que nem era tão importante assim (poderia ser executado mais tarde).
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Verificar ociosidade do sistema

Mensagem por JoséQuintas »

Aqui ao abrir o HeidiSQL ainda consegui ver um processo em andamento, inclusive dele mesmo.
proccesslist.png
Lembre-se que a informação é momentânea, algo como uma "foto" da situação naquele momento.
F5 atualiza a informação.

Essa lista também poderia ser obtida via programa.
Se não me engano SHOW PROCESSLIST
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Verificar ociosidade do sistema

Mensagem por JoséQuintas »

Pera lá.... lembrei de uma coisa....

Já cheguei a fazer teste abrindo/fechando conexões, e isso acabava fazendo tudo travar.

Exemplo do que pode dar problema:

Código: Selecionar todos

FOR nCont = 1 TO 10000
   conexao:Open()
   conexao:Close()
NEXT
Pode travar até roteador.

Explicação:
Existe cache pra conexões half-open, que significa conexões abrindo/fechando.
Existe limite pra isso também.
No Windows 2.000 eram 67 milhões de conexões.
A partir do XP apenas 8.
Não confunda são 8 unidades. 8 half-open contra 67 milhões de half-open.

Se deixa aberto... o Windows fecha.... se abre/fecha o Windows estoura o limite.... rs
Não há limite de conexões abertas. O limite é de conexões "no meio do caminho".

Mas como deu problema até no roteador, isso não acontece apenas com Windows.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder