🎥 Assista à demonstração do programa
Clique na imagem abaixo para conferir o vídeo completo no YouTube!
Este projeto é uma simulação de aeroporto desenvolvida em C++ utilizando as bibliotecas SDL2 e SDL2_ttf. A aplicação permite configurar parâmetros como tempo de pouso, desembarque, decolagem, intervalo entre aviões, número de pistas e quantidade de aviões. Após a configuração, a simulação visualiza o processo de aterrissagem e decolagem dos aviões de maneira dinâmica, gerenciando múltiplas pistas através de semáforos para evitar conflitos.
- Configuração Personalizada: Ajuste os tempos de pouso, desembarque, decolagem e intervalo entre aviões, bem como o número de pistas e aviões.
- Simulação Realista: Aviões aterrissam, desembarcando passageiros, decolam e liberam pistas automaticamente.
- Gestão de Pistas: Utilização de semáforos para gerenciar o acesso às pistas, evitando colisões.
- Interface Intuitiva: Interface gráfica amigável para facilitar a configuração e observação da simulação.
Antes de compilar e executar o projeto, certifique-se de que seu sistema atende aos seguintes requisitos:
- Linguagem de Programação: C++17
- Compilador:
Apesar de indicar o uso do GCC/G++ versão 14 ou superior, acredito que funcione com versões mais antigas, todavia isso não foi testado.
- macOS: GCC/G++ versão 14 ou superior
- Linux: GCC/G++ versão 14 ou superior
- Windows: MinGW ou outro compilador compatível com C++17
- Bibliotecas: Escolha a versão mais atualizada do SDL2 para o seu sistema (não SDL3).
- Outros:
- Threads e Semáforos: Implementados conforme os conceitos de Sistemas Operacionais.
A instalação manual das bibliotecas é necessária no macOS. Siga os passos abaixo:
- Baixe as bibliotecas:
- Localize os arquivos baixados.
- Ao abrir o .dmg um folder nome_da_biblioteca.framework estará presente.
-
Copie as frameworks para o diretório
/Library/Frameworks/
:- Navegue até seu
/Library/Frameworks/
- Se utilizar o terminal, no diretório
/Library/
você pode utilizar o comando abaixo para abrir o local no finder:
open -R Frameworks/
- Com essa pasta aberta no finder você pode arrastar o framework das bibliotecas do SDL2 direto para o seu
/Library/Frameworks/
.
- Navegue até seu
No Linux, você pode instalar as bibliotecas SDL2 e SDL2_ttf utilizando o gerenciador de pacotes da sua distribuição. Abaixo estão os comandos para as distribuições baseadas em Debian/Ubuntu:
sudo apt update
sudo apt install libsdl2-dev libsdl2-ttf-dev
No Windows, siga os passos abaixo para instalar as bibliotecas SDL2 e SDL2_ttf:
-
Baixe as bibliotecas:
- Download SDL2 (Selecione a versão de desenvolvimento para MinGW ou Visual Studio, conforme seu compilador)
- Download SDL2_ttf
-
Extraia os arquivos baixados.
-
Configure o compilador:
- Para MinGW:
- Copie os arquivos
.dll
para a pasta onde está o executável do seu projeto ou paraC:\MinGW\bin
. - Inclua os diretórios
include
elib
no seu projeto ou nas variáveis de ambiente do sistema.
- Copie os arquivos
- Para Visual Studio:
- Siga as instruções de integração específicas para Visual Studio disponíveis na documentação das bibliotecas.
- Para MinGW:
Com as dependências instaladas, você pode compilar o projeto usando os seguintes comandos conforme o sistema operacional:
g++-14
/g++
: Invoca o compilador GCC/G++.-std=c++17
: Define o padrão C++17.main.cpp aviao.cpp semaforo.cpp utils.cpp
: Arquivos de código-fonte a serem compilados.-I./include
: Inclui o diretórioinclude
para cabeçalhos personalizados.- macOS:
-I/Library/Frameworks/SDL2.framework/Headers -I/Library/Frameworks/SDL2_ttf.framework/Headers
: Inclui os cabeçalhos das frameworks SDL2 e SDL2_ttf.-F/Library/Frameworks
: Indica o diretório onde as frameworks estão localizadas.-framework SDL2 -framework SDL2_ttf
: Liga as frameworks SDL2 e SDL2_ttf.
- Linux:
-lSDL2 -lSDL2_ttf
: Liga as bibliotecas SDL2 e SDL2_ttf.
- Windows:
- Depende da configuração do compilador, geralmente inclui caminhos para
include
elib
e linka as bibliotecas SDL2 e SDL2_ttf.
- Depende da configuração do compilador, geralmente inclui caminhos para
-pthread
: Liga a biblioteca pthread para suporte a multithreading.-o main
: Define o nome do executável de saída comomain
.
g++-14 -std=c++17 main.cpp aviao.cpp semaforo.cpp utils.cpp \
-I./include -I/Library/Frameworks/SDL2.framework/Headers -I/Library/Frameworks/SDL2_ttf.framework/Headers \
-F/Library/Frameworks \
-framework SDL2 -framework SDL2_ttf -pthread -o main
g++ -std=c++17 main.cpp aviao.cpp semaforo.cpp utils.cpp \
-I./include \
-lSDL2 -lSDL2_ttf -pthread -o main
g++ -std=c++17 main.cpp aviao.cpp semaforo.cpp utils.cpp \
-I./include -I"C:/Path/To/SDL2/include" -I"C:/Path/To/SDL2_ttf/include" \
-L"C:/Path/To/SDL2/lib" -L"C:/Path/To/SDL2_ttf/lib" \
-lSDL2 -lSDL2_ttf -pthread -o main.exe
Nota: Substitua C:/Path/To/
pelo caminho real onde as bibliotecas SDL2 e SDL2_ttf estão instaladas no seu sistema.
OBS: Normalmente eu faria um Makefile que já deixasse isso facilitado, porém no ambiente do macOS, ao utilizar um Makefile, estava ocorrendo conflítuo entre o diretório onde as bibliotecas de C++ estão instaladas e os frameworks da SDL2, por isso foi necessário utilizar comandos diretos como esses.
Após a compilação bem-sucedida, execute o programa com o seguinte comando conforme o sistema operacional:
./main
main.exe
-
Configuração:
- Ajuste os parâmetros desejados utilizando os botões "+" e "-" na interface de configuração:
- Tempo de Pouso (s): Tempo que o avião leva para pousar.
- Tempo de Desembarque (s): Tempo para desembarcar passageiros após o pouso.
- Tempo de Decolagem (s): Tempo que o avião leva para decolar após desembarcar.
- Tempo entre Aviões (s): Intervalo entre a chegada de cada avião (mínimo de 4 segundos).
- Número de Pistas: Quantidade de pistas disponíveis para pouso e decolagem (máximo de 3).
- Número de Aviões: Quantidade total de aviões na simulação.
- Ajuste os parâmetros desejados utilizando os botões "+" e "-" na interface de configuração:
-
Iniciar Simulação:
- Clique no botão "Play" para iniciar a simulação.
- Observe os aviões aterrissando, aguardando o desembarque de passageiros, decolando e liberando pistas conforme as configurações definidas.
- Linguagem de Programação: C++17
- Bibliotecas:
- Threads e Semáforos: Implementados utilizando a biblioteca pthread e mecanismos de sincronização para gerenciar a concorrência.
project/
├── README.md
├── arial.ttf
├── aviao.cpp
├── aviao.h
├── main.cpp
├── pista.h
├── semaforo.cpp
├── semaforo.h
├── utils.cpp
└── utils.h
Este projeto utiliza threads e semaforos para gerenciar a concorrência entre os aviões que tentam acessar as pistas de pouso e decolagem. A implementação segue os conceitos aprendidos na disciplina de Sistemas Operacionais.
- Definição: Cada avião é representado por uma thread independente, responsável por sua movimentação e processos de pouso, desembarque, decolagem e liberação de pista.
- Implementação:
- Arquivo:
aviao.cpp
eaviao.h
- Cada thread simula o voo do avião, gerenciando seu estado e interações com as pistas.
- Arquivo:
- Definição: Semáforos são utilizados para controlar o acesso às pistas, garantindo que apenas um número limitado de aviões possa pousar ou decolar simultaneamente.
- Implementação:
- Arquivo:
semaforo.cpp
esemaforo.h
- A classe
Semaforo
implementa os métodosesperar
enotificar
para controlar a disponibilidade das pistas. - As threads dos aviões utilizam esses métodos para adquirir e liberar pistas de forma sincronizada.
- Arquivo:
-
Performance: O programa foi otimizado para rodar a aproximadamente 60 FPS, proporcionando uma simulação suave e de fácil compreensão.
-
Multiplataforma: Embora a instalação das bibliotecas SDL2 e SDL2_ttf difira entre os sistemas operacionais, o projeto foi desenvolvido para ser compatível com macOS, Linux e Windows. Certifique-se de seguir as instruções de instalação específicas para o seu sistema.
-
Bom senso: O programa funciona muito bem para o que se propõe, porém é claro que haveerão limites para seu desempenho. Por isso, ao selecionar quantos aviões e os tempos de simulação, seja razoável.
Este projeto foi desenvolvido como parte do curso SSC0140 – Sistemas Operacionais I da Universidade de São Paulo - ICMC, sob a orientação da Profª Kalinka Regina Lucas Jaquie Castelo Branco. O objetivo principal foi implementar conceitos de threads e semaforos em um aplicativo prático, demonstrando a aplicação desses conceitos em um contexto realista de gerenciamento de recursos concorrentes.