GARANTIR DESCONTO

Fórum O programa trava por um tempo enquanto o loop não acaba ! #261806

13/12/2004

0

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 ?


Rp

Rp

Responder

Posts

13/12/2004

Renato_sp

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.. !!!!


Responder

Gostei + 0

14/12/2004

Fjsx

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.


Responder

Gostei + 0

14/12/2004

Paulo_amorim

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é+


Responder

Gostei + 0

14/12/2004

Danilo_zanaga

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.


Responder

Gostei + 0

14/12/2004

Danilo_zanaga

Não existe opção de editar/excluir a minha mensagem?


Responder

Gostei + 0

14/12/2004

Danilo_zanaga

Não sei o que acontece aqui, tentei colocar ´´ e logo depois que postei a mensagem, sumiu tudo

Só complementando:

thrAddr:=@´´;


Responder

Gostei + 0

14/12/2004

Rp

Pessoal ! Valeu pela ajuda !


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar