{"id":2299,"date":"2023-08-07T12:09:26","date_gmt":"2023-08-07T15:09:26","guid":{"rendered":"https:\/\/gladiston.net.br\/?page_id=2299"},"modified":"2023-08-07T17:31:58","modified_gmt":"2023-08-07T20:31:58","slug":"impedindo-duplicatas-do-mesmo-programa","status":"publish","type":"page","link":"https:\/\/gladiston.net.br\/en\/programacao\/impedindo-duplicatas-do-mesmo-programa\/","title":{"rendered":"Impedindo duplicatas do mesmo programa"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Um problema comum para ser resolvidos em desktops \u00e9 que evitar que o usu\u00e1rio carregue o mesmo programa diversas vezes. Neste artigo, vamos entender melhor este tipo de problema.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">ENTENDENDO O PROBLEMA<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Quando um usu\u00e1rio n\u00e3o se apercebe, mas carrega mais uma vez um programa que j\u00e1 tem na mem\u00f3ria isso \u00e9 ruim em v\u00e1rios aspectos: (1) \u00e9 mais consumo de mem\u00f3ria e recursos desnecessariamente carregados; (2) isso \u00e9 um ruim especialmente quando uma conex\u00e3o com o banco de dados est\u00e1 envolvida, pois cada programa trar\u00e1 um contexto transacional que concorre\u00e1 com a outra inst\u00e2ncia do mesmo programa e se houver opera\u00e7\u00f5es bloqueantes, outros usu\u00e1rios e si mesmo poder\u00e3o ficar esperando indefinidamente pelo recurso ser liberado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ent\u00e3o n\u00e3o h\u00e1 duvidas de que bloquear uma segunda inst\u00e2ncia do mesmo programa \u00e9 o correto a ser feito. H\u00e1 v\u00e1rios m\u00e9todos para isso, mas qual deles usar?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Muitos programadores usam um m\u00e9todo bastante simples, observam se j\u00e1 h\u00e1 um programe.exe carregado e se positivo ent\u00e3o decide abortar a carga. Um problema nessa abordagem \u00e9 que se o sistema operacional que estamos executando o programa for multi-terminal ou multi-usu\u00e1rio ent\u00e3o outros usu\u00e1rios n\u00e3o conseguir\u00e3o carregar o mesmo programa. O que desejamos bloquear \u00e9 a duplicata advindo do mesmo usu\u00e1rio e n\u00e3o de usu\u00e1rios diferentes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se a palavra &#8220;multi-terminal&#8221; lhe soou estranha, basta entender que computadores atuais podem permitir que v\u00e1rios usu\u00e1rios remotos possam acessar um computador central e dal\u00ed rodar seus programas. O Windows Terminal Server(RDS), TS Plus ou GoGlobal s\u00e3o exemplos de softwares populares que permitem transformar um Windows num ambiente multi-terminal para acessos locais ou remotos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Qualquer que seja a solu\u00e7\u00e3o, precisaremos lidar com o fato em que o mesmo programa.exe pode estar carregado em multiplas inst\u00e2ncias, apenas n\u00e3o devem ser do mesmo usu\u00e1rio. Isso \u00e9 imprescindivel para que seu programa possa funcionar em ambientes multi-usu\u00e1rio e multi-terminal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Uma outra abordagem que programadores costumam usar \u00e9 uma fun\u00e7\u00e3o da WinAPI intitulada FindWindow, ela basicamente procura por uma janela(classe) com um certo nome. Ela ir\u00e1 resolver o problema, mas tem dois problemas (1) custo da opera\u00e7\u00e3o, pois o Windows carrega muitos programas e logo tem muitas classes e o usu\u00e1rio pode vir a carregar muitos outros programas e ao submeter um FindWindow na raiz do desktop dele ent\u00e3o levar\u00e1 tempo consider\u00e1vel encontrar uma em espec\u00edfico e outros problema (2) \u00e9 que uma janela(classe) de um programa que n\u00e3o tem nada a ver com o seu tenha o mesmo nome e isso far\u00e1 com que o seu programa nunca seja executado sob esta situa\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">LIDANDO COM O PROBLEMA<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Usando com o Delphi e o FreePascal podemos lidar com o problema usando MUTEX. MUTEX para efeito pr\u00e1tico \u00e9 similar a criar constantes no formato texto visiveis para outros programas enxergaem na mesma sess\u00e3o(desktop) do usu\u00e1rio, mas que apenas existe enquanto o programa que os criou ainda existir, quando o programa morre, estas constantes que o programa criou v\u00e3o embora tamb\u00e9m.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A solu\u00e7\u00e3o portanto \u00e9 testar a existencia de um MUTEX com um nome de referencia &#8211; e em nosso exemplo vamos usar como referencia o titulo do formul\u00e1rio principal &#8211; e se ela existir ent\u00e3o n\u00e3o prosseguiremos porque consideraremos que j\u00e1 existe uma instancia do programa e opcionalmente talvez apresentemos uma mensagem de erro. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diferentemente no FindWindow, o MUTEX ser\u00e1 instantaneo. Isso resolver\u00e1 o problema porque cada execu\u00e7\u00e3o seguinte encontrar\u00e1 o nome de referencia. O bom dessa solu\u00e7\u00e3o \u00e9 que ela funcionar\u00e1 em ambientes multi-terminais e muulti-terminal por causa do comportamento do MUTEX.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas \u00e9 poss\u00edvel acrescentar um bonus, caso o MUTEX seja detectado podemos usar o FindWindow para encontrar a instancia previamente carregada e restaur\u00e1-la para a tela, afinal talvez esteja minimizado e o usu\u00e1rio n\u00e3o conseguiu not\u00e1-lo. Aqui vai o alerta, lembre-se de que o FindWindow pode demorar ent\u00e3o s\u00f3 use-o no exemplo abaixo se a performance n\u00e3o for um quesito importante comparado a facilidade do programa se auto-expor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O codigo a seguir ficar\u00e1 no arquivo .dpr no caso de usarmos o Delphi ouu no arquivo .lpr no caso de estarmos programando em Lazarus+FPC, vamos ao c\u00f3digo:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:false,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;pascal&quot;,&quot;mime&quot;:&quot;text\/x-pascal&quot;,&quot;theme&quot;:&quot;default&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:true,&quot;lineWrapping&quot;:true,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;Pascal&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;pascal&quot;}\">program Programa;\n\n(...)\n\nuses\n  (...)  \n  Forms,\n  Windows;\n\n{$R *.res}\n\nvar\n  MutexHnd: Cardinal;\n  Handle: HWND;\n  sTitle:String;\nbegin\n  \/\/ unit Windows \u00e9 requerida por causa do FindWindow, IsWindowVisible\n  sTitle:='Meu Titulo'\n  RequireDerivedFormResource:=True;  \/\/ Lazarus+FPC only\n  Application.Scaled:=True; \/\/ Lazarus+FPC Only\n\n  MutexHnd := CreateMutex(nil, False, pChar(sTitle));\n  If GetLastError = ERROR_ALREADY_EXISTS Then\n  begin\n    \/\/TfmPrincipal \u00e9 a classe do form principal e\n    \/\/ 'Meu Titulo' \u00e9 o caption do form principal\n    \/\/ N\u00e3o funcionar\u00e1 em tempo de design porque a janela(caption) que procuro\n    \/\/ para todas as hipoteses testadas esta visivel por causa da IDE.\n    Handle := FindWindow(nil, pChar(sTitle));\n    if Handle &lt;&gt; 0 then\n    begin\n      \/\/Application.MessageBox(\n      \/\/  pChar(sTitle+' j\u00e1 est\u00e1 em execu\u00e7\u00e3o, observe a bandeja do sistema.'+sLineBreak+\n      \/\/  'Se fez o logout nos ultimos instantes, '+\n      \/\/  'aguarde uns 60 segundos para carregar-me novamente.'),\n      \/\/  pChar('Ops, j\u00e1 estou carregado:')\n      \/\/  );\n      if not IsWindowVisible(Handle) then\n        ShowWindow(Handle, SW_RESTORE);\n      SetForegroundWindow(Handle);\n      Application.Terminate;\n    end\n  end\n  else\n  begin\n    Application.Initialize;\n    Application.Title:=sTitle;\n    Application.ShowMainForm:=True;  \/\/ Delphi only\n    Application.MainFormOnTaskbar := True;  \/\/ Delphi only\n    Application.CreateForm(TfmPrincipal, fmPrincipal);\n    fmPrincipal.Caption:=sTitle;  \/\/ n\u00e3o mude o caption depois\n    Application.Run;\n  end;\nend.  <\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">O c\u00f3digo acima \u00e9 justamente colocado no carregamento do projeto, isto \u00e9, no arquivo .dpr no caso do Delphi ou .lpr no caso do Lazarus+FPC.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As linhas marcadas como &#8216;Delphi only&#8217; dever\u00e3o ser removidas caso voc\u00ea esteja usando o Lazarus e as linhas comentadas como &#8216;Lazarus+fpc&#8217; voc\u00ea as remove se estiver usando Delphi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CONCLUSION<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Assim temos um c\u00f3digo plenamente funcional. Existem por a\u00ed outros c\u00f3digos diferentes, mas alguuns deles esbarram no problema comum j\u00e1 citado, n\u00e3o sabem lidar com ambientes multi-tarefas ou multi-usu\u00e1rios e o nosso codigo foi testado neste contexto.<\/p>","protected":false},"excerpt":{"rendered":"<p>Um problema comum para ser resolvidos em desktops \u00e9 que evitar que o usu\u00e1rio carregue o mesmo programa diversas vezes. Neste artigo, vamos entender melhor este tipo de problema. ENTENDENDO O PROBLEMA Quando um usu\u00e1rio n\u00e3o se apercebe, mas carrega mais uma vez um programa que j\u00e1 tem na mem\u00f3ria isso \u00e9 ruim em v\u00e1rios [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":145,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"templates\/template-full-width.php","meta":{"footnotes":""},"class_list":["post-2299","page","type-page","status-publish","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.8 - aioseo.com -->\n\t<meta name=\"description\" content=\"Um problema comum para ser resolvidos em desktops \u00e9 que evitar que o usu\u00e1rio carregue o mesmo programa diversas vezes. Neste artigo, vamos entender melhor este tipo de problema. ENTENDENDO O PROBLEMA Quando um usu\u00e1rio n\u00e3o se apercebe, mas carrega mais uma vez um programa que j\u00e1 tem na mem\u00f3ria isso \u00e9 ruim em v\u00e1rios\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/gladiston.net.br\/en\/programacao\/impedindo-duplicatas-do-mesmo-programa\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.8\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Gladiston Santana - Um site para chamar de meu\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Impedindo duplicatas do mesmo programa - Gladiston Santana\" \/>\n\t\t<meta property=\"og:description\" content=\"Um problema comum para ser resolvidos em desktops \u00e9 que evitar que o usu\u00e1rio carregue o mesmo programa diversas vezes. Neste artigo, vamos entender melhor este tipo de problema. ENTENDENDO O PROBLEMA Quando um usu\u00e1rio n\u00e3o se apercebe, mas carrega mais uma vez um programa que j\u00e1 tem na mem\u00f3ria isso \u00e9 ruim em v\u00e1rios\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/gladiston.net.br\/en\/programacao\/impedindo-duplicatas-do-mesmo-programa\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2023-08-07T15:09:26+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2023-08-07T20:31:58+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Impedindo duplicatas do mesmo programa - Gladiston Santana\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Um problema comum para ser resolvidos em desktops \u00e9 que evitar que o usu\u00e1rio carregue o mesmo programa diversas vezes. Neste artigo, vamos entender melhor este tipo de problema. ENTENDENDO O PROBLEMA Quando um usu\u00e1rio n\u00e3o se apercebe, mas carrega mais uma vez um programa que j\u00e1 tem na mem\u00f3ria isso \u00e9 ruim em v\u00e1rios\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/programacao\\\/impedindo-duplicatas-do-mesmo-programa\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/gladiston.net.br\\\/en#listItem\",\"position\":1,\"name\":\"In\\u00edcio\",\"item\":\"https:\\\/\\\/gladiston.net.br\\\/en\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/programacao\\\/#listItem\",\"name\":\"Programa\\u00e7\\u00e3o\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/programacao\\\/#listItem\",\"position\":2,\"name\":\"Programa\\u00e7\\u00e3o\",\"item\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/programacao\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/programacao\\\/impedindo-duplicatas-do-mesmo-programa\\\/#listItem\",\"name\":\"Impedindo duplicatas do mesmo programa\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/gladiston.net.br\\\/en#listItem\",\"name\":\"In\\u00edcio\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/programacao\\\/impedindo-duplicatas-do-mesmo-programa\\\/#listItem\",\"position\":3,\"name\":\"Impedindo duplicatas do mesmo programa\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/programacao\\\/#listItem\",\"name\":\"Programa\\u00e7\\u00e3o\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/#organization\",\"name\":\"Gladiston Santana\",\"description\":\"Um site para chamar de meu\",\"url\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/programacao\\\/impedindo-duplicatas-do-mesmo-programa\\\/#webpage\",\"url\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/programacao\\\/impedindo-duplicatas-do-mesmo-programa\\\/\",\"name\":\"Impedindo duplicatas do mesmo programa - Gladiston Santana\",\"description\":\"Um problema comum para ser resolvidos em desktops \\u00e9 que evitar que o usu\\u00e1rio carregue o mesmo programa diversas vezes. Neste artigo, vamos entender melhor este tipo de problema. ENTENDENDO O PROBLEMA Quando um usu\\u00e1rio n\\u00e3o se apercebe, mas carrega mais uma vez um programa que j\\u00e1 tem na mem\\u00f3ria isso \\u00e9 ruim em v\\u00e1rios\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/programacao\\\/impedindo-duplicatas-do-mesmo-programa\\\/#breadcrumblist\"},\"datePublished\":\"2023-08-07T12:09:26-03:00\",\"dateModified\":\"2023-08-07T17:31:58-03:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/\",\"name\":\"Gladiston Santana\",\"description\":\"Um site para chamar de meu\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/gladiston.net.br\\\/en\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Impedindo duplicatas do mesmo programa - Gladiston Santana","description":"Um problema comum para ser resolvidos em desktops \u00e9 que evitar que o usu\u00e1rio carregue o mesmo programa diversas vezes. Neste artigo, vamos entender melhor este tipo de problema. ENTENDENDO O PROBLEMA Quando um usu\u00e1rio n\u00e3o se apercebe, mas carrega mais uma vez um programa que j\u00e1 tem na mem\u00f3ria isso \u00e9 ruim em v\u00e1rios","canonical_url":"https:\/\/gladiston.net.br\/en\/programacao\/impedindo-duplicatas-do-mesmo-programa\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/gladiston.net.br\/en\/programacao\/impedindo-duplicatas-do-mesmo-programa\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/gladiston.net.br\/en#listItem","position":1,"name":"In\u00edcio","item":"https:\/\/gladiston.net.br\/en","nextItem":{"@type":"ListItem","@id":"https:\/\/gladiston.net.br\/en\/programacao\/#listItem","name":"Programa\u00e7\u00e3o"}},{"@type":"ListItem","@id":"https:\/\/gladiston.net.br\/en\/programacao\/#listItem","position":2,"name":"Programa\u00e7\u00e3o","item":"https:\/\/gladiston.net.br\/en\/programacao\/","nextItem":{"@type":"ListItem","@id":"https:\/\/gladiston.net.br\/en\/programacao\/impedindo-duplicatas-do-mesmo-programa\/#listItem","name":"Impedindo duplicatas do mesmo programa"},"previousItem":{"@type":"ListItem","@id":"https:\/\/gladiston.net.br\/en#listItem","name":"In\u00edcio"}},{"@type":"ListItem","@id":"https:\/\/gladiston.net.br\/en\/programacao\/impedindo-duplicatas-do-mesmo-programa\/#listItem","position":3,"name":"Impedindo duplicatas do mesmo programa","previousItem":{"@type":"ListItem","@id":"https:\/\/gladiston.net.br\/en\/programacao\/#listItem","name":"Programa\u00e7\u00e3o"}}]},{"@type":"Organization","@id":"https:\/\/gladiston.net.br\/en\/#organization","name":"Gladiston Santana","description":"Um site para chamar de meu","url":"https:\/\/gladiston.net.br\/en\/"},{"@type":"WebPage","@id":"https:\/\/gladiston.net.br\/en\/programacao\/impedindo-duplicatas-do-mesmo-programa\/#webpage","url":"https:\/\/gladiston.net.br\/en\/programacao\/impedindo-duplicatas-do-mesmo-programa\/","name":"Impedindo duplicatas do mesmo programa - Gladiston Santana","description":"Um problema comum para ser resolvidos em desktops \u00e9 que evitar que o usu\u00e1rio carregue o mesmo programa diversas vezes. Neste artigo, vamos entender melhor este tipo de problema. ENTENDENDO O PROBLEMA Quando um usu\u00e1rio n\u00e3o se apercebe, mas carrega mais uma vez um programa que j\u00e1 tem na mem\u00f3ria isso \u00e9 ruim em v\u00e1rios","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/gladiston.net.br\/en\/#website"},"breadcrumb":{"@id":"https:\/\/gladiston.net.br\/en\/programacao\/impedindo-duplicatas-do-mesmo-programa\/#breadcrumblist"},"datePublished":"2023-08-07T12:09:26-03:00","dateModified":"2023-08-07T17:31:58-03:00"},{"@type":"WebSite","@id":"https:\/\/gladiston.net.br\/en\/#website","url":"https:\/\/gladiston.net.br\/en\/","name":"Gladiston Santana","description":"Um site para chamar de meu","inLanguage":"en-US","publisher":{"@id":"https:\/\/gladiston.net.br\/en\/#organization"}}]},"og:locale":"en_US","og:site_name":"Gladiston Santana - Um site para chamar de meu","og:type":"article","og:title":"Impedindo duplicatas do mesmo programa - Gladiston Santana","og:description":"Um problema comum para ser resolvidos em desktops \u00e9 que evitar que o usu\u00e1rio carregue o mesmo programa diversas vezes. Neste artigo, vamos entender melhor este tipo de problema. ENTENDENDO O PROBLEMA Quando um usu\u00e1rio n\u00e3o se apercebe, mas carrega mais uma vez um programa que j\u00e1 tem na mem\u00f3ria isso \u00e9 ruim em v\u00e1rios","og:url":"https:\/\/gladiston.net.br\/en\/programacao\/impedindo-duplicatas-do-mesmo-programa\/","article:published_time":"2023-08-07T15:09:26+00:00","article:modified_time":"2023-08-07T20:31:58+00:00","twitter:card":"summary","twitter:title":"Impedindo duplicatas do mesmo programa - Gladiston Santana","twitter:description":"Um problema comum para ser resolvidos em desktops \u00e9 que evitar que o usu\u00e1rio carregue o mesmo programa diversas vezes. Neste artigo, vamos entender melhor este tipo de problema. ENTENDENDO O PROBLEMA Quando um usu\u00e1rio n\u00e3o se apercebe, mas carrega mais uma vez um programa que j\u00e1 tem na mem\u00f3ria isso \u00e9 ruim em v\u00e1rios"},"aioseo_meta_data":{"post_id":"2299","title":null,"description":null,"keywords":[],"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":[],"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"WebPage","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2023-08-07 15:09:26","updated":"2025-06-04 10:44:10","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/gladiston.net.br\/en\" title=\"In\u00edcio\">In\u00edcio<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/gladiston.net.br\/en\/programacao\/\" title=\"Programa\u00e7\u00e3o\">Programa\u00e7\u00e3o<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tImpedindo duplicatas do mesmo programa\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"In\u00edcio","link":"https:\/\/gladiston.net.br\/en"},{"label":"Programa\u00e7\u00e3o","link":"https:\/\/gladiston.net.br\/en\/programacao\/"},{"label":"Impedindo duplicatas do mesmo programa","link":"https:\/\/gladiston.net.br\/en\/programacao\/impedindo-duplicatas-do-mesmo-programa\/"}],"_links":{"self":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/2299","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/comments?post=2299"}],"version-history":[{"count":23,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/2299\/revisions"}],"predecessor-version":[{"id":2335,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/2299\/revisions\/2335"}],"up":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/145"}],"wp:attachment":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/media?parent=2299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}