[Powered by Google Translate] NATE Hardison: Quando você tem vários programas abertos em um computador, parece que está tudo executando ao mesmo tempo. Por exemplo, você pode estar trabalhando em um navegador web como Firefox ou Internet Explorer, a ouvir música no iTunes, e escrever uma redação com o Word. No entanto, sob o capô, os programas realmente executar um de cada vez. É o trabalho do sistema operacional, o Windows, Mac OSX, ou Linux, para administrar cada um destes processos separados, como o programas são conhecidos, e alternar entre elas, de modo que quando você ir de verificar a sua página no Facebook para trabalhar em seu ensaio novamente, o Word é o único que está em execução. Às vezes, porém, queremos programas de eles próprios poderem fazer várias coisas como esta, também. Se você é como eu, você provavelmente tem um monte de abas diferentes aberto no seu navegador, um para e-mail, um com um calendário, e assim por diante. Poderíamos tratar cada aba como um programa separado ou processo, como o Google Chrome faz, mas muitos programas usam um peso-leve versão de um processo chamado de um fio. Um segmento é apenas uma outra unidade de processamento, um conjunto de instruções ou de código que podem "correr", fecha aspas, simultaneamente com outros segmentos. Isto é o que torna possível para você navegar no Facebook ao ouvir-me no fundo ou ter dois Vídeos do YouTube tocando ao mesmo tempo. Assim, este tema geral, conhecido como concorrência, normalmente não vem tão cedo nos cursos de ciência da computação porque os detalhes de nível inferior requerem uma discussão de sistemas operativos e outros semelhantes. No entanto, a linguagem de programação que usamos na início do CS50, Scratch, oferece algumas ferramentas legais para torná-lo mais fácil de escrever programas com várias coisas acontecendo ao mesmo tempo. Quando você construir programas Scratch, você está constantemente trabalhando com roscas. Cada script Scratch, que é um bloco de código que começa com um dos "quando" peças do puzzle, pode ser pensado como um segmento separado. Vejamos um programa simples arranhão para ver como isso funciona. Aqui, temos um objeto, peixe ou sprite, com dois scripts que tanto o início, quando clicamos no botão pequena bandeira verde. O primeiro script controla o movimento do peixe. Quando a bandeira verde é clicado, o peixe é colocado no lado esquerdo do ecrã, o chamado estágio, voltado para a direita. Então, em um conjunto de instruções que vai correr para sempre, até que parar o programa, o peixe desliza para o lado direito, se vira, vai voltar para o lado esquerdo, e se vira novamente. O segundo script controla o processo do peixe pensamento. Acontece que este é um peixe com fome. Então, depois de esperar por 3 segundos, o peixe vai pensar, "Estou com fome", para um segundo quarto. Este script também funciona sempre. E como podemos ver, com a execução do programa clicando no bandeira verde, os dois scripts aparecer para executar simultaneamente. O peixe se e pensa ao mesmo tempo. Desde o pobre peixe parece tão com fome, vamos acrescentar, em alguns puffs de queijo para ele comer. Esperamos que eles não se desintegram na água. Quando adicionar um sprite segundo, nós também vamos ser capazes de adicionar em scripts correspondentes a esse sprite. E, portanto, haverá um outro conjunto de tópicos que vai correr. Para dar ao usuário de nosso controle sobre quando o programa peixes com fome recebe comida, vamos dizer que sempre que o espaço Bar é atingido, puffs queijo aparecer no palco para o peixe para comer. Antes de bater a barra de espaço, nós vamos querer manter o brega puffs escondido para que o peixe não pode vê-los. Para fazer isso, vamos precisar de um par de scripts para o puffs sprites de queijo. O primeiro roteiro, a bandeira verde, vai apenas esconder a comida. Ao contrário dos outros scripts que nós escrevemos, este não irá manter correr para sempre. Ele vai começar e terminar muito rapidamente, certo quando clicamos o botão de bandeira verde. O próximo script, temos que esperar a barra de espaço para ser pressionada antes de executar. Podemos chamar de espera para entrada do usuário "espera" ou "escuta" para um evento. E o código que é executado quando um evento é recebido ou ouvido é chamado código de manipulação de eventos. Nosso Espaço manipulador de eventos Bar vai mostrar as baforadas de queijo em a tela para que o peixe pode comer. Neste ponto, tudo parece bom. A próxima coisa que precisamos fazer é descobrir como chegar o peixe para perceber que não há comida para comer. Vamos adicionar uma outra linha para o peixe que constantemente verifica se é ou não é tocando as baforadas de queijo. Fazemos isso em um segmento separado desde que maneira podemos verificar constantemente por comida. Caso contrário, nós só será capaz de verificar periodicamente por comida entre delta, girando em torno, esperando, ou pensando. OK. Agora vamos executar o nosso programa Scratch. Como esperado, a comida imediatamente oculta e a peixes com fome nada e para trás como antes. Quando bateu a barra de espaço, os sopros de queijo entram em vista, e os peixes com fome diz whoo. Mas espere, isso é estranho. Como é que o peixe "Estou com fome" interrompe o pensamento outras coisas? Isto é porque nós não estabeleceu qualquer coordenação entre os três scripts de peixe. Cada um é executado em seu próprio segmento, alheio ao que o outros estão fazendo. Vamos corrigir isso antes de seguir em frente. A coordenação entre os segmentos é uma tarefa complicada, uma vez que não tenha controle total sobre quando cada segmento é executado ou não é executado. Para enviar uma mensagem de um segmento para outro, nós vamos precisar usar uma variável que pode definir, ou escrever, em uma thread e ler na outra. Vamos criar uma variável chamada foodFound que podemos definir a verdadeiro quando o peixe corre para os sopros de queijo. Bem, é claro, nós queremos ter certeza de que nós configurá-lo para false inicialmente. Em seguida, na linha do peixe pensamento, vamos verificar para ver se o peixe encontrou comida antes de exibir o "estou com fome" pensei bolha. Agora, a execução do programa novamente, vemos que o peixe não ficar interrompido com pensamentos de fome quando o puffs de queijo estão fora. O último problema que temos é que os sopros de queijo não vão embora depois de o peixe, entre aspas, "come-los". A partir dos scripts de peixe, não há nenhuma maneira fácil de esconder do brega puffs, por isso precisamos enviar uma mensagem para os sopros de queijo sprite para esconder-se. Nós poderíamos fazer isso com outra variável que as baforadas de queijo Sprite tem acesso, bem como o sprite peixe. No entanto, há uma forma mais limpa de fazer isso neste caso, pois em vez de enviar uma mensagem a um script que é em algum lugar no meio da execução, podemos enviar o mensagem a um script que está esperando para começar. Nós fazemos isso por ter o peixe transmissão de um evento, um Nós chamar comido. Então, nós vamos criar um script para os sopros de queijo que vontade esperar para este evento. Isto é semelhante ao caso a barra de espaço, só que desta tempo, o usuário não é o único diretamente acionando o evento. Agora tudo o que temos a fazer é definir nossa volta variável foodFound para false, e agora podemos dar o peixe com fome como muitos porções de puffs de queijo como ele quer. Então não é tão ruim, certo? Em C, escrever multi-threaded programas é mais complicado, mas os princípios são os mesmos. De qualquer forma, eu espero que você tenha um grande momento a construção de um pouco de diversão programas simultâneos em Scratch. Meu nome é Nate Hardison. Este é CS50.