{"id":82,"date":"2025-11-27T12:37:47","date_gmt":"2025-11-27T12:37:47","guid":{"rendered":"https:\/\/delphimasters.com.br\/blog\/?p=82"},"modified":"2025-11-27T12:38:47","modified_gmt":"2025-11-27T12:38:47","slug":"processamento-assincrono-threads-e-lotes-no-delphi-com-firedac","status":"publish","type":"post","link":"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/","title":{"rendered":"Processamento Ass\u00edncrono, Threads e Lotes no Delphi com FireDAC"},"content":{"rendered":"<p>&nbsp;<\/p>\n<h3>Como carregar milh\u00f5es de registros sem travar a interface<\/h3>\n<p>Em aplica\u00e7\u00f5es que trabalham com grandes volumes de dados \u2014 especialmente sistemas corporativos, ERPs ou softwares industriais \u2014 \u00e9 comum enfrentar travamentos na interface ao executar consultas pesadas. Isso acontece porque a opera\u00e7\u00e3o \u00e9 realizada na <em>main thread<\/em>, que tamb\u00e9m \u00e9 respons\u00e1vel por redesenhar a UI.<\/p>\n<p>Neste artigo, apresento uma abordagem profissional para:<\/p>\n<ul>\n<li>Processar grandes volumes de dados em <strong>threads separadas<\/strong><\/li>\n<li>Ler registros em <strong>lotes (pagina\u00e7\u00f5es)<\/strong><\/li>\n<li>Atualizar a interface de forma <strong>segura<\/strong> com <code>TThread.Queue<\/code><\/li>\n<li>Acumular todos os dados numa mem\u00f3ria tempor\u00e1ria<\/li>\n<li>Atualizar a mem\u00f3ria da UI <strong>apenas no final<\/strong>, sem erros como:<br \/>\n<em>&#8220;Cannot perform this operation on a closed dataset&#8221;<\/em><\/li>\n<\/ul>\n<hr \/>\n<h2>\ud83e\uddf5 Entendendo o conceito: Threads e a Main Thread<\/h2>\n<p>O Delphi VCL (e UniGUI) tem uma caracter\u00edstica importante:<\/p>\n<blockquote><p><strong>Somente a main thread pode atualizar a interface.<\/strong><\/p><\/blockquote>\n<p>Qualquer tentativa de mexer em componentes visuais dentro de uma <em>background thread<\/em> resulta em erros, travamentos, access violation etc.<\/p>\n<p>Por isso usamos:<\/p>\n<h3>\u2714\ufe0f <code>TTask.Run<\/code><\/h3>\n<p>Cria uma opera\u00e7\u00e3o ass\u00edncrona executada em outra thread.<\/p>\n<h3>\u2714\ufe0f <code>TThread.Queue<\/code><\/h3>\n<p>Usado para entregar resultados para a interface <em>de forma segura<\/em>.<\/p>\n<p>Assim mantemos a UI:<\/p>\n<ul>\n<li>leve<\/li>\n<li>responsiva<\/li>\n<li>sem travamentos<\/li>\n<li>sem deadlocks<\/li>\n<\/ul>\n<hr \/>\n<h2>\ud83d\udce6 Carregamento em Lotes (Pagination \/ Chunking)<\/h2>\n<p>Quando trabalhamos com bases Firebird grandes, \u00e9 ruim fazer:<\/p>\n<pre><code class=\"language-sql\">SELECT * FROM tabela\r\n<\/code><\/pre>\n<p>pois a consulta retorna milhares\/milh\u00f5es de registros.<\/p>\n<p>A solu\u00e7\u00e3o \u00e9 quebrar a consulta em blocos:<\/p>\n<pre><code class=\"language-sql\">ROWS 1 TO 1000\r\nROWS 1001 TO 2000\r\nROWS 2001 TO 3000\r\n...\r\n<\/code><\/pre>\n<p>Isso reduz consumo de mem\u00f3ria e mant\u00e9m desempenho est\u00e1vel.<\/p>\n<p><strong>\u26a0 Gostaria de acrescentar que tamb\u00e9m da pra fazer com outros banco de dados.<\/strong><\/p>\n<hr \/>\n<h2>\ud83e\udde0 TFDMemTable como armazenamento intermedi\u00e1rio<\/h2>\n<p>Usamos dois <code>TFDMemTable<\/code>:<\/p>\n<h3>1\ufe0f\u20e3 <code>TempMem<\/code><\/h3>\n<p>Armazena os dados dentro da <em>thread background<\/em>.<\/p>\n<h3>2\ufe0f\u20e3 <code>TempMemClone<\/code><\/h3>\n<p>C\u00f3pia segura, entregue \u00e0 UI por <code>TThread.Queue<\/code>.<\/p>\n<h3>3\ufe0f\u20e3 <code>FDMem<\/code><\/h3>\n<p>\u00c9 a tabela que est\u00e1 conectada \u00e0 <code>DBGrid<\/code> \/ <code>TUniDBGrid<\/code>.<\/p>\n<hr \/>\n<h2>\ud83d\udeab Por que n\u00e3o posso passar <code>TempMem<\/code> direto para a UI?<\/h2>\n<p>Porque o <code>TempMem<\/code> pertence \u00e0 thread secund\u00e1ria.<\/p>\n<p>Se tentar acessar na UI, ocorre:<\/p>\n<ul>\n<li><code>\"Dataset not in edit mode\"<\/code><\/li>\n<li><code>\"Cannot perform this operation on a closed dataset\"<\/code><\/li>\n<li><code>\"Operation not allowed in multi-thread environment\"<\/code><\/li>\n<li>Travamento aleat\u00f3rio em produ\u00e7\u00e3o<\/li>\n<\/ul>\n<p>Por isso criamos um <strong>clone<\/strong> antes de enviar \u00e0 UI.<\/p>\n<hr \/>\n<h2>\ud83e\udde9 A Solu\u00e7\u00e3o Completa<\/h2>\n<p>Aqui est\u00e1 o algoritmo final:<\/p>\n<ol>\n<li>Monta a estrutura do <code>FDMem<\/code><\/li>\n<li>Inicia uma thread (<code>TTask.Run<\/code>)<\/li>\n<li>Conta total de registros<\/li>\n<li>L\u00ea os dados em lotes<\/li>\n<li>Armazena tudo em <code>TempMem<\/code><\/li>\n<li>No final, faz um <em>clone seguro<\/em><\/li>\n<li>Atualiza o dataset da UI dentro de <code>TThread.Queue<\/code><\/li>\n<\/ol>\n<p>Sem travamentos e sem inconsist\u00eancias.<\/p>\n<hr \/>\n<h2>\ud83d\udee0\ufe0f C\u00f3digo Final<\/h2>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>procedure TfrmPerformanceDemo.PaginacaoECopiaAsyncQueue(<br \/>\nFDQuery: TFDQuery; FDMem: TFDMemTable; Lote: Integer);<br \/>\nvar<br \/>\nSQLBase: string;<br \/>\nTempQuery: TFDQuery;<br \/>\nbegin<br \/>\nif not Assigned(FDQuery) or not Assigned(FDMem) then Exit;<br \/>\nif Lote &lt;= 0 then Lote := 1000;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>SQLBase := FDQuery.SQL.Text;<br \/>\nSelf.Tag := 0;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>Log2(&#8216;In\u00edcio do Processo COPY QUEUE&#8230;&#8217;);<br \/>\nLog(Format(&#8216;Iniciando c\u00f3pia em segundo plano (lotes de %d registros)&#8230;&#8217;, [Lote]));<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>\/\/ \u2699\ufe0f Cria estrutura do dataset de destino (FDMem)<br \/>\nTempQuery := TFDQuery.Create(nil);<br \/>\ntry<br \/>\nTempQuery.Connection := FDQuery.Connection;<br \/>\nTempQuery.SQL.Text := SQLBase + &#8216; ROWS 1 TO 1&#8217;;<br \/>\nTempQuery.Open;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>FDMem.Close;<br \/>\nFDMem.FieldDefs.Clear;<br \/>\nfor var i := 0 to TempQuery.FieldCount &#8211; 1 do<br \/>\nFDMem.FieldDefs.Add(<br \/>\nTempQuery.Fields[i].FieldName,<br \/>\nTempQuery.Fields[i].DataType,<br \/>\nTempQuery.Fields[i].Size<br \/>\n);<br \/>\nFDMem.CreateDataSet;<br \/>\nfinally<br \/>\nTempQuery.Free;<br \/>\nend;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>\/\/ \ud83d\ude80 Processo paralelo<br \/>\nTTask.Run(<br \/>\nprocedure<br \/>\nvar<br \/>\nTotalRegistros, Processados, FimLote: Integer;<br \/>\nTempQuery: TFDQuery;<br \/>\nTempMem: TFDMemTable;<br \/>\nTempMemClone: TFDMemTable;<br \/>\nbegin<br \/>\nTempQuery := TFDQuery.Create(nil);<br \/>\nTempMem := TFDMemTable.Create(nil);<br \/>\ntry<br \/>\nTempQuery.Connection := FDQuery.Connection;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>\/\/ \ud83d\udd22 Conta total de registros<br \/>\nTempQuery.SQL.Text := &#8216;SELECT COUNT(*) AS TOTAL FROM (&#8216; + SQLBase + &#8216;)&#8217;;<br \/>\nTempQuery.Open;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>TempQuery.FetchOptions.RowsetSize := Lote;<br \/>\nTempQuery.FetchOptions.Mode := fmOnDemand;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>TotalRegistros := TempQuery.FieldByName(&#8216;TOTAL&#8217;).AsInteger;<br \/>\nTempQuery.Close;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>\/\/ Cria estrutura do tempor\u00e1rio<br \/>\nTempMem.FieldDefs.Assign(FDMem.FieldDefs);<br \/>\nTempMem.CreateDataSet;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>Processados := 0;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>\/\/ \ud83d\udd01 L\u00ea em lotes<br \/>\nwhile (Processados &lt; TotalRegistros) and (Self.Tag = 0) do<br \/>\nbegin<br \/>\nFimLote := Min(Processados + Lote, TotalRegistros);<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>TempQuery.SQL.Text := SQLBase + Format(&#8216; ROWS %d TO %d&#8217;, [Processados + 1, FimLote]);<br \/>\nTempQuery.Open;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>TempQuery.FetchOptions.RowsetSize := Lote;<br \/>\nTempQuery.FetchOptions.Mode := fmOnDemand;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>TempMem.AppendData(TempQuery, True);<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>Inc(Processados, TempQuery.RecordCount);<br \/>\nLog(Format(&#8216;Processados %d de %d registros&#8230;&#8217;, [Processados, TotalRegistros]));<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>TempQuery.Close;<br \/>\nend;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>\/\/ \ud83d\udd14 Clona TempMem antes de entrar na thread da UI<br \/>\nTempMemClone := TFDMemTable.Create(nil);<br \/>\nTempMemClone.FieldDefs.Assign(TempMem.FieldDefs);<br \/>\nTempMemClone.CreateDataSet;<br \/>\nTempMemClone.CopyDataSet(TempMem, [coAppend]);<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>\/\/ \u2705 Atualiza UI com todos os dados no final<br \/>\nTThread.Queue(nil,<br \/>\nprocedure<br \/>\nbegin<br \/>\ntry<br \/>\nFDMem.DisableControls;<br \/>\ntry<br \/>\nif FDMem.Active then<br \/>\nFDMem.Close;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>FDMem.CopyDataSet(TempMemClone, [coAppend]);<br \/>\nFDMem.Open;<br \/>\nfinally<br \/>\nFDMem.EnableControls;<br \/>\nend;<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>if Self.Tag = 1 then<br \/>\nLog(&#8216;C\u00f3pia cancelada pelo usu\u00e1rio.&#8217;)<br \/>\nelse<br \/>\nLog(Format(&#8216;C\u00f3pia conclu\u00edda! Total final: %d registros.&#8217;, [FDMem.RecordCount]));<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>Log2(&#8216;T\u00e9rmino do Processo COPY QUEUE&#8230;&#8217;);<br \/>\nfinally<br \/>\nTempMemClone.Free;<br \/>\nend;<br \/>\nend<br \/>\n);<\/p>\n<pre><code class=\"language-delphi\"><\/code><\/pre>\n<p>finally<br \/>\nTempMem.Free;<br \/>\nTempQuery.Free;<br \/>\nend;<br \/>\nend<br \/>\n);<br \/>\nend;<\/p>\n<hr \/>\n<h2>\ud83d\udccc Benef\u00edcios da abordagem<\/h2>\n<ul>\n<li>UI nunca trava<\/li>\n<li>O usu\u00e1rio continua usando o sistema normalmente<\/li>\n<li>Performance muito maior<\/li>\n<li>Garante seguran\u00e7a com FireDAC<\/li>\n<li>Evita erros de dataset<\/li>\n<li>Permite cancelar processamento via <code>Form.Tag<\/code><\/li>\n<li>Funciona no VCL e no UniGUI<\/li>\n<\/ul>\n<hr \/>\n<h2>\ud83c\udfaf Conclus\u00e3o<\/h2>\n<p>Carregar grandes volumes de dados exige uma arquitetura bem planejada. Usando:<\/p>\n<ul>\n<li><code>TTask.Run<\/code><\/li>\n<li><code>TThread.Queue<\/code><\/li>\n<li>carregamento em lotes (pagination)<\/li>\n<li>TFDMemTable com clone seguro<\/li>\n<\/ul>\n<p>\u2026voc\u00ea obt\u00e9m uma solu\u00e7\u00e3o extremamente est\u00e1vel, veloz e profissional \u2014 ideal para sistemas de laborat\u00f3rio, ERPs ou portais de consulta de dados.<\/p>\n<p>&nbsp;<\/p>\n<h3 data-start=\"157\" data-end=\"193\"><img decoding=\"async\" class=\"emoji\" role=\"img\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/16.0.1\/svg\/1f517.svg\" alt=\"\ud83d\udd17\" \/>\u00a0<strong data-start=\"164\" data-end=\"191\">Grupo Geral no WhatsApp<\/strong><\/h3>\n<p data-start=\"194\" data-end=\"458\"><img decoding=\"async\" class=\"emoji\" role=\"img\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/16.0.1\/svg\/1f4ac.svg\" alt=\"\ud83d\udcac\" \/>\u00a0<strong data-start=\"197\" data-end=\"279\">Participe do Delphi Masters e conecte-se com desenvolvedores de todo o Brasil!<\/strong><br data-start=\"279\" data-end=\"282\" \/>Discuss\u00f5es, d\u00favidas, dicas e muita troca de conhecimento.<br data-start=\"339\" data-end=\"342\" \/><img decoding=\"async\" class=\"emoji\" role=\"img\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/16.0.1\/svg\/1f449.svg\" alt=\"\ud83d\udc49\" \/>\u00a0Entre agora:\u00a0<a class=\"\" href=\"https:\/\/chat.whatsapp.com\/HPwXGINRiDS65VgRDLS2lD\" target=\"_new\" rel=\"noopener\" data-start=\"358\" data-end=\"458\">https:\/\/chat.whatsapp.com\/HPwXGINRiDS65VgRDLS2lD<\/a><\/p>\n<h3 data-start=\"1357\" data-end=\"1401\"><img decoding=\"async\" class=\"emoji\" role=\"img\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/16.0.1\/svg\/1f517.svg\" alt=\"\ud83d\udd17\" \/>\u00a0<strong data-start=\"1364\" data-end=\"1399\">Canal do YouTube Delphi Masters<\/strong><\/h3>\n<p data-start=\"1402\" data-end=\"1626\"><img decoding=\"async\" class=\"emoji\" role=\"img\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/16.0.1\/svg\/1f3a5.svg\" alt=\"\ud83c\udfa5\" \/>\u00a0<strong data-start=\"1405\" data-end=\"1478\">Conte\u00fado t\u00e9cnico, lives, tutoriais e entrevistas com feras do Delphi!<\/strong><br data-start=\"1478\" data-end=\"1481\" \/>Se inscreva e ative o sininho para n\u00e3o perder nada.<br data-start=\"1532\" data-end=\"1535\" \/><img decoding=\"async\" class=\"emoji\" role=\"img\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/16.0.1\/svg\/1f449.svg\" alt=\"\ud83d\udc49\" \/>\u00a0Acesse:\u00a0<a class=\"\" href=\"https:\/\/www.youtube.com\/@delphimasters\" target=\"_new\" rel=\"noopener\" data-start=\"1546\" data-end=\"1626\">https:\/\/www.youtube.com\/@delphimasters<\/a><\/p>\n<h3 data-start=\"1115\" data-end=\"1149\"><img decoding=\"async\" class=\"emoji\" role=\"img\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/16.0.1\/svg\/1f517.svg\" alt=\"\ud83d\udd17\" \/>\u00a0<strong data-start=\"1122\" data-end=\"1147\">Comunidade no DISCORD<\/strong><\/h3>\n<p data-start=\"1150\" data-end=\"1350\"><img decoding=\"async\" class=\"emoji\" role=\"img\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/16.0.1\/svg\/1f3a7.svg\" alt=\"\ud83c\udfa7\" \/>\u00a0<strong data-start=\"1153\" data-end=\"1204\">Bate-papo em tempo real com a galera do Delphi!<\/strong><br data-start=\"1204\" data-end=\"1207\" \/>Canais organizados por temas, suporte e muito networking.<br data-start=\"1264\" data-end=\"1267\" \/><img decoding=\"async\" class=\"emoji\" role=\"img\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/16.0.1\/svg\/1f449.svg\" alt=\"\ud83d\udc49\" \/>\u00a0Entre no Discord:\u00a0<a class=\"\" href=\"https:\/\/discord.gg\/pq2YvPZ7Z2\" target=\"_new\" rel=\"noopener\" data-start=\"1288\" data-end=\"1350\">https:\/\/discord.gg\/pq2YvPZ7Z2<\/a><\/p>\n<p data-start=\"1150\" data-end=\"1350\">Edi\u00e7\u00e3o\/Revis\u00e3o:<br \/>\nDi\u00f3genes Henrique &#8211; Autor<br \/>\nDelphi Masters<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Como carregar milh\u00f5es de registros sem travar a interface Em aplica\u00e7\u00f5es que trabalham com grandes volumes de dados \u2014 especialmente sistemas corporativos, ERPs ou softwares industriais \u2014 \u00e9 comum enfrentar travamentos na interface ao executar consultas pesadas. Isso acontece porque a opera\u00e7\u00e3o \u00e9 realizada na main thread, que tamb\u00e9m \u00e9 respons\u00e1vel por redesenhar a [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":83,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[2,9,12,3,11,32,30,33,31,29],"class_list":["post-82","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-delphi","tag-delphibrasil","tag-delphilovers","tag-delphimaster","tag-desenvolvedordelphi","tag-firedac","tag-queue","tag-registros","tag-ttask","tag-tthread"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Processamento Ass\u00edncrono, Threads e Lotes no Delphi com FireDAC - Delphi Masters-BLOG<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Processamento Ass\u00edncrono, Threads e Lotes no Delphi com FireDAC - Delphi Masters-BLOG\" \/>\n<meta property=\"og:description\" content=\"&nbsp; Como carregar milh\u00f5es de registros sem travar a interface Em aplica\u00e7\u00f5es que trabalham com grandes volumes de dados \u2014 especialmente sistemas corporativos, ERPs ou softwares industriais \u2014 \u00e9 comum enfrentar travamentos na interface ao executar consultas pesadas. Isso acontece porque a opera\u00e7\u00e3o \u00e9 realizada na main thread, que tamb\u00e9m \u00e9 respons\u00e1vel por redesenhar a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/\" \/>\n<meta property=\"og:site_name\" content=\"Delphi Masters-BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-27T12:37:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-27T12:38:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/delphimasters.com.br\/blog\/wp-content\/uploads\/2025\/11\/ChatGPT-Image-27-de-nov.-de-2025-09_35_11.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1536\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Di\u00f3genes Henrique\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Di\u00f3genes Henrique\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\\\/\"},\"author\":{\"name\":\"Di\u00f3genes Henrique\",\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/c6f3bfefc02a620ae4d9049abdb6c41a\"},\"headline\":\"Processamento Ass\u00edncrono, Threads e Lotes no Delphi com FireDAC\",\"datePublished\":\"2025-11-27T12:37:47+00:00\",\"dateModified\":\"2025-11-27T12:38:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\\\/\"},\"wordCount\":909,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/ChatGPT-Image-27-de-nov.-de-2025-09_35_11.png\",\"keywords\":[\"delphi\",\"DelphiBrasil\",\"DelphiLovers\",\"delphimaster\",\"DesenvolvedorDelphi\",\"firedac\",\"Queue\",\"registros\",\"TTask\",\"TThread\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\\\/\",\"url\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\\\/\",\"name\":\"Processamento Ass\u00edncrono, Threads e Lotes no Delphi com FireDAC - Delphi Masters-BLOG\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/ChatGPT-Image-27-de-nov.-de-2025-09_35_11.png\",\"datePublished\":\"2025-11-27T12:37:47+00:00\",\"dateModified\":\"2025-11-27T12:38:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\\\/#primaryimage\",\"url\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/ChatGPT-Image-27-de-nov.-de-2025-09_35_11.png\",\"contentUrl\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/ChatGPT-Image-27-de-nov.-de-2025-09_35_11.png\",\"width\":1536,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Processamento Ass\u00edncrono, Threads e Lotes no Delphi com FireDAC\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/\",\"name\":\"BLOG DelphiMasters\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/#organization\",\"name\":\"BLOG DelphiMasters\",\"url\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Delphi-Masters.png\",\"contentUrl\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Delphi-Masters.png\",\"width\":1024,\"height\":1024,\"caption\":\"BLOG DelphiMasters\"},\"image\":{\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.instagram.com\\\/delphimasters\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/c6f3bfefc02a620ae4d9049abdb6c41a\",\"name\":\"Di\u00f3genes Henrique\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f30e94748aee6ed2162ca21de33ff500ec3ca282c29d06801bbc6e8cfbfee8fe?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f30e94748aee6ed2162ca21de33ff500ec3ca282c29d06801bbc6e8cfbfee8fe?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f30e94748aee6ed2162ca21de33ff500ec3ca282c29d06801bbc6e8cfbfee8fe?s=96&d=mm&r=g\",\"caption\":\"Di\u00f3genes Henrique\"},\"description\":\"Com mais de 20 anos de experi\u00eancia em desenvolvimento de sistemas, Di\u00f3genes Henrique \u00e9 especialista em solu\u00e7\u00f5es para o agroneg\u00f3cio \ud83c\udf31, com foco em automa\u00e7\u00e3o, rastreabilidade e integra\u00e7\u00e3o com \u00f3rg\u00e3os reguladores. Ao longo de sua carreira, atuou no desenvolvimento de softwares robustos voltados \u00e0 produ\u00e7\u00e3o de sementes, controle laboratorial e gest\u00e3o administrativa de sementeiras, sempre com uma abordagem estrat\u00e9gica e orientada a resultados \ud83c\udfaf. Atualmente, lidera projetos na Sisgr\u00e3os Sistemas, desenvolvendo solu\u00e7\u00f5es inovadoras para laborat\u00f3rios de an\u00e1lise de sementes, com conformidade \u00e0s normas ISO 17025 e RAS \u2699\ufe0f. Anteriormente, atuou na SISLITE, com foco em sistemas fiscais integrados \u00e0 SEFAZ, utilizando Delphi 7 e Firebird \ud83e\udde9. Mesmo sem forma\u00e7\u00e3o acad\u00eamica formal \ud83c\udf93, construiu uma s\u00f3lida expertise pr\u00e1tica, com dom\u00ednio t\u00e9cnico avan\u00e7ado em: * Delphi (7 a 10.3 Rio) * Firebird * UNIGUI * ACBr * Clean Architecture * TDD\\\/DDD * APIs REST usando DMVC \ud83d\udee0\ufe0f Al\u00e9m de suas compet\u00eancias t\u00e9cnicas, Di\u00f3genes se destaca pela lideran\u00e7a, \u00e9tica profissional e compromisso com a qualidade e inova\u00e7\u00e3o \u2b50. Como Testemunha de Jeov\u00e1, aplica princ\u00edpios de integridade e moral em sua conduta profissional, refletindo valores s\u00f3lidos em todas as suas entregas. Atualmente, busca se tornar um MVP Embarcadero \ud83c\udfc6, contribuindo com a comunidade Delphi e elevando o padr\u00e3o tecnol\u00f3gico no setor agro \ud83d\ude9c.\",\"url\":\"https:\\\/\\\/delphimasters.com.br\\\/blog\\\/author\\\/diogenes\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Processamento Ass\u00edncrono, Threads e Lotes no Delphi com FireDAC - Delphi Masters-BLOG","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/","og_locale":"pt_BR","og_type":"article","og_title":"Processamento Ass\u00edncrono, Threads e Lotes no Delphi com FireDAC - Delphi Masters-BLOG","og_description":"&nbsp; Como carregar milh\u00f5es de registros sem travar a interface Em aplica\u00e7\u00f5es que trabalham com grandes volumes de dados \u2014 especialmente sistemas corporativos, ERPs ou softwares industriais \u2014 \u00e9 comum enfrentar travamentos na interface ao executar consultas pesadas. Isso acontece porque a opera\u00e7\u00e3o \u00e9 realizada na main thread, que tamb\u00e9m \u00e9 respons\u00e1vel por redesenhar a [&hellip;]","og_url":"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/","og_site_name":"Delphi Masters-BLOG","article_published_time":"2025-11-27T12:37:47+00:00","article_modified_time":"2025-11-27T12:38:47+00:00","og_image":[{"width":1536,"height":1024,"url":"https:\/\/delphimasters.com.br\/blog\/wp-content\/uploads\/2025\/11\/ChatGPT-Image-27-de-nov.-de-2025-09_35_11.png","type":"image\/png"}],"author":"Di\u00f3genes Henrique","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Di\u00f3genes Henrique","Est. tempo de leitura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/#article","isPartOf":{"@id":"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/"},"author":{"name":"Di\u00f3genes Henrique","@id":"https:\/\/delphimasters.com.br\/blog\/#\/schema\/person\/c6f3bfefc02a620ae4d9049abdb6c41a"},"headline":"Processamento Ass\u00edncrono, Threads e Lotes no Delphi com FireDAC","datePublished":"2025-11-27T12:37:47+00:00","dateModified":"2025-11-27T12:38:47+00:00","mainEntityOfPage":{"@id":"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/"},"wordCount":909,"commentCount":0,"publisher":{"@id":"https:\/\/delphimasters.com.br\/blog\/#organization"},"image":{"@id":"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/#primaryimage"},"thumbnailUrl":"https:\/\/delphimasters.com.br\/blog\/wp-content\/uploads\/2025\/11\/ChatGPT-Image-27-de-nov.-de-2025-09_35_11.png","keywords":["delphi","DelphiBrasil","DelphiLovers","delphimaster","DesenvolvedorDelphi","firedac","Queue","registros","TTask","TThread"],"articleSection":["Blog"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/","url":"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/","name":"Processamento Ass\u00edncrono, Threads e Lotes no Delphi com FireDAC - Delphi Masters-BLOG","isPartOf":{"@id":"https:\/\/delphimasters.com.br\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/#primaryimage"},"image":{"@id":"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/#primaryimage"},"thumbnailUrl":"https:\/\/delphimasters.com.br\/blog\/wp-content\/uploads\/2025\/11\/ChatGPT-Image-27-de-nov.-de-2025-09_35_11.png","datePublished":"2025-11-27T12:37:47+00:00","dateModified":"2025-11-27T12:38:47+00:00","breadcrumb":{"@id":"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/#primaryimage","url":"https:\/\/delphimasters.com.br\/blog\/wp-content\/uploads\/2025\/11\/ChatGPT-Image-27-de-nov.-de-2025-09_35_11.png","contentUrl":"https:\/\/delphimasters.com.br\/blog\/wp-content\/uploads\/2025\/11\/ChatGPT-Image-27-de-nov.-de-2025-09_35_11.png","width":1536,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/delphimasters.com.br\/blog\/processamento-assincrono-threads-e-lotes-no-delphi-com-firedac\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/delphimasters.com.br\/blog\/"},{"@type":"ListItem","position":2,"name":"Processamento Ass\u00edncrono, Threads e Lotes no Delphi com FireDAC"}]},{"@type":"WebSite","@id":"https:\/\/delphimasters.com.br\/blog\/#website","url":"https:\/\/delphimasters.com.br\/blog\/","name":"BLOG DelphiMasters","description":"","publisher":{"@id":"https:\/\/delphimasters.com.br\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/delphimasters.com.br\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/delphimasters.com.br\/blog\/#organization","name":"BLOG DelphiMasters","url":"https:\/\/delphimasters.com.br\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/delphimasters.com.br\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/delphimasters.com.br\/blog\/wp-content\/uploads\/2025\/07\/Delphi-Masters.png","contentUrl":"https:\/\/delphimasters.com.br\/blog\/wp-content\/uploads\/2025\/07\/Delphi-Masters.png","width":1024,"height":1024,"caption":"BLOG DelphiMasters"},"image":{"@id":"https:\/\/delphimasters.com.br\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.instagram.com\/delphimasters\/"]},{"@type":"Person","@id":"https:\/\/delphimasters.com.br\/blog\/#\/schema\/person\/c6f3bfefc02a620ae4d9049abdb6c41a","name":"Di\u00f3genes Henrique","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/secure.gravatar.com\/avatar\/f30e94748aee6ed2162ca21de33ff500ec3ca282c29d06801bbc6e8cfbfee8fe?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f30e94748aee6ed2162ca21de33ff500ec3ca282c29d06801bbc6e8cfbfee8fe?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f30e94748aee6ed2162ca21de33ff500ec3ca282c29d06801bbc6e8cfbfee8fe?s=96&d=mm&r=g","caption":"Di\u00f3genes Henrique"},"description":"Com mais de 20 anos de experi\u00eancia em desenvolvimento de sistemas, Di\u00f3genes Henrique \u00e9 especialista em solu\u00e7\u00f5es para o agroneg\u00f3cio \ud83c\udf31, com foco em automa\u00e7\u00e3o, rastreabilidade e integra\u00e7\u00e3o com \u00f3rg\u00e3os reguladores. Ao longo de sua carreira, atuou no desenvolvimento de softwares robustos voltados \u00e0 produ\u00e7\u00e3o de sementes, controle laboratorial e gest\u00e3o administrativa de sementeiras, sempre com uma abordagem estrat\u00e9gica e orientada a resultados \ud83c\udfaf. Atualmente, lidera projetos na Sisgr\u00e3os Sistemas, desenvolvendo solu\u00e7\u00f5es inovadoras para laborat\u00f3rios de an\u00e1lise de sementes, com conformidade \u00e0s normas ISO 17025 e RAS \u2699\ufe0f. Anteriormente, atuou na SISLITE, com foco em sistemas fiscais integrados \u00e0 SEFAZ, utilizando Delphi 7 e Firebird \ud83e\udde9. Mesmo sem forma\u00e7\u00e3o acad\u00eamica formal \ud83c\udf93, construiu uma s\u00f3lida expertise pr\u00e1tica, com dom\u00ednio t\u00e9cnico avan\u00e7ado em: * Delphi (7 a 10.3 Rio) * Firebird * UNIGUI * ACBr * Clean Architecture * TDD\/DDD * APIs REST usando DMVC \ud83d\udee0\ufe0f Al\u00e9m de suas compet\u00eancias t\u00e9cnicas, Di\u00f3genes se destaca pela lideran\u00e7a, \u00e9tica profissional e compromisso com a qualidade e inova\u00e7\u00e3o \u2b50. Como Testemunha de Jeov\u00e1, aplica princ\u00edpios de integridade e moral em sua conduta profissional, refletindo valores s\u00f3lidos em todas as suas entregas. Atualmente, busca se tornar um MVP Embarcadero \ud83c\udfc6, contribuindo com a comunidade Delphi e elevando o padr\u00e3o tecnol\u00f3gico no setor agro \ud83d\ude9c.","url":"https:\/\/delphimasters.com.br\/blog\/author\/diogenes\/"}]}},"_links":{"self":[{"href":"https:\/\/delphimasters.com.br\/blog\/wp-json\/wp\/v2\/posts\/82","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/delphimasters.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/delphimasters.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/delphimasters.com.br\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/delphimasters.com.br\/blog\/wp-json\/wp\/v2\/comments?post=82"}],"version-history":[{"count":2,"href":"https:\/\/delphimasters.com.br\/blog\/wp-json\/wp\/v2\/posts\/82\/revisions"}],"predecessor-version":[{"id":85,"href":"https:\/\/delphimasters.com.br\/blog\/wp-json\/wp\/v2\/posts\/82\/revisions\/85"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/delphimasters.com.br\/blog\/wp-json\/wp\/v2\/media\/83"}],"wp:attachment":[{"href":"https:\/\/delphimasters.com.br\/blog\/wp-json\/wp\/v2\/media?parent=82"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/delphimasters.com.br\/blog\/wp-json\/wp\/v2\/categories?post=82"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/delphimasters.com.br\/blog\/wp-json\/wp\/v2\/tags?post=82"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}