Debate, programação UML, problema da CPU em 100¬
Oi pessoal, abri o tópico pra ter uma discussão sobre o tema
Normalmente se cria um programa insere uns componentes clica neles para inserir o código e pronto, temos uma aplicacao a qual é controlada apartir do comando application.run, ou seja um thread que fica analisando os eventos sobre os componentes do form.
Na UML se tem o conceito de um controle feito por uma unit de controle que faz a ponte entre interface e o acesso aos dados, a aplicacao inicia manda o controle para essa unit e ela cria o form acessa os dados para por no form, tendo em mente q para o form e para o acesso aos dados sao outras units especializadas, o unit controle nao sabe como a interface é nem onde os dados estao, funciona mais genericamente.
Então em uma aplicacao que espera receber dados pela rede ou analisa arquivos, sem poder esperar um evento do form, pode trabalhar sobre um loop principal que faz tudo isso e ainda verifica se apareceu algum evento.
O que pode acontecer com esse loop é que o programa toma conta do processador, e para acontecer algum evento no form precisa haver o que acontece no application.run, quando comecei a fazer isso usava application.processmessages, já fazia o form funcionar mas a CPU ainda continuava em 100¬, entao um sleep(1); resolveu o problema.
Ainda pode acontecer problemas com raros eventos como o flat do speedbutton, que quando se passa o mouse por cima ele levanta e o problema é que ele nao desse mais, não sei o porque disso, alguém saberia?
Bom eis que sem querer hj descobri o application.HandleMessage, e substitui ele pelo processmessages e sleep, resolvendo o problema da CPU e o flat do speedbutton passou a funcionar.
Pode parecer besteira isso tudo ai, mas eu procurei um monte pela internet perdi alguns dias procurando em foruns, postando topicos e passando emails, achei uma solucao em foruns do exterior, e agora no chute achei o HandleMessage que aparentemente é muito melhor.
Alguém tem alguma resalva sobre ele? gostaria de abrir mais a discussao sobre esse problema, e o desenvolvimento de aplicações considerando a UML.
Espero ter ajudado
Normalmente se cria um programa insere uns componentes clica neles para inserir o código e pronto, temos uma aplicacao a qual é controlada apartir do comando application.run, ou seja um thread que fica analisando os eventos sobre os componentes do form.
Na UML se tem o conceito de um controle feito por uma unit de controle que faz a ponte entre interface e o acesso aos dados, a aplicacao inicia manda o controle para essa unit e ela cria o form acessa os dados para por no form, tendo em mente q para o form e para o acesso aos dados sao outras units especializadas, o unit controle nao sabe como a interface é nem onde os dados estao, funciona mais genericamente.
Então em uma aplicacao que espera receber dados pela rede ou analisa arquivos, sem poder esperar um evento do form, pode trabalhar sobre um loop principal que faz tudo isso e ainda verifica se apareceu algum evento.
O que pode acontecer com esse loop é que o programa toma conta do processador, e para acontecer algum evento no form precisa haver o que acontece no application.run, quando comecei a fazer isso usava application.processmessages, já fazia o form funcionar mas a CPU ainda continuava em 100¬, entao um sleep(1); resolveu o problema.
Ainda pode acontecer problemas com raros eventos como o flat do speedbutton, que quando se passa o mouse por cima ele levanta e o problema é que ele nao desse mais, não sei o porque disso, alguém saberia?
Bom eis que sem querer hj descobri o application.HandleMessage, e substitui ele pelo processmessages e sleep, resolvendo o problema da CPU e o flat do speedbutton passou a funcionar.
Pode parecer besteira isso tudo ai, mas eu procurei um monte pela internet perdi alguns dias procurando em foruns, postando topicos e passando emails, achei uma solucao em foruns do exterior, e agora no chute achei o HandleMessage que aparentemente é muito melhor.
Alguém tem alguma resalva sobre ele? gostaria de abrir mais a discussao sobre esse problema, e o desenvolvimento de aplicações considerando a UML.
Espero ter ajudado
Andremp
Curtidas 0
Respostas
Crash
11/05/2006
agora tente criar essa mesma aplicação tirando a unit Forms (que por sinal eh mto grande... exe de 290k cai pra 40 sem ela).
Eu andei precisando criar um simples aplicativo servidor de ftp que rodasse sem winforms e nao tive exito.. tive q usar a unit Forms.
Percorrendo o codigo da unit eu vi que existe APIs que fazem o msm trabalho mais implementar elas para o processo receber as msgs e tudo mais nao eh facil.
Eu andei precisando criar um simples aplicativo servidor de ftp que rodasse sem winforms e nao tive exito.. tive q usar a unit Forms.
Percorrendo o codigo da unit eu vi que existe APIs que fazem o msm trabalho mais implementar elas para o processo receber as msgs e tudo mais nao eh facil.
GOSTEI 0
Crash
11/05/2006
ah.. e lembrando... eu conseguir fazer o servidor ftp com o mesmo codigo (sem winforms)... porem com aplicação tipo console e funciona perfeito.
Vale entaum a duvida...
´Como fazer a msm coisa que o Application.HandleMessages faz sem a unit Forms?´
Vale entaum a duvida...
´Como fazer a msm coisa que o Application.HandleMessages faz sem a unit Forms?´
GOSTEI 0
Andremp
11/05/2006
crash: ´Como fazer a msm coisa que o Application.HandleMessages faz sem a unit Forms?´
Se vc vai usar o modo console nao precisa do Application.HandleMessages, ele serve para testar eventos do form.
Mas se vc vai usar um form e nao quer usar a unit form para reduzir o tamanho... o compilador nao cria código dos procedimento que ele nao usa entao nao teria como reproduzir o forms sem tirar alguma funcionalidade, eu li alguma coisa talvez eu nao tenha entendido bem mas pareceme que é possivel usando umas api do sistema e substituir as funcoes da unit form.. mas nao tenho certeza.
Mudando de assunto:
acabei descobrindo que ainda tenho problemas com o Application.HandleMessages
em alguns momentos ele deixa o programa travado a espera de quaquer tipo de evento,
1 - tenho um procedimento no loop principal que em um certo estado do programa fica colocando pontos em um label, primeiro testa se passou X milisegundos desde que colocou o ultimo ponto, se passou insere o ponto se nao volta a loop. Usando o Application.HandleMessages o programa para se nao houver nenhum evento, se passar o mouse por cima do form ele continua rodando. E eu nem uso qualquer evento OnMouse...
2 - o programa apresenta na barra de status o tempo passado do recebimento do ultimo arquivo, quando inicio o programa ele para logo apos apresentar o form, se passo o mouse por cima do form continua rodando e nao para mais. Estranho nao?
Aparentemente os dois casos sao parecidos mas o Application.HandleMessages funciona diferente com relacao aos eventos. Ele precisa de uma ação externa para sair do Application.HandleMessages.
O mesmo não acontece substituindo por Application.ProcessMessages junto com o Sleep(1), porém acontecem as falhas em alguns eventos como escrevi anteriormente.
Fica a pergunta:
Existe um substituto para esses comandos que efetue a mesma função? Ou alguma forma para que o Application.HandleMessages nao trave o programa eventualmente?
Se vc vai usar o modo console nao precisa do Application.HandleMessages, ele serve para testar eventos do form.
Mas se vc vai usar um form e nao quer usar a unit form para reduzir o tamanho... o compilador nao cria código dos procedimento que ele nao usa entao nao teria como reproduzir o forms sem tirar alguma funcionalidade, eu li alguma coisa talvez eu nao tenha entendido bem mas pareceme que é possivel usando umas api do sistema e substituir as funcoes da unit form.. mas nao tenho certeza.
Mudando de assunto:
acabei descobrindo que ainda tenho problemas com o Application.HandleMessages
em alguns momentos ele deixa o programa travado a espera de quaquer tipo de evento,
1 - tenho um procedimento no loop principal que em um certo estado do programa fica colocando pontos em um label, primeiro testa se passou X milisegundos desde que colocou o ultimo ponto, se passou insere o ponto se nao volta a loop. Usando o Application.HandleMessages o programa para se nao houver nenhum evento, se passar o mouse por cima do form ele continua rodando. E eu nem uso qualquer evento OnMouse...
2 - o programa apresenta na barra de status o tempo passado do recebimento do ultimo arquivo, quando inicio o programa ele para logo apos apresentar o form, se passo o mouse por cima do form continua rodando e nao para mais. Estranho nao?
Aparentemente os dois casos sao parecidos mas o Application.HandleMessages funciona diferente com relacao aos eventos. Ele precisa de uma ação externa para sair do Application.HandleMessages.
O mesmo não acontece substituindo por Application.ProcessMessages junto com o Sleep(1), porém acontecem as falhas em alguns eventos como escrevi anteriormente.
Fica a pergunta:
Existe um substituto para esses comandos que efetue a mesma função? Ou alguma forma para que o Application.HandleMessages nao trave o programa eventualmente?
GOSTEI 0