danielrgoes Postado Maio 15, 2009 Denunciar Share Postado Maio 15, 2009 boa tarde pessoalestou com uma duvida eu desenvolvi um sistema que possui um rotina em um botaoessa rotina é bem pesadapossui varios calculos, whiles selects e grava no banco da redequando essa rotina esta sendo executada eu não posso mexer em nada no computador que o programa trava e fica sem responderalguém tem alguma dica para melhorar issomuito obrigado Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Maio 15, 2009 Denunciar Share Postado Maio 15, 2009 OpaA resposta para seus problemas se chama ThreadDa uma olhadahttp://greatis.com/delphicb/tips/lib/appli...ynchthread.htmlhttp://scriptbrasil.com.br/forum/index.php?showtopic=136897abrxxx Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 danielrgoes Postado Maio 18, 2009 Autor Denunciar Share Postado Maio 18, 2009 OpaA resposta para seus problemas se chama ThreadDa uma olhadahttp://greatis.com/delphicb/tips/lib/appli...ynchthread.htmlhttp://scriptbrasil.com.br/forum/index.php?showtopic=136897abrxxxposso postar um pedaço do codigo para você me ajudar com as threads? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Maio 18, 2009 Denunciar Share Postado Maio 18, 2009 claro brother pode sim :)abrx Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 danielrgoes Postado Maio 18, 2009 Autor Denunciar Share Postado Maio 18, 2009 claro brother pode sim :)abrxif SBDesenhos.Down = true then begin // delete tudo da tabela modulo.cds_arquivos.close; modulo.sql_arquivos.sql.clear; modulo.sql_arquivos.sql.Add('DELETE FROM ARQUIVOS '); modulo.sql_arquivos.sql.Add('WHERE TIPO = 2 '); modulo.sql_arquivos.ExecSQL(); // essa query é necessaria porque depois que faz um delete a sql não aceita um append modulo.cds_arquivos.close; modulo.sql_arquivos.sql.clear; modulo.sql_arquivos.sql.Add('SELECT * FROM ARQUIVOS '); modulo.sql_arquivos.sql.Add('WHERE TIPO = 2 '); modulo.cds_arquivos.Open(); if FindFirst(caminho+'*.pdf', faAnyFile, searchResult) = 0 then begin repeat // incrementa a barra de progresso aguarde.Frmaguarde.progresso.Position := aguarde.Frmaguarde.progresso.Position + 1; if aguarde.Frmaguarde.progresso.Position = 100 then aguarde.Frmaguarde.progresso.Position := 1; if (searchResult.Name <> '.') AND (searchResult.Name <> '..') then begin // desenhos tipo = 2 codigo := codigo + 1; modulo.CDS_arquivos.Append; modulo.cds_arquivosCOD_ARQ.Value := codigo; modulo.cds_arquivosNOME_ARQ.Value := searchResult.Name; modulo.cds_arquivosTIPO.Value := 2; modulo.cds_arquivos.post; end; until FindNext(searchResult) <> 0; FindClose(searchResult); frmaguarde.Close; ShowMessage ('Atualização efetuada com sucesso'); end; end;essa rotina faz o seguinte quando eu clico ele ve o Speed botoon que esta precionado e executa essa rotinacom o caminho que eu passarela apaga td que tem no banco depois vai no caminho que eu passei por exemplo (C:\Teste)pega o nome do arquivo e salva o nome no banco e fica no while ate acabarsó que essa rotina é pesada porque tem uns 2000 arquivos e salva no banco da rede compreendee tem outros processos que eu preciso fazer isso mais se você me ajudar nessa já consigo andar com a proprias pernas depoismuito obrigado pela ajuda valeu mesmoabraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Maio 18, 2009 Denunciar Share Postado Maio 18, 2009 (editado) Opaum exemplotype TClearDB = class(TThread) private protected procedure Execute; override; procedure ClearDB; end; ... procedure TClearDB.ClearDB; begin with NomedoForm do begin if SBDesenhos.Down = true then begin // delete tudo da tabela modulo.cds_arquivos.close; modulo.sql_arquivos.sql.clear; modulo.sql_arquivos.sql.Add('DELETE FROM ARQUIVOS '); modulo.sql_arquivos.sql.Add('WHERE TIPO = 2 '); modulo.sql_arquivos.ExecSQL(); end; end; end; procedure TClearDB.Execute; begin FreeOnTerminate := True; //limpa da memória ao finalizar Synchronize(ClearDB); //faz a limpeza do banco de dados sem travar o programa end; procedure TForm1.Button1Click.... var ClearDB: TClearDB; begin //o False indica que a thread sera iniciada assim q ela for criada... //se colocar True, depois só chamar ClearDB.Resume pra iniciá-la ClearDB := TClearDB.Create(False); end;De uma olhada neste tópico também...http://scriptbrasil.com.br/forum/index.php?showtopic=136897entendeu?abrxxx Editado Maio 18, 2009 por Churc Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 danielrgoes Postado Maio 19, 2009 Autor Denunciar Share Postado Maio 19, 2009 Opaum exemplotype TClearDB = class(TThread) private protected procedure Execute; override; procedure ClearDB; end; ... procedure TClearDB.ClearDB; begin with NomedoForm do begin if SBDesenhos.Down = true then begin // delete tudo da tabela modulo.cds_arquivos.close; modulo.sql_arquivos.sql.clear; modulo.sql_arquivos.sql.Add('DELETE FROM ARQUIVOS '); modulo.sql_arquivos.sql.Add('WHERE TIPO = 2 '); modulo.sql_arquivos.ExecSQL(); end; end; end; procedure TClearDB.Execute; begin FreeOnTerminate := True; //limpa da memória ao finalizar Synchronize(ClearDB); //faz a limpeza do banco de dados sem travar o programa end; procedure TForm1.Button1Click.... var ClearDB: TClearDB; begin //o False indica que a thread sera iniciada assim q ela for criada... //se colocar True, depois só chamar ClearDB.Resume pra iniciá-la ClearDB := TClearDB.Create(False); end;De uma olhada neste tópico também...http://scriptbrasil.com.br/forum/index.php?showtopic=136897entendeu?abrxxxChurc primeiro de td muito obrigado mesmo pela ajuda você da dando uma força imensadepois eu ate entendi mais nesse caso você esta colocando o delete na threando meu problema esta na repetiçao no until porque ele repeti muitas vezes 2500 ai eu não posso mais mexer em nada que travave se eu entendi direitoabraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Maio 19, 2009 Denunciar Share Postado Maio 19, 2009 Daniel, então basta você adaptar os códigos, exemplo...Fiz no Bloco de Notas então talvez tenha algum erro rsMas é pra você ter uma idéia :)TEnumPDF = class(TThread) private iProgress: Integer; iMax: Integer; protected procedure ShowProgress; procedure EnumFiles; procedure Add2DB; procedure Execute; override; end; var slBuff: TStringList; implementation procedure EnumFiles(szPath, szAllowedExt: String; iAttributes: Integer; Buffer: TStrings; bClear, bIncludePath: Boolean); var res: TSearchRec; szBuff: String; begin if (bClear) then Buffer.Clear; szPath := IncludeTrailingBackslash(szPath); if (FindFirst(szPath + szAllowedExt, iAttributes, res) = 0) then begin repeat szBuff := res.Name; if ((szBuff <> '.') and (szBuff <> '..')) then if (bIncludePath) then Buffer.Add(szPath + szBuff) else Buffer.Add(szBuff); until FindNext(res) <> 0; FindClose(res); end; end; ... procedure TEnumPDF.ShowProgress; begin with aguarde.FrmAguarde do begin Progresso.Max := iMax; Progresso.Position := iProgress; if Progresso = iMax then begin Progresso.Position := 1; Close; end; end; end; procedure TEnumPDF.Add2DB; var i: Integer; begin iMax := slBuff.Count; for i := 0 to Pred(slBuff.Count) do begin // desenhos tipo = 2 codigo := codigo + 1; modulo.CDS_arquivos.Append; modulo.cds_arquivosCOD_ARQ.Value := codigo; modulo.cds_arquivosNOME_ARQ.Value := slBuff[i]; modulo.cds_arquivosTIPO.Value := 2; modulo.cds_arquivos.post; iProgress := i + 1; Synchronize(ShowProgress); end; end; end; procedure TEnumPDF.Execute; var i: begin FreeOnTerminate := True; if slBuff = nil then slBuff := TStringList.Create; try EnumFiles(caminho, '*.pdf', faAnyFile - faDirectory, slBuff, False, False); finally Synchronize(Add2DB); end; FreeAndNil(slBuff); end; procedure TForm1.Button1Click.... var EnumPDF: TEnumPDF; begin EnumPDF := TEnumPDF.Create(False); end;veja se da certoabrxx Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 danielrgoes Postado Maio 21, 2009 Autor Denunciar Share Postado Maio 21, 2009 Bom dia Churcantes de mais nada muito obrigado pela ajuda você deu uma força e tantoestou aprendendo mais de thread para inplementar pois tem varias coisas aki que precisam dissoqualquer coisa eu corro aki atrz de você hahahhahahmuito obrigado mais uma vezabraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 William - TI Postado Maio 22, 2009 Denunciar Share Postado Maio 22, 2009 Amigo estive dando uma olhada já tive esta duvida o que resolvel para o meu sistema foi espalhar este codigo pelas linhas de codigosApplication.ProcessMessages;tipo :while not query1.eof do begin //funcoes.. query1.next; Application.ProcessMessages;end;isto deve resolver seu problema. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 danielrgoes Postado Maio 27, 2009 Autor Denunciar Share Postado Maio 27, 2009 Amigo estive dando uma olhada já tive esta duvida o que resolvel para o meu sistema foi espalhar este codigo pelas linhas de codigosApplication.ProcessMessages;tipo :while not query1.eof do begin //funcoes.. query1.next; Application.ProcessMessages;end;isto deve resolver seu problema.Willian A dica parece ser muito boamais não entendi muito bempoderia me dar mais explicaçoespois o que resolveu o problema deu alguns problemas em outras coisasabraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Douglas Soares Postado Maio 27, 2009 Denunciar Share Postado Maio 27, 2009 Deu Problema em outras coisas?, expecifique, que erro deu agora?, o que aconteceu?Abraços! Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
danielrgoes
boa tarde pessoal
estou com uma duvida
eu desenvolvi um sistema que possui um rotina em um botao
essa rotina é bem pesada
possui varios calculos, whiles selects e grava no banco da rede
quando essa rotina esta sendo executada eu não posso mexer em nada no computador que o programa trava e fica sem responder
alguém tem alguma dica para melhorar isso
muito obrigado
Link para o comentário
Compartilhar em outros sites
11 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.