Fórum O programa trava por um tempo enquanto o loop não acaba ! #261806
13/12/2004
0
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
Curtir tópico
+ 0Posts
13/12/2004
Renato_sp
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
14/12/2004
Fjsx
while not...
begin
next;
[b:b2b2da62eb]Application.ProcessMessages;[/b:b2b2da62eb]
end;
Vc vai ver uma diferença.
Gostei + 0
14/12/2004
Paulo_amorim
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
14/12/2004
Danilo_zanaga
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
14/12/2004
Danilo_zanaga
Gostei + 0
14/12/2004
Danilo_zanaga
Só complementando:
thrAddr:=@´´;
Gostei + 0
14/12/2004
Rp
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)