Post: [Paralelismo no Delphi] Trabalhando com Semáforo

Alessandro Medeiros

Fala ai Radizeiros e Radizeiras, tudo bem com vocês?

Nossa série sobre paralelismo tem sido muito legal, e a cada post tenho curtido muito.

E você conhece o conceito de semáforos?

Existe alguns tipos de semáforos para que possamos trabalhar.

No código abaixo eu tenho uma busca executando dentro do banco de dados, onde eu criei um Anonymous Thread.

procedure TForm1.Button1Click(Sender: TObject);
begin
    TThread.CreateAnonymousThread(
    procedure
    begin
        TThread.Sleep(1000);
        TThread.Synchronize(TThread.CurrentThread,
        procedure
        begin
            BuscarDados('SELECT * FROM CLIENTE');
        end);
    end).Start;

    TThread.CreateAnonymousThread(
    procedure
    begin
        TThread.Sleep(1000);
        TThread.Synchronize(TThread.CurrentThread,
        procedure
        begin
            BuscarDados('SELECT * FROM MENSAGERIA');
        end);
    end).Start;
end;

procedure TForm1.BuscarDados(aSql: String);
begin
    FDQuery1.Open(aSql);
    Memo1.Lines.Add(aSql);
end;

Observe que no primeiro Anonymous eu passo um sleep e sincronizando para fazer uma busca de dados, que está utilizando o FDQuery dentro do método de buscar dados.

Muito simples, ele irá disparar duas Threads ao mesmo tempo para fazer essas buscas de dados.

Observe que o exemplo executou o cliente e logo em seguida a mensageira.

Foi disparado essas duas Threads.

O intuito de lhe mostrar esse exemplo simples de fazer uma busca no banco de dados usando Thread, é para que você entenda como funciona os semáforos da nossa aplicação.

E a primeira forma de fazer o semáforo é a utilização do TCriticalSection.

Essa classe faz parte a biblioteca SyncObjs.

procedure TForm1.Button2Click(Sender: TObject);
var
    FSession : TCriticalSection;
begin
    FSession := TCriticalSection.Create;
    TThread.CreateAnonymousThread(
    procedure
    begin
        FSession.Enter;
        try
            TThread.Sleep(1000);
            TThread.Synchronize(TThread.CurrentThread,
            procedure
            begin
                BuscarDados('SELECT * FROM CLIENTE');
            end);
        finally
            FSesseion.Leave;
        end;
     end).Start;

     TThread.CreateAnonymousThread(
     procedure
     begin
         FSession.Enter;
         try
             TThread.Sleep(1000);
             TThread.Synchronize(TThread.CurrentThread,
             procedure
             begin
                 BuscarDados('SELECT * FROM MENSAGERIA');
             end);
         finally
             FSesseion.Leave;
         end;
     end).Start;
end;

Observe que para utilizar o TCriticalSection eu tive que instanciar, para que possamos trabalhar com ele.

Esse Critical Section é simplesmente um sinalizador para as Threads.

Observe que no código acima eu utilizo o Critical Section avisando que entrei em execução de um processo, e desta forma ele não irá executar nada enquanto não sair da execução desse processo.

Enquanto não liberar essa Thread ele não irá permitir a execução de outro.

Se você estiver executando em uma Thread separada uma ação e depende do resultado dela para que possa ser realizada uma segunda ação.

Com o Critical Section você faz esse Lock, ou seja, você trava seu processo na Thread, esperando o seu término para depois liberar para executar todo o restante.

Observe que ao clicar no primeiro botão, onde estamos executando o primeiro código, ele não respeita a ordem, agora ao clicar no segundo botão é nítido a ordem da execução, isso graças ao Critical Section.

Essa é uma das forma de criar semáforos.

Muito legal não é pessoal?

Trabalhar com as bibliotecas de paralelismo é espetacular, e conteúdos como estes não podem faltar nas suas consultas.

Pensando nisso eu criei o CLUBE DOS PROGRAMADORES EM DELPHI, uma verdadeira gama de conteúdos, uma NETFLIX para os programadores em Delphi.

Esse post faz parte de um dos conteúdos que temos dentro do clube, e se você ainda não faz parte clique no link abaixo e venha fazer parte desse clube, que constantemente tem novos conteúdos.

E caso você tenha interesse de conhecer mais sobre PPL acessa o nosso portal do CLUBE DE PROGRAMADORES EM DELPHI, onde você não só terá conteúdos relacionados aos generics, mas uma quantidade enorme de conteúdos que poderá lhe ajudar muito no seu dia a dia, é uma verdadeira NETFLIX para os programadores Delphi.

CLIQUE AQUI E SAIBA MAIS SOBRE O CLUBE DOS PROGRAMADORES DELPHI


Faça sua busca

CATEGORIAS

POSTS RECENTES

E caso você tem interesse de conhecer mais sobre [Paralelismo no Delphi] Trabalhando com Semáforo, acesse o nosso portal do CLUBE DE PROGRAMADORES EM DELPHI
Você não terá só conteúdos relacionados ao [Paralelismo no Delphi] Trabalhando com Semáforo, mas uma quantidade enorme de conteúdos que poderá lhe ajudar muito no seu dia a dia, é uma verdadeira NETFLIX para os programadores Delphi.
Gostou?
Compartilhe:

Embarque no foguete com milhares de devs para aprender desenvolvimento, evoluir de forma contínua e se manter relevante no mercado.

Dúvidas
Cadastre-se em nossa lista

Para ter acesso em primeira mão, a tudo que acontece na Academia do Código, basta se cadastrar em nossa lista

Grupo Thulio Bittencourt | Academia do Código

#FaçaPartedaHistória

Copyright © 2024 – Todos os direitos reservados