1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] NATE Hardison: Quando você tem vários programas abertos em um 2 00:00:09,360 --> 00:00:11,250 computador, parece que está tudo 3 00:00:11,250 --> 00:00:12,880 executando ao mesmo tempo. 4 00:00:12,880 --> 00:00:15,350 Por exemplo, você pode estar trabalhando em um navegador web como 5 00:00:15,350 --> 00:00:19,360 Firefox ou Internet Explorer, a ouvir música no iTunes, 6 00:00:19,360 --> 00:00:21,490 e escrever uma redação com o Word. 7 00:00:21,490 --> 00:00:24,240 No entanto, sob o capô, os programas realmente 8 00:00:24,240 --> 00:00:25,830 executar um de cada vez. 9 00:00:25,830 --> 00:00:29,750 É o trabalho do sistema operacional, o Windows, Mac OSX, ou 10 00:00:29,750 --> 00:00:33,070 Linux, para administrar cada um destes processos separados, como o 11 00:00:33,070 --> 00:00:35,900 programas são conhecidos, e alternar entre elas, de modo que quando você 12 00:00:35,900 --> 00:00:38,610 ir de verificar a sua página no Facebook para trabalhar em seu ensaio 13 00:00:38,610 --> 00:00:41,590 novamente, o Word é o único que está em execução. 14 00:00:41,590 --> 00:00:44,890 >> Às vezes, porém, queremos programas de eles próprios poderem 15 00:00:44,890 --> 00:00:47,440 fazer várias coisas como esta, também. 16 00:00:47,440 --> 00:00:49,630 Se você é como eu, você provavelmente tem um monte de 17 00:00:49,630 --> 00:00:52,730 abas diferentes aberto no seu navegador, um para e-mail, 18 00:00:52,730 --> 00:00:55,070 um com um calendário, e assim por diante. 19 00:00:55,070 --> 00:00:58,270 Poderíamos tratar cada aba como um programa separado ou processo, 20 00:00:58,270 --> 00:01:01,300 como o Google Chrome faz, mas muitos programas usam um 21 00:01:01,300 --> 00:01:04,430 peso-leve versão de um processo chamado de um fio. 22 00:01:04,430 --> 00:01:07,190 >> Um segmento é apenas uma outra unidade de processamento, um conjunto de 23 00:01:07,190 --> 00:01:10,100 instruções ou de código que podem "correr", fecha aspas, 24 00:01:10,100 --> 00:01:12,560 simultaneamente com outros segmentos. 25 00:01:12,560 --> 00:01:15,150 Isto é o que torna possível para você navegar no Facebook 26 00:01:15,150 --> 00:01:17,940 ao ouvir-me no fundo ou ter dois 27 00:01:17,940 --> 00:01:20,790 Vídeos do YouTube tocando ao mesmo tempo. 28 00:01:20,790 --> 00:01:24,660 Assim, este tema geral, conhecido como concorrência, normalmente 29 00:01:24,660 --> 00:01:26,930 não vem tão cedo nos cursos de ciência da computação 30 00:01:26,930 --> 00:01:29,790 porque os detalhes de nível inferior requerem uma discussão de 31 00:01:29,790 --> 00:01:31,930 sistemas operativos e outros semelhantes. 32 00:01:31,930 --> 00:01:34,170 No entanto, a linguagem de programação que usamos na 33 00:01:34,170 --> 00:01:38,000 início do CS50, Scratch, oferece algumas ferramentas legais para 34 00:01:38,000 --> 00:01:40,390 torná-lo mais fácil de escrever programas com várias coisas 35 00:01:40,390 --> 00:01:42,390 acontecendo ao mesmo tempo. 36 00:01:42,390 --> 00:01:45,050 >> Quando você construir programas Scratch, você está constantemente 37 00:01:45,050 --> 00:01:46,760 trabalhando com roscas. 38 00:01:46,760 --> 00:01:49,770 Cada script Scratch, que é um bloco de código que começa com 39 00:01:49,770 --> 00:01:52,600 um dos "quando" peças do puzzle, pode ser pensado 40 00:01:52,600 --> 00:01:54,380 como um segmento separado. 41 00:01:54,380 --> 00:01:58,040 Vejamos um programa simples arranhão para ver como isso funciona. 42 00:01:58,040 --> 00:02:01,730 >> Aqui, temos um objeto, peixe ou sprite, com dois scripts 43 00:02:01,730 --> 00:02:05,000 que tanto o início, quando clicamos no botão pequena bandeira verde. 44 00:02:05,000 --> 00:02:07,290 O primeiro script controla o movimento do peixe. 45 00:02:07,290 --> 00:02:09,850 Quando a bandeira verde é clicado, o peixe é colocado 46 00:02:09,850 --> 00:02:12,450 no lado esquerdo do ecrã, o chamado estágio, 47 00:02:12,450 --> 00:02:14,090 voltado para a direita. 48 00:02:14,090 --> 00:02:17,070 Então, em um conjunto de instruções que vai correr para sempre, até que 49 00:02:17,070 --> 00:02:20,270 parar o programa, o peixe desliza para o lado direito, 50 00:02:20,270 --> 00:02:22,900 se vira, vai voltar para o lado esquerdo, e 51 00:02:22,900 --> 00:02:24,470 se vira novamente. 52 00:02:24,470 --> 00:02:27,410 O segundo script controla o processo do peixe pensamento. 53 00:02:27,410 --> 00:02:29,290 Acontece que este é um peixe com fome. 54 00:02:29,290 --> 00:02:32,080 Então, depois de esperar por 3 segundos, o peixe vai pensar, 55 00:02:32,080 --> 00:02:34,420 "Estou com fome", para um segundo quarto. 56 00:02:34,420 --> 00:02:36,440 Este script também funciona sempre. 57 00:02:36,440 --> 00:02:38,940 E como podemos ver, com a execução do programa clicando no 58 00:02:38,940 --> 00:02:41,730 bandeira verde, os dois scripts aparecer para executar 59 00:02:41,730 --> 00:02:43,100 simultaneamente. 60 00:02:43,100 --> 00:02:46,460 O peixe se e pensa ao mesmo tempo. 61 00:02:46,460 --> 00:02:49,030 >> Desde o pobre peixe parece tão com fome, vamos acrescentar, em alguns 62 00:02:49,030 --> 00:02:50,670 puffs de queijo para ele comer. 63 00:02:50,670 --> 00:02:53,060 Esperamos que eles não se desintegram na água. 64 00:02:53,060 --> 00:02:55,560 Quando adicionar um sprite segundo, nós também vamos ser capazes de 65 00:02:55,560 --> 00:02:58,020 adicionar em scripts correspondentes a esse sprite. 66 00:02:58,020 --> 00:02:59,580 E, portanto, haverá um outro conjunto de 67 00:02:59,580 --> 00:03:00,830 tópicos que vai correr. 68 00:03:03,590 --> 00:03:06,270 Para dar ao usuário de nosso controle sobre quando o programa 69 00:03:06,270 --> 00:03:09,340 peixes com fome recebe comida, vamos dizer que sempre que o espaço 70 00:03:09,340 --> 00:03:11,840 Bar é atingido, puffs queijo aparecer no palco para o 71 00:03:11,840 --> 00:03:13,300 peixe para comer. 72 00:03:13,300 --> 00:03:15,760 Antes de bater a barra de espaço, nós vamos querer manter o brega 73 00:03:15,760 --> 00:03:19,020 puffs escondido para que o peixe não pode vê-los. 74 00:03:19,020 --> 00:03:21,140 Para fazer isso, vamos precisar de um par de scripts para o 75 00:03:21,140 --> 00:03:22,750 puffs sprites de queijo. 76 00:03:22,750 --> 00:03:26,980 O primeiro roteiro, a bandeira verde, vai apenas esconder a comida. 77 00:03:26,980 --> 00:03:29,530 Ao contrário dos outros scripts que nós escrevemos, este não irá manter 78 00:03:29,530 --> 00:03:30,560 correr para sempre. 79 00:03:30,560 --> 00:03:33,250 Ele vai começar e terminar muito rapidamente, certo quando clicamos 80 00:03:33,250 --> 00:03:35,000 o botão de bandeira verde. 81 00:03:35,000 --> 00:03:37,180 >> O próximo script, temos que esperar a barra de espaço para ser 82 00:03:37,180 --> 00:03:39,590 pressionada antes de executar. 83 00:03:39,590 --> 00:03:42,770 Podemos chamar de espera para entrada do usuário "espera" ou "escuta" 84 00:03:42,770 --> 00:03:43,860 para um evento. 85 00:03:43,860 --> 00:03:46,750 E o código que é executado quando um evento é recebido ou 86 00:03:46,750 --> 00:03:50,280 ouvido é chamado código de manipulação de eventos. 87 00:03:50,280 --> 00:03:53,550 Nosso Espaço manipulador de eventos Bar vai mostrar as baforadas de queijo em 88 00:03:53,550 --> 00:03:56,330 a tela para que o peixe pode comer. 89 00:03:56,330 --> 00:03:58,880 Neste ponto, tudo parece bom. 90 00:03:58,880 --> 00:04:00,990 >> A próxima coisa que precisamos fazer é descobrir como chegar 91 00:04:00,990 --> 00:04:03,570 o peixe para perceber que não há comida para comer. 92 00:04:03,570 --> 00:04:06,030 Vamos adicionar uma outra linha para o peixe que constantemente 93 00:04:06,030 --> 00:04:08,790 verifica se é ou não é tocando as baforadas de queijo. 94 00:04:08,790 --> 00:04:11,510 Fazemos isso em um segmento separado desde que maneira podemos 95 00:04:11,510 --> 00:04:13,710 verificar constantemente por comida. 96 00:04:13,710 --> 00:04:16,829 Caso contrário, nós só será capaz de verificar periodicamente por comida 97 00:04:16,829 --> 00:04:21,180 entre delta, girando em torno, esperando, ou pensando. 98 00:04:21,180 --> 00:04:22,000 >> OK. 99 00:04:22,000 --> 00:04:23,785 Agora vamos executar o nosso programa Scratch. 100 00:04:23,785 --> 00:04:26,921 Como esperado, a comida imediatamente oculta e a 101 00:04:26,921 --> 00:04:28,920 peixes com fome nada e para trás como antes. 102 00:04:32,050 --> 00:04:35,060 Quando bateu a barra de espaço, os sopros de queijo entram em vista, 103 00:04:35,060 --> 00:04:37,470 e os peixes com fome diz whoo. 104 00:04:37,470 --> 00:04:39,340 Mas espere, isso é estranho. 105 00:04:39,340 --> 00:04:42,150 Como é que o peixe "Estou com fome" interrompe o pensamento 106 00:04:42,150 --> 00:04:43,580 outras coisas? 107 00:04:43,580 --> 00:04:45,780 Isto é porque nós não estabeleceu qualquer coordenação 108 00:04:45,780 --> 00:04:47,590 entre os três scripts de peixe. 109 00:04:47,590 --> 00:04:50,610 Cada um é executado em seu próprio segmento, alheio ao que o 110 00:04:50,610 --> 00:04:52,120 outros estão fazendo. 111 00:04:52,120 --> 00:04:54,980 Vamos corrigir isso antes de seguir em frente. 112 00:04:54,980 --> 00:04:57,700 >> A coordenação entre os segmentos é uma tarefa complicada, uma vez que 113 00:04:57,700 --> 00:05:00,940 não tenha controle total sobre quando cada segmento é executado ou 114 00:05:00,940 --> 00:05:02,190 não é executado. 115 00:05:02,190 --> 00:05:04,710 Para enviar uma mensagem de um segmento para outro, nós vamos precisar 116 00:05:04,710 --> 00:05:08,300 usar uma variável que pode definir, ou escrever, em uma thread 117 00:05:08,300 --> 00:05:10,170 e ler na outra. 118 00:05:10,170 --> 00:05:12,920 Vamos criar uma variável chamada foodFound que podemos definir a 119 00:05:12,920 --> 00:05:15,530 verdadeiro quando o peixe corre para os sopros de queijo. 120 00:05:15,530 --> 00:05:17,540 Bem, é claro, nós queremos ter certeza de que nós configurá-lo para 121 00:05:17,540 --> 00:05:19,240 false inicialmente. 122 00:05:19,240 --> 00:05:22,540 Em seguida, na linha do peixe pensamento, vamos verificar para ver se 123 00:05:22,540 --> 00:05:25,400 o peixe encontrou comida antes de exibir o "estou com fome" 124 00:05:25,400 --> 00:05:26,770 pensei bolha. 125 00:05:26,770 --> 00:05:29,670 >> Agora, a execução do programa novamente, vemos que o peixe 126 00:05:29,670 --> 00:05:31,580 não ficar interrompido com pensamentos de fome quando o 127 00:05:31,580 --> 00:05:33,820 puffs de queijo estão fora. 128 00:05:33,820 --> 00:05:36,820 O último problema que temos é que os sopros de queijo não vão 129 00:05:36,820 --> 00:05:39,800 embora depois de o peixe, entre aspas, "come-los". 130 00:05:39,800 --> 00:05:42,305 A partir dos scripts de peixe, não há nenhuma maneira fácil de esconder do brega 131 00:05:42,305 --> 00:05:44,710 puffs, por isso precisamos enviar uma mensagem para os sopros de queijo 132 00:05:44,710 --> 00:05:46,780 sprite para esconder-se. 133 00:05:46,780 --> 00:05:49,550 Nós poderíamos fazer isso com outra variável que as baforadas de queijo 134 00:05:49,550 --> 00:05:52,680 Sprite tem acesso, bem como o sprite peixe. 135 00:05:52,680 --> 00:05:55,720 >> No entanto, há uma forma mais limpa de fazer isso neste caso, 136 00:05:55,720 --> 00:05:57,840 pois em vez de enviar uma mensagem a um script que é 137 00:05:57,840 --> 00:06:00,570 em algum lugar no meio da execução, podemos enviar o 138 00:06:00,570 --> 00:06:03,710 mensagem a um script que está esperando para começar. 139 00:06:03,710 --> 00:06:07,360 Nós fazemos isso por ter o peixe transmissão de um evento, um Nós 140 00:06:07,360 --> 00:06:08,800 chamar comido. 141 00:06:08,800 --> 00:06:11,510 Então, nós vamos criar um script para os sopros de queijo que vontade 142 00:06:11,510 --> 00:06:13,030 esperar para este evento. 143 00:06:13,030 --> 00:06:15,560 Isto é semelhante ao caso a barra de espaço, só que desta 144 00:06:15,560 --> 00:06:19,250 tempo, o usuário não é o único diretamente acionando o evento. 145 00:06:19,250 --> 00:06:22,800 Agora tudo o que temos a fazer é definir nossa volta variável foodFound 146 00:06:22,800 --> 00:06:25,750 para false, e agora podemos dar o peixe com fome como muitos 147 00:06:25,750 --> 00:06:28,470 porções de puffs de queijo como ele quer. 148 00:06:28,470 --> 00:06:30,040 >> Então não é tão ruim, certo? 149 00:06:30,040 --> 00:06:33,400 Em C, escrever multi-threaded programas é mais complicado, 150 00:06:33,400 --> 00:06:35,700 mas os princípios são os mesmos. 151 00:06:35,700 --> 00:06:38,690 De qualquer forma, eu espero que você tenha um grande momento a construção de um pouco de diversão 152 00:06:38,690 --> 00:06:41,030 programas simultâneos em Scratch. 153 00:06:41,030 --> 00:06:42,570 Meu nome é Nate Hardison. 154 00:06:42,570 --> 00:06:45,260 Este é CS50.