O programa trava por um tempo enquanto o loop não acaba !
Fiz um programa que precisa executar alguns loops realmente demorados e quando ele executa esse loop, ele trava por alguns momentos até acaba-lo. Depois de acabado, ele volta a funcionar normalmente.
O que eu queria era uma forma de não faze-lo travar, ou seja, colocar um botão cancelar que parasse o loop e mais, gostaria de um comando para mudar o ponteiro do mouse daquela setinha para uma ampulhetasinha ( hourglass ).
Alguém sabe ?
O que eu queria era uma forma de não faze-lo travar, ou seja, colocar um botão cancelar que parasse o loop e mais, gostaria de um comando para mudar o ponteiro do mouse daquela setinha para uma ampulhetasinha ( hourglass ).
Alguém sabe ?
Rp
Curtidas 0
Respostas
Renato_sp
13/12/2004
Amigo por ser um loop bem demora o seu sistema fica ocupado, tanto que vc pode fazer um teste clica em outra janela e quando vc voltar para o seu programa provavelmente vc vai ficar em branco ate terminar de fazer todo o processo
Para resolver o seu problema teria que usar thread... nao sei se vc sabe utilizar este poderoso recurso, ele é um pouco complexo de se explicar mas de uma lida sobre ele... voce teria que criar uma classe descendente do TThread algo como
type
MinhaThread = class(TThread)
private
{ Private declarations }
public
{ Public declarations }
end;
E fazer seus metodos de acordo com o que vc quer... depois so instanciar a sua classe MinhaThread que seu programa nao vai ficar mais ocupado....
Como eu disse é um pouco complexo te explicar pelo forum mas vai dando uma lida e posta alguma duvida mais direta que eu te ajudarei
A sua outra duvida seria essa a resposta
Form1.Cursor:= crHourGlass;
Isso deixaria o mouse com uma ampulheta dando a usuario a informacao que algo ta sendo processado...
Ate mais.. !!!!
Para resolver o seu problema teria que usar thread... nao sei se vc sabe utilizar este poderoso recurso, ele é um pouco complexo de se explicar mas de uma lida sobre ele... voce teria que criar uma classe descendente do TThread algo como
type
MinhaThread = class(TThread)
private
{ Private declarations }
public
{ Public declarations }
end;
E fazer seus metodos de acordo com o que vc quer... depois so instanciar a sua classe MinhaThread que seu programa nao vai ficar mais ocupado....
Como eu disse é um pouco complexo te explicar pelo forum mas vai dando uma lida e posta alguma duvida mais direta que eu te ajudarei
A sua outra duvida seria essa a resposta
Form1.Cursor:= crHourGlass;
Isso deixaria o mouse com uma ampulheta dando a usuario a informacao que algo ta sendo processado...
Ate mais.. !!!!
GOSTEI 0
Fjsx
13/12/2004
Não esqueça também do Application.ProcessMessages, coloque-o no final de cada loop, por exemplo assim:
while not...
begin
next;
[b:b2b2da62eb]Application.ProcessMessages;[/b:b2b2da62eb]
end;
Vc vai ver uma diferença.
while not...
begin
next;
[b:b2b2da62eb]Application.ProcessMessages;[/b:b2b2da62eb]
end;
Vc vai ver uma diferença.
GOSTEI 0
Paulo_amorim
13/12/2004
Olá
Como disse o fjsx, Application.ProcessMessages pode resolver no caso de você querer colocar um botão Cancelar
Mesmo que não, creio que ele não irá travar dessa maneira
Para mudar o cursor para ampulheta, existe a classe TCursor, que verifica exatamente qual o cursor da tela. Assim, pode-se alterá-lo...
Cheque se alterar o seu Form.Cursor ele muda mesmo. Para saber qual valor setar, olhe o Help do Delphi
Espero qe ajude
Até+
Como disse o fjsx, Application.ProcessMessages pode resolver no caso de você querer colocar um botão Cancelar
Mesmo que não, creio que ele não irá travar dessa maneira
Para mudar o cursor para ampulheta, existe a classe TCursor, que verifica exatamente qual o cursor da tela. Assim, pode-se alterá-lo...
Cheque se alterar o seu Form.Cursor ele muda mesmo. Para saber qual valor setar, olhe o Help do Delphi
Espero qe ajude
Até+
GOSTEI 0
Danilo_zanaga
13/12/2004
Olá,
Você pode usar a função [b:879ed0caa1]CreateThread[/b:879ed0caa1] da API do Windows. Ela cria um processo em separado (Thread) para sua procedure. Declare a unit ShellAPI na cláusula uses do seu form/arquivo.
Para fazer isso, segue algumas dicas:
a) Coloque os loops que você disse dentro de uma Procedure
b) Declare três variáveis como globais na Unit que estiver trabalhando
var
thr : THandle;
thrID,thrExitCode : DWORD;
thrAddr: Pointer;
thr: É a thread
thrID: ID da thread
thrExitCode: Código de saída da thread
thrAddr: Ponteiro com o endereço da thread
b) Ao clicar o botão que inicia o loop, digite o código:
IsMultiThread:=True;
thr:= 0;
thrAddr:=@;
thr := CreateThread(nil, 0, thrAddr, nil, 0, thrID);
if (thr = 0) then ShowMessage(´Thread não criada´)
else GetExitCodeThread(thr,thrExitCode); / Se não der erro, pega o código de saida da thread
c) Ao final de sua procedure digite:
ExitThread(thrExitCode); / Interrompe a thread
No caso de você querer terminar a thread no meio, deverá digitar o código acima no evento OnClick do botão de cancelamento.
Espero ter ajudado.
Você pode usar a função [b:879ed0caa1]CreateThread[/b:879ed0caa1] da API do Windows. Ela cria um processo em separado (Thread) para sua procedure. Declare a unit ShellAPI na cláusula uses do seu form/arquivo.
Para fazer isso, segue algumas dicas:
a) Coloque os loops que você disse dentro de uma Procedure
b) Declare três variáveis como globais na Unit que estiver trabalhando
var
thr : THandle;
thrID,thrExitCode : DWORD;
thrAddr: Pointer;
thr: É a thread
thrID: ID da thread
thrExitCode: Código de saída da thread
thrAddr: Ponteiro com o endereço da thread
b) Ao clicar o botão que inicia o loop, digite o código:
IsMultiThread:=True;
thr:= 0;
thrAddr:=@;
thr := CreateThread(nil, 0, thrAddr, nil, 0, thrID);
if (thr = 0) then ShowMessage(´Thread não criada´)
else GetExitCodeThread(thr,thrExitCode); / Se não der erro, pega o código de saida da thread
c) Ao final de sua procedure digite:
ExitThread(thrExitCode); / Interrompe a thread
No caso de você querer terminar a thread no meio, deverá digitar o código acima no evento OnClick do botão de cancelamento.
Espero ter ajudado.
GOSTEI 0
Danilo_zanaga
13/12/2004
Não existe opção de editar/excluir a minha mensagem?
GOSTEI 0
Danilo_zanaga
13/12/2004
Não sei o que acontece aqui, tentei colocar ´´ e logo depois que postei a mensagem, sumiu tudo
Só complementando:
thrAddr:=@´´;
Só complementando:
thrAddr:=@´´;
GOSTEI 0
Rp
13/12/2004
Pessoal ! Valeu pela ajuda !
GOSTEI 0