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