Thread não esta funcionando ao executar update?
Pessoal, não conheço quase nada de thread, mais tentei fazer uma aqui para um processo um pouco demorado de update.
É algo que tem que buscar dados que estao com caracteres não mais aceitaveis na tabela e faz a correção, por ser um processo meio demorado coloquei numa thread...Segue
Código: unit uTThreadDefrag;
interface
uses
Classes, Windows, SysUtils, ZConnection, DB, ZAbstractRODataset, ZAbstractDataset,
ZDataset, ZSqlProcessor, IdBaseComponent, IdComponent, IdIPWatch,
ZStoredProcedure, Forms, Messages, Dialogs, MaskUtils, Controls,
IBDatabase, IBCustomDataSet, IBQuery, ActiveX;
type
ThreadDefrag = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
public
constructor Executar(qQuery: TZQuery);
end;
implementation
uses udm, uprincipal;
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure Thread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ Thread }
constructor ThreadDefrag.Executar(qQuery: TZQuery);
begin
inherited Create(True);
FreeOnTerminate := True;
Resume;
end;
procedure ThreadDefrag.Execute;
var
qQuery : TZQuery;
begin
CoInitialize(nil);
try
qQuery := TZQuery.Create(nil);
qQuery.Connection := dm.connection;
try
with qQuery do
begin
Close;
SQL.Clear;
SQL.Add('update ordemserv x set x.nrordemserv = ( ');
SQL.Add('select resultado from sonumeros(x.nrordemserv))');
ExecSQL;
dm.connection.Commit;
ShowMessage('Processo de Desfragmentação executado com sucesso.');
end;
except
on e:Exception do
begin
dm.connection.Rollback;
raise exception.Create('Erro! Falha ao executar o Defrag. Processo encerrado.'+e.Message);
end;
end;
finally
CoUninitialize;
end;
{ Place thread code here }
end;
end.
Mais ela esta travando não deixando eu entrar em outro form, as vezes esta dando erro ao fechar o aplicativo, e tamb´me não esta executar o showmessage...No debug executa...
Esta errado esta threads, ou falta algo?
O comando sql esta certo, apenas a thread que não esta de acordo.
Estou chamando ela assim
Código: ThreadDefrag.Executar(querylocal) Então, quando aciono a thread e fico fazendo outra coisa, e depois quero sair do sistema, está trazendo este erro:
"Exception EOSError in module Project1.exe at 00012BA2
System Error Code 1400
O identificado da janela é inválido"
É algo que tem que buscar dados que estao com caracteres não mais aceitaveis na tabela e faz a correção, por ser um processo meio demorado coloquei numa thread...Segue
Código: unit uTThreadDefrag;
interface
uses
Classes, Windows, SysUtils, ZConnection, DB, ZAbstractRODataset, ZAbstractDataset,
ZDataset, ZSqlProcessor, IdBaseComponent, IdComponent, IdIPWatch,
ZStoredProcedure, Forms, Messages, Dialogs, MaskUtils, Controls,
IBDatabase, IBCustomDataSet, IBQuery, ActiveX;
type
ThreadDefrag = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
public
constructor Executar(qQuery: TZQuery);
end;
implementation
uses udm, uprincipal;
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure Thread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ Thread }
constructor ThreadDefrag.Executar(qQuery: TZQuery);
begin
inherited Create(True);
FreeOnTerminate := True;
Resume;
end;
procedure ThreadDefrag.Execute;
var
qQuery : TZQuery;
begin
CoInitialize(nil);
try
qQuery := TZQuery.Create(nil);
qQuery.Connection := dm.connection;
try
with qQuery do
begin
Close;
SQL.Clear;
SQL.Add('update ordemserv x set x.nrordemserv = ( ');
SQL.Add('select resultado from sonumeros(x.nrordemserv))');
ExecSQL;
dm.connection.Commit;
ShowMessage('Processo de Desfragmentação executado com sucesso.');
end;
except
on e:Exception do
begin
dm.connection.Rollback;
raise exception.Create('Erro! Falha ao executar o Defrag. Processo encerrado.'+e.Message);
end;
end;
finally
CoUninitialize;
end;
{ Place thread code here }
end;
end.
Mais ela esta travando não deixando eu entrar em outro form, as vezes esta dando erro ao fechar o aplicativo, e tamb´me não esta executar o showmessage...No debug executa...
Esta errado esta threads, ou falta algo?
O comando sql esta certo, apenas a thread que não esta de acordo.
Estou chamando ela assim
Código: ThreadDefrag.Executar(querylocal) Então, quando aciono a thread e fico fazendo outra coisa, e depois quero sair do sistema, está trazendo este erro:
"Exception EOSError in module Project1.exe at 00012BA2
System Error Code 1400
O identificado da janela é inválido"
Adriano Dolce
Curtidas 0
Respostas
Adriano Dolce
30/08/2010
Não foi resolvido ainda...
GOSTEI 0