Thread no BANSHEE

Funcionamento e funções

Thread

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. Um reprodutor de video, atua com inumeros processos ao mesmo tempo, e o banshee é um exemplo disso, utilizando threads para um melhor desempenho.


Inicialização da thread

Ao lado esquerdo um fragmento de código de inicialização. Main_thread instancia o método Run Banshee, que vai iniciar a aplicação chamando o InitializeMainThread. No main, após ele fazer todas as suas tarefas, o programa chama o método Teardown onde nesse método ele chama a aplicação para desligar(interrupção), sendo que o método .join bloqueia o thread de chamada até que o thread representado por essa instância termine, sendo essa função Teardown, chamada em outros métodos tambem.









Utilização da thread para autenticar usuário

Para efetuar o login:

public void Login (string username, string password) {
    fetcher.Username = username;
    fetcher.Password = password;

    try {
    	bag = ContentCodeBag.ParseCodes (fetcher.Fetch ("/content-codes"));
        ContentNode node = ContentParser.Parse (bag, fetcher.Fetch ("/login"));
        ParseSessionId (node);

        FetchDatabases ();
        Refresh ();

// Se a informação do servidor estiver correta, atualizada e disponivel, será criada
// uma thread para encontrar o usuario*/
    	if (serverInfo.SupportsUpdate) {
            updateRunning = true;
            Thread thread = new Thread (UpdateLoop);
            thread.Name = "DAAP";
            thread.IsBackground = true;
            thread.Start ();
                }
            }
}
O bloco try é um bloco "protegido" porque, caso ocorra algum problema com os comandos dentroo do bloco, a execução desviará para os blocos catch correspondentes
A thread está sendo utilizada neste momento para a procura das informacoes do usuario para que ocorra o login.

Tratamento de exceções no login:


 //Trata a exceção de usuario ou senha incorreto
    catch (WebException e) {
        if (e.Response != null && (e.Response as HttpWebResponse).StatusCode == HttpStatusCode.Unauthorized)
            throw new AuthenticationException ("Username or password incorrect");
        else
            throw new LoginException ("Failed to login", e);
    } catch (Exception e) {
         throw new LoginException ("Failed to login", e);
            }
}
// caso haja problema com a conexão com o servidor a thread irá esperar por um tempo
// determinado em (UpdateSleepInterval) e tentará novamente, caso realmente não
// consiga se conectar com o servidor a mensagem de erro é mostrada
	catch (WebException) {
        if (!updateRunning)
            break;

            // esperar por um tempo, talvez o servidor caiu
            // temporariamente ou algo assim.

            Thread.Sleep (UpdateSleepInterval);
    } catch (Exception e) {
        if (!updateRunning)
            break;

            Console.Error.WriteLine ("Exception in update loop: " + e);
            sThread.Sleep (UpdateSleepInterval);
}

Cada bloco try é seguido por zero ou mais blocos catch, onde cada bloco catch é referente a uma única exceção.
O primeiro tratamento de exceção catch está sendo usado para caso o usuario informe login ou senha incorreto.
O segundo tratamento de exceção catch é utilizado para erros que não incluem o usuário, especificamente de conexão com o servidor, onde se não houver a conexão a execução da thread será pausada por um tempo determinado em (UpdateSleepInterval)e tentará conexão novamente, caso realmente não consiga irá mostrar a mensagem de erro.

Escalonador

Inicialmente o programa cria o objeto mutex, em seguida a fila de prioridades e a thread. A vairável DISPOSED é criada também, sendo ela necessarua para liberar ou descartar recursos não gerenciados. A criação do IJOB também é necessaria para gerenciamento das tarefas e recursos do trabalho que estiver em andamento. Inicialmente é definida a prioridade do JOB pelo JobPriority.Normal. Além da adição o JOB com a prioridade na pilha com o heap.PUSH(job,(int)priority), além da ordem de escalonar o JOB com o OnJobScheduled.



CreateUser

É a parte de criação do usuario, e adição de musicas, fazendo instanciações com o título das músicas como parâmetro. Além da inicialização de recursos de CPU, discos e base de dados, e ao final registrando como um JOB.


CheckRun

Vai fazer a checagem do JOB e posteriormente a inicialização da thread do JOB.




Desescalonamento

É a parte de retirar o JOB do processo de escalonamento, utilizando o heap.Remove que retira o JOB da pilha de escalonamento.

Destroy user

O DestroyUser faz o encerramento e remoção de um JOB através do user_job.Finish()



LogError

Passa as mensagens e caminhos dos erros ocorridos




Mudança de título

Nessa parte é onde ocorre a mudança dos títulos através do String.Format, utilizando tambem o user_job_title que seria o titulo propriamente dito




Process job thread

É a parte da execução dos processos, o qual ocorre através do current_running_job.Run(), trata também exceções quanto a remoção do elemento em execução da pilha