|
Home → WINDEV 25 → WD - Multi Threads com Processamento Serial X Processamento Paralelo |
WD - Multi Threads com Processamento Serial X Processamento Paralelo |
Started by BOLLER ADRIANO, Jul., 21 2016 11:21 AM - 3 replies |
| |
| | | |
|
| |
Registered member 3,657 messages Popularité : +175 (223 votes) |
|
Posted on July, 21 2016 - 11:21 AM |
Prezados,
Segue 2 exemplos de Multi threads com Processamento Serial e Processamento Paralelo.
O que é mais rápido, serial ou paralelo?
Bom em todas as situações desde comunicação, equipamentos, tarefas o PARALELO é sem sombra de dúvida o mais rápido.
VARIAVEIS USADAS PARA OS DOIS EXEMPLOS
Procedure MaFenêtre()
ghDébut est une Heure
gxEncoursTotal est un numérique gxEncoursTotalParallèle est un numérique <section critique>
Vejamos primeiro o exemplo de Processamento SERIAL: ####################################################
ghDébut = HeureSys()
TableSupprimeTout(TABLE_Référence) gxEncoursTotal = 0
POUR TOUT CLIENT nLigne est un entier = TableAjouteLigne(TABLE_Référence,CLIENT.NomClient) xEncours est un numérique = RécupèreEncours(CLIENT.NumClient) gxEncoursTotal += xEncours TABLE_Référence[nLigne].COL_EnCours = xEncours SI xEncours>5000 ALORS TABLE_Référence[nLigne]..CouleurFond = VertPastel FIN
hHeureFin est une Heure duEcart est une Durée = hHeureFin - ghDébut
LIB_Résultat = "En cours total : " + NumériqueVersChaîne(gxEncoursTotal, "6,2fS") + " €" Info("Terminé, l'encours total est " + NumériqueVersChaîne(gxEncoursTotal, "6,2fS") + " €","Traitement terminé en " + DuréeVersChaîne(duEcart,"SS s LLL") + " ms") LIB_Durée_Sequentielle = DuréeVersChaîne(duEcart,"SS s LLL") + " ms"
Procedure RécupèreEncours(LOCAL nIDClient est un entier)
xEncours est un numérique
TraitementLong()
nPosition est un entier = HSauvePosition(CLIENT)
HLitRecherchePremier(CLIENT,NumClient,nIDClient)
xEncours = CLIENT.EnCoursAutorisé
HRetourPosition(nPosition)
RENVOYER xEncours
OBS.: PARA EXECUTAR ESSE CÓDIGO ACIMA LEVOU DE FORMA SERIAL UM TOTAL DE 19 SEGUNDOS 365 CENTÉSIMOS EM MEUS TESTES
Vejamos o exemplo de Processamento em Multi Thread PARALELAS: ####################################################
ghDébut = HeureSys()
TableSupprimeTout(TABLE_Référence)
gxEncoursTotalParallèle = 0
nLigne est entier tabTaches est tableau de TâcheParallèle stTache est une TâcheParallèle
POUR TOUT CLIENT nLigne = TableAjouteLigne(TABLE_Référence,CLIENT.NomClient)
stTache = TâcheParallèleExécute(_AfficheClient,(CLIENT.NumClient,nLigne),tpoCopieLégèreContexteHFSQL)
Ajoute(tabTaches,stTache) FIN
TâcheParallèleExécuteAprèsToutes(tabTaches, AfficheTotal,(),tpoThreadPrincipal)
Procedure _AfficheClient(nNumClient, nLigne)
xEncours est un numérique = RécupèreEncours(nNumClient)
gxEncoursTotalParallèle += xEncours
ExécuteThreadPrincipal(_AfficheEncours,nLigne,xEncours)
Procedure _AfficheEncours(nLigne,xEncours)
TABLE_Référence[nLigne].COL_EnCours = xEncours
SI xEncours>5000 ALORS TABLE_Référence[nLigne]..CouleurFond=VertPastel
Procedure AfficheTotal()
hHeureFin est une Heure
duEcart est une Durée = hHeureFin - ghDébut
Info("Terminé, l'encours total est " + NumériqueVersChaîne(gxEncoursTotalParallèle, "6,2fS") + " €","Traitement terminé en " + DuréeVersChaîne(duEcart,"MM min SS s LLL") + " ms")
LIB_Durée_Parallèle = DuréeVersChaîne(duEcart,"SS s LLL") + " ms"
Procedure RécupèreEncours(LOCAL nIDClient est un entier)
xEncours est un numérique
TraitementLong()
nPosition est un entier = HSauvePosition(CLIENT)
HLitRecherchePremier(CLIENT,NumClient,nIDClient)
xEncours = CLIENT.EnCoursAutorisé
HRetourPosition(nPosition)
RENVOYER xEncours
Procedure TraitementLong()
ThreadPause(10)
OBS: É UM POUCO MAIS COMPLEXO O DESENVOLVIMENTO PARALELO MAS O RESULTADO FINAL COMPENSA. EM MEUS TESTES O TEMPO REDUZIU PARA 1 SEGUNDO E 365 CENTÉSIMOS
BONS ESTUDOS!
-- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 9949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/ |
| |
| |
| | | |
|
| | |
| |
Registered member 3,657 messages Popularité : +175 (223 votes) |
|
Posted on June, 06 2017 - 12:41 AM |
PROGRAMAÇÃO PARALELA(CODIGO EM INGLÊS)
MUITO MAIS RAPIDO!
ghDébut = TimeSys()
TableDeleteAll(TABLE_Référence)
gxEncoursTotalParallèle = 0
nLigne is int tabTaches is array of ParallelTask stTache is a ParallelTask
FOR EACH CLIENT nLigne = TableAddLine(TABLE_Référence,CLIENT.NomClient)
stTache = ParallelTaskExecute(_AfficheClient,(CLIENT.NumClient,nLigne),ptoLightCopyHFSQLContext)
Add(tabTaches,stTache) END
ParallelTaskExecuteAfterAll(tabTaches, AfficheTotal,(),ptoMainThread)
Procedure _AfficheClient(nNumClient, nLigne)
xEncours is numeric = RécupèreEncours(nNumClient)
gxEncoursTotalParallèle += xEncours
ExecuteMainThread(_AfficheEncours,nLigne,xEncours)
Procedure _AfficheEncours(nLigne,xEncours)
TABLE_Référence[nLigne].COL_EnCours = xEncours
IF xEncours>5000 THEN TABLE_Référence[nLigne]..BrushColor=PastelGreen
Procedure AfficheTotal()
hHeureFin is Time
duEcart is Duration = hHeureFin - ghDébut
Info("Terminé, l'encours total est " + NumToString(gxEncoursTotalParallèle, "6,2fS") + " €","Traitement terminé en " + DurationToString(duEcart,"MM min SS s LLL") + " ms")
LIB_Durée_Parallèle = DurationToString(duEcart,"SS s LLL") + " ms"
Procedure RécupèreEncours(LOCAL nIDClient is int)
xEncours is numeric
TraitementLong()
nPosition is int = HSavePosition(CLIENT)
HReadSeekFirst(CLIENT,NumClient,nIDClient)
xEncours = CLIENT.EnCoursAutorisé
HRestorePosition(nPosition)
RESULT xEncours
Procedure TraitementLong()
ThreadPause(10)
-- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 99949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/ |
| |
| |
| | | |
|
| | |
| |
Registered member 3,657 messages Popularité : +175 (223 votes) |
|
Posted on June, 06 2017 - 1:38 AM |
Funções para gerenciar as Threads e os Semafros
CriticalSectionEnd Marca o fim de uma seção crítica: o código será executado por outro tópico.
CriticalSectionStart Marca o início de uma seção crítica: nenhum outro segmento será capaz de executar o código, desde que o segmento atual não saia da seção crítica.
EventChange Modifica o status de um sinal.
EventoFechar Fecha um sinal de sincronização entre vários tópicos.
EventCreate Cria um sinal.
EventDestroy Explícitamente destrói um sinal.
EventOpen Abre um sinal de sincronização entre vários tópicos.
EventWait Bloqueia o segmento atual enquanto espera que o sinal especificado seja aberto.
ExecuteMainThread Acelera a execução DO procedimento especificado No segmento principal DO aplicativo.
MutexCreate Explícitamente cria um mutex.
MutexDestroce Destrói explicitamente um mutex.
MutexEnd Sinaliza que o segmento libera o mutex.
MutexStart Bloqueia o segmento atual enquanto espera que o mutex seja liberado.
SemáforoCreado Cria um semáforo.
Semáforo Destruir Destrói explicitamente um semáforo.
SemaphoreEnd Permite que um OU mais segmentos saem da área protegida pelo semáforo.
SemaphoreStart Bloqueia o fio atual até o semáforo ser aberto (o que significa que até um ponto "livre" fica disponível na seção protegida).
ThreadCurrent Retorna o nome DO segmento atualmente executado.
ThreadEnd Termina a execução DO segmento atual.
ThreadExecute Inicia a execução de um tópico secundário.
ThreadMode Muda o modo de gerenciamento de threads.
ThreadPause Pausa o segmento atual durante a duração especificada.
ThreadPersistent Faz um thread persistente.
Linha prioritária Retorna OU modifica o nível de prioridade de um segmento.
ThreadResume Retoma a execução de um segmento que foi interrompido pelo ThreadSuspend .
ThreadSendSignal O segmento atual envia um sinal para a thread especificada para desbloqueá-lo.
ThreadState Retorna o status atual de um segmento.
ThreadStop Pára um fio secundário.
ThreadSuspend Suspende temporariamente a execução DO thread especificado.
ThreadWait Espera o fim da execução da thread especificada.
ThreadWaitSignal Bloqueia o fio atual até receber um sinal de outro segmento.
Você também tem a capacidade de usar os seguintes tipos de variáveis:
Evento automático O tipo AutomaticEvent é usado para gerenciar um sinal automático.
ManualEvent O tipo ManualEvent é usado para gerir um sinal manual.
https://help.windev.com/en-US/…
-- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 99949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/Message modified, June, 06 2017 - 1:39 AM |
| |
| |
| | | |
|
| | |
| |
Registered member 3,657 messages Popularité : +175 (223 votes) |
|
Posted on April, 05 2018 - 10:08 PM |
Em ingles
Procedure MyWindow() ghDébut is Time gxEncoursTotal is numeric gxEncoursTotalParallèle is numeric <critical section>
//SERIAL
ghDébut = TimeSys()
TableDeleteAll(TABLE_Référence) gxEncoursTotal = 0
FOR EACH CLIENT nLigne is int = TableAddLine(TABLE_Référence,CLIENT.NomClient) xEncours is numeric = RécupèreEncours(CLIENT.NumClient) gxEncoursTotal += xEncours TABLE_Référence[nLigne].COL_EnCours = xEncours IF xEncours>5000 THEN TABLE_Référence[nLigne]..BrushColor = PastelGreen END
hHeureFin is Time duEcart is Duration = hHeureFin - ghDébut
LIB_Résultat = "En cours total : " + NumToString(gxEncoursTotal, "6,2fS") + " €" Info("Terminé, l'encours total est " + NumToString(gxEncoursTotal, "6,2fS") + " €","Traitement terminé en " + DurationToString(duEcart,"SS s LLL") + " ms") LIB_Durée_Sequentielle = DurationToString(duEcart,"SS s LLL") + " ms"
//PARALELO
ghDébut = TimeSys()
TableDeleteAll(TABLE_Référence)
gxEncoursTotalParallèle = 0
nLigne is int tabTaches is array of ParallelTask stTache is a ParallelTask
FOR EACH CLIENT nLigne = TableAddLine(TABLE_Référence,CLIENT.NomClient)
stTache = ParallelTaskExecute(_AfficheClient,(CLIENT.NumClient,nLigne),ptoLightCopyHFSQLContext)
Add(tabTaches,stTache) END
ParallelTaskExecuteAfterAll(tabTaches, AfficheTotal,(),ptoMainThread)
Procedure _AfficheClient(nNumClient, nLigne)
xEncours is numeric = RécupèreEncours(nNumClient)
gxEncoursTotalParallèle += xEncours
ExecuteMainThread(_AfficheEncours,nLigne,xEncours)
Procedure _AfficheEncours(nLigne,xEncours)
TABLE_Référence[nLigne].COL_EnCours = xEncours
IF xEncours>5000 THEN TABLE_Référence[nLigne]..BrushColor=PastelGreen
Procedure AfficheTotal()
hHeureFin is Time
duEcart is Duration = hHeureFin - ghDébut
Info("Terminé, l'encours total est " + NumToString(gxEncoursTotalParallèle, "6,2fS") + " €","Traitement terminé en " + DurationToString(duEcart,"MM min SS s LLL") + " ms")
LIB_Durée_Parallèle = DurationToString(duEcart,"SS s LLL") + " ms"
Procedure RécupèreEncours(LOCAL nIDClient is int)
xEncours is numeric
TraitementLong()
nPosition is int = HSavePosition(CLIENT)
HReadSeekFirst(CLIENT,NumClient,nIDClient)
xEncours = CLIENT.EnCoursAutorisé
HRestorePosition(nPosition)
RESULT xEncours
Procedure TraitementLong()
ThreadPause(10)
-- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 99949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/ |
| |
| |
| | | |
|
| | | | |
| | |
|