Biblioteca C ++, fornecendo a funcionalidade de um loop de eventos para processar eventos instantâneos e programados para aplicativos orientados a eventos
O evento de eventos processa eventos para notificar os receptores registrados opcionalmente com dados
Você pode usar o loop de eventos para bloquear o thread atual para processamento de eventos ou como um fio independente, deixando o fio atual livre para outras tarefas
NOTA: Esta biblioteca fornece uma estrutura para processos de eventos com vários threads dentro do mesmo processo sem nenhum recurso IPC
EventLoop::Mode::BLOCK Este loop de modo de evento bloqueará o fio atual (geralmente o tópico principal) onde a chamada EventLoop::Run() foi emitida
O tópico atual continuará processando os eventos enquanto o loop estiver em execução
EventLoop::Mode::NON_BLOCK DE EVENTOS NÃO BLOCOCO Este modo executará o loop de eventos em outro tópico que impedirá o tópico atual onde a chamada EventLoop::Run() foi emitida de ser bloqueada
Isso pode ser útil quando o thread atual tiver que chegar a alguma execução depois de iniciar o loop do evento no mesmo thread ou se já usa um loop de eventos de bloqueio próprio. Um exemplo deste último pode ser a chamada QGuiApplication::exec() da estrutura QT, que bloqueia o tópico principal e começa a processar eventos
Isso levanta uma questão importante: por que um loop de evento secundário foi necessário quando um primário como o qt's exec() já existe?
Não sei sobre você, mas perdi gravemente alguns recursos no loop de eventos do QT, como a capacidade de transmitir um sinal para todos os receptores que se registraram/assinaram. Essa foi a principal motivação para o desenvolvimento de uma biblioteca de loop de eventos a partir do zero, além de alguns outros, como minha curiosidade insaciável de como as coisas funcionam e uma coceira para o alimento para cães!
A transmissão é por excelência quando você deseja que vários componentes do aplicativo atuem em um único estímulo sem precisar conectar cada receptor à explicidade do remetente. Boa sorte passando instâncias do remetente para vários recievers e criando uma conexão de slot para cada um para permitir a recepção de transmissão no QT!
Outro motivo sólido era criar um sistema de processamento de eventos globais para todo o aplicativo, sem nenhuma referência ao provedor de eventos ou aos objetos de remetente e receptor associados para se registrar e acionar um evento. EventLoop é uma classe estática independente, com métodos estáticos, permitindo ao desenvolvedor emitir uma chamada de API de absolutamente qualquer thread, em qualquer lugar do código, diferentemente do QT, onde são necessários alças do remetente e objetos do receptor para criar conexões e emitir sinais.
Como usuário, você pode vincular dinamicamente a biblioteca de loop de eventos ao seu aplicativo e incluir o cabeçalho EventLoop.h no código do seu aplicativo para acessar os métodos da biblioteca. Como estamos usando Event como um tipo personalizado para entregar e receber eventos com nome e dados, o cabeçalho Event.h
NOTA: Não inclua outros cabeçalhos do diretório incluído deste projeto, além dos mencionados acima ao usar a biblioteca em seu aplicativo. Outra maneira de lembrar é que você só precisa dos arquivos de cabeçalho
.hpara o seu aplicativo e todos os arquivos.hpppodem ser ignorados
A documentação detalhada da API pode ser encontrada no cabeçalho EventLoop.h . As etapas a seguir demonstram possível uso do loop de eventos em seu aplicativo:
main() do seu programa, ligue para o método EventLoop::SetMode() se você deseja que o loop seja sem bloqueio. Não há necessidade de chamar isso explicitamente para o modo de bloqueio, porque esse é o modo padrãoEventLoop::Run() em main() onde você deseja que o loop do evento inicie e/ou bloqueieEvent* em qualquer arquivo de classe ou origem no EventLoop::RegisterEvent() onde você deseja ser notificado para um evento. Normalmente, os registros são feitos em construtores de classe com lambdas ou funções membros da classe como manipuladoresEventLoop::TriggerEvent() e os manipuladores correspondentes que se registraram para o nome do evento específico serão invocados instanturais ou após um tempo limite, dependendo do tipo de sobrecarga usadaEvent Event::getName() e Event::getData() métodosEventLoop::Halt() . Este método pode ser chamado de qualquer thread em ambos os modos. Se chamado dentro de um manipulador registrado, ele entrará em vigor apenas na conclusão do escopo do manipuladorDica: se você planeja usar
EventLoopno topo do loop de eventosexec()do Qt, configureEventLoop::Run()Antes doexec()Ligue eEventLoop::Halt()a ser invocado naQGuiApplication::aboutToQuitSignal como segue para uma saída graciosa para uma saída graciosa
QObject::connect(&app, &QGuiApplication::aboutToQuit, []{ EventLoop::Halt(); });
NOTA: Qualquer código logo após um bloqueio
EventLoop::Run()Chamada no mesmo thread não será executado até que o loop do evento seja interrompido porqueEventLoop::Run()bloqueia o thread atual para processar eventos por design.
O aplicativo de carrinho de compras serve como uma referência de uso desta biblioteca e API. Em caso de qualquer dúvida ou esclarecimento, você pode entrar em contato comigo em [email protected]
Verifique as mais recentes versões estáveis da biblioteca em Releases , mas se você deseja construir uma biblioteca a partir da fonte com a versão atual do código -fonte, execute o script build.sh
O script pode ser executado sem nenhuma opção. Os padrões para cada opção aparecerão em {} na instrução de uso. Aprenda sobre o uso do script executando o seguinte comando
./build.sh -h
Como exemplo, se você deseja usar o script para criar o modo de liberação com o gerador de cmake Unix Makefiles , o script pode ser executado da seguinte forma
./build.sh -a -r -g "Unix Makefiles"
Artefatos de construção serão gerados no diretório build
O artefato de saída estará presente no diretório lib como libEventLoop.so , que pode ser mais ligado ou movido para o seu destino de destino
Você pode contribuir com o projeto se você acha
Como um contribuidor em potencial, você pode
Sinta -se à vontade, entre em contato comigo em caso de qualquer dúvida ou sugestão [email protected]