O player Amarok é um programa de computador usado para a reprodução de áudio em ambiente KDE, compatível com sistemas operacionais Unix tais como o Linux e o FreeBSD. Embora o Amarok possa operar com listas de reprodução e pastas, ele utiliza o conceito de etiquetas (tags).
Lançado em 23 de junho de 2003 para Linux e posteriormente lançado para Windows, o Amarok se tornou um dos players de música mais conhecidos para Linux.
✔ Múltiplas listas de reprodução;
✔ Aparência configurável através de CSS;
✔ Indexação das coleções de música em um banco de dados: SQLite ou MySQL;
✔ Possibilidade de baixar letras de música e capas de álbuns da Internet;
✔ Suporte ao DCOP;
✔ Rápido e simples arrastar e soltar para a criação de listas de reprodução;
✔ Possui boas opções de configuração para gestão de energia;
✔ Visualizações com libvisual;
✔ Geração automática de estatísticas de reprodução;
Thread é um pequeno programa que trabalha como um subsistema, sendo uma forma de um processo se autodividir em duas ou mais tarefas. É o termo em inglês para Linha ou Encadeamento de Execução. Essas tarefas múltiplas podem ser executadas simultaneamente para rodar mais rápido do que um programa em um único bloco ou praticamente juntas, mas que são tão rápidas que parecem estar trabalhando em conjunto ao mesmo tempo.
Os threads possuem vantagens e desvantagens ao dividir um programa em vários processos. Uma das vantagens é que isso facilita o desenvolvimento, visto que torna possível elaborar e criar o programa em módulos, experimentando-os isoladamente no lugar de escrever em um único bloco de código. Outro benefício dos threads é que eles não deixam o processo parado, pois quando um deles está aguardando um determinado dispositivo de entrada ou saída, ou ainda outro recurso do sistema, outro thread pode estar trabalhando. No entanto, uma das desvantagens é que com vários threads o trabalho fica mais complexo, justamente por causa da interação que ocorre entre eles.
Os códigos do player AMAROK utilizam a biblioteca ThreadWeaver para implementar os threads do programa.
O ThreadWeaver é um auxiliar para programação multithread. Ele utiliza uma interface baseada em trabalho para enfileirar processos e executá-los de maneira eficiente. O programador divide a carga de trabalho em tarefas e declara as dependências entre cada uma delas. Após isso, o ThreadWeaver resolverá a maneira mais eficiente de dividir o trabalho entre os threads dentro de um conjunto de limites de recursos.
Para a utilização da biblioteca ThreadWeaver, a mesma é declarada nos códigos em que é usada.
A inclusão possui o complemento "Job" pois o código requer processamento de threads em tarefas.
A ThreadWeaver é uma fila de jobs. Executa trabalhos em threads que gerencia internamente. O número mínimo e máximo de encadeamentos fornecidos por um Weaver é definido pelo usuário. Os jobs são tratados como objetos, no caso, QObjects. Por exemplo:
Como os jobs são QObjects, é permitido que o usuário se conecte ao sinal done(), que é notificado quando um job foi executado. Por exemplo:
Em geral, as tarefas são executadas na ordem em que estão enfileiradas, se não tiverem pendências não resolvidas (fila de espera). Esse comportamento da ThreadWeaver é usado para gerenciar a carga de E/S (entrada/saída), rede e CPU
Um job somente ira executar se todos os jobs que ele depende estiverem finalizados. Assim, as dependências podem mudar a ordem de execução dos jobs. Se não há dependências declaradas, os jobs são executados na ordem de fila normal.
É possível que existam múltiplas dependências para um job, assim, grafos de execução complexos são criados e executados automaticamente pelo Weaver.
Para evitar dependências circulares, ou seja, quando um job A depende de um job B e o job B depende do job A, esses jobs simplesmente nunca serão executados, enquanto a dependência não for resolvida.
Existem também WeaverObservers na biblioteca, que são usados para receber informações sobre os estados das threads e de execuções de jobs.