Página 1 de 1

Verificar ociosidade do sistema

Enviado: 19 Jan 2009 16:20
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

Re: Verificar ociosidade do sistema

Enviado: 23 Jan 2009 01:12
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.

Verificar ociosidade do sistema

Enviado: 13 Fev 2016 01:39
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?

Verificar ociosidade do sistema

Enviado: 13 Fev 2016 10:31
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.

Verificar ociosidade do sistema

Enviado: 13 Fev 2016 23:04
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.

Verificar ociosidade do sistema

Enviado: 14 Fev 2016 01:06
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.

Verificar ociosidade do sistema

Enviado: 17 Fev 2016 00:30
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).

Verificar ociosidade do sistema

Enviado: 18 Jun 2016 19:27
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

Verificar ociosidade do sistema

Enviado: 18 Jun 2016 19:36
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.