1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] NATE Hardison: Bila Anda punya beberapa program terbuka pada 2 00:00:09,360 --> 00:00:11,250 komputer, sepertinya semuanya 3 00:00:11,250 --> 00:00:12,880 berjalan pada waktu yang sama. 4 00:00:12,880 --> 00:00:15,350 Sebagai contoh, Anda mungkin bekerja di web browser seperti 5 00:00:15,350 --> 00:00:19,360 Firefox atau Internet Explorer, mendengarkan musik di iTunes, 6 00:00:19,360 --> 00:00:21,490 dan menulis esai dengan Word. 7 00:00:21,490 --> 00:00:24,240 Namun, di bawah tenda, program sebenarnya 8 00:00:24,240 --> 00:00:25,830 dijalankan satu per satu. 9 00:00:25,830 --> 00:00:29,750 Ini adalah tugas dari sistem operasi, Windows, Mac OSX, atau 10 00:00:29,750 --> 00:00:33,070 Linux, untuk mengelola masing-masing proses terpisah, sebagai 11 00:00:33,070 --> 00:00:35,900 program diketahui, dan beralih di antara mereka sehingga ketika Anda 12 00:00:35,900 --> 00:00:38,610 pergi dari Anda memeriksa halaman Facebook untuk bekerja pada esai Anda 13 00:00:38,610 --> 00:00:41,590 lagi, Firman adalah salah satu yang berjalan. 14 00:00:41,590 --> 00:00:44,890 >> Kadang-kadang, meskipun, kita ingin program itu sendiri untuk dapat 15 00:00:44,890 --> 00:00:47,440 untuk melakukan beberapa hal seperti ini, juga. 16 00:00:47,440 --> 00:00:49,630 Jika Anda seperti saya, Anda mungkin memiliki banyak 17 00:00:49,630 --> 00:00:52,730 tab yang berbeda terbuka di browser web Anda, satu untuk email, 18 00:00:52,730 --> 00:00:55,070 satu dengan kalender, dan sebagainya. 19 00:00:55,070 --> 00:00:58,270 Kita bisa memperlakukan setiap tab sebagai program yang terpisah atau proses, 20 00:00:58,270 --> 00:01:01,300 seperti Google Chrome tidak, tapi banyak program menggunakan 21 00:01:01,300 --> 00:01:04,430 ringan versi proses yang disebut thread. 22 00:01:04,430 --> 00:01:07,190 >> Sebuah thread hanyalah unit pengolahan, satu set 23 00:01:07,190 --> 00:01:10,100 instruksi atau kode yang dapat "dijalankan", tanda kutip kutipan, 24 00:01:10,100 --> 00:01:12,560 bersamaan dengan benang lainnya. 25 00:01:12,560 --> 00:01:15,150 Inilah yang memungkinkan Anda untuk browsing Facebook 26 00:01:15,150 --> 00:01:17,940 sambil mendengarkan saya di latar belakang atau untuk memiliki dua 27 00:01:17,940 --> 00:01:20,790 Video YouTube bermain pada waktu yang sama. 28 00:01:20,790 --> 00:01:24,660 Jadi, ini topik umum, yang dikenal sebagai konkurensi, biasanya 29 00:01:24,660 --> 00:01:26,930 tidak datang begitu awal dalam kursus ilmu komputer 30 00:01:26,930 --> 00:01:29,790 karena tingkat rendah rincian membutuhkan diskusi 31 00:01:29,790 --> 00:01:31,930 sistem operasi dan sejenisnya. 32 00:01:31,930 --> 00:01:34,170 Namun, bahasa pemrograman yang kita gunakan di 33 00:01:34,170 --> 00:01:38,000 awal CS50, Scratch, menyediakan beberapa alat bagus untuk 34 00:01:38,000 --> 00:01:40,390 membuatnya lebih mudah untuk menulis program dengan beberapa hal 35 00:01:40,390 --> 00:01:42,390 terjadi sekaligus. 36 00:01:42,390 --> 00:01:45,050 >> Ketika Anda membangun program Scratch, Anda terus-menerus 37 00:01:45,050 --> 00:01:46,760 bekerja dengan benang. 38 00:01:46,760 --> 00:01:49,770 Setiap naskah Scratch, yang merupakan blok kode yang diawali dengan 39 00:01:49,770 --> 00:01:52,600 salah satu potongan puzzle "ketika", dapat dianggap 40 00:01:52,600 --> 00:01:54,380 sebagai thread terpisah. 41 00:01:54,380 --> 00:01:58,040 Mari kita lihat sebuah program Scratch sederhana untuk melihat bagaimana ini bekerja. 42 00:01:58,040 --> 00:02:01,730 >> Di sini, kita punya objek ikan, atau sprite, dengan dua script 43 00:02:01,730 --> 00:02:05,000 yang dimulai baik ketika kita klik tombol bendera kecil berwarna hijau. 44 00:02:05,000 --> 00:02:07,290 Script pertama mengontrol gerak ikan. 45 00:02:07,290 --> 00:02:09,850 Ketika bendera hijau diklik, ikan akan ditempatkan 46 00:02:09,850 --> 00:02:12,450 di sisi kiri layar, yang disebut panggung, 47 00:02:12,450 --> 00:02:14,090 menghadap ke kanan. 48 00:02:14,090 --> 00:02:17,070 Kemudian, dalam satu set instruksi yang akan dijalankan selamanya, sampai kita 49 00:02:17,070 --> 00:02:20,270 menghentikan program, ikan meluncur ke sisi kanan, 50 00:02:20,270 --> 00:02:22,900 berbalik, kembali ke sisi kiri, dan 51 00:02:22,900 --> 00:02:24,470 berbalik lagi. 52 00:02:24,470 --> 00:02:27,410 Script kedua mengontrol proses berpikir ikan itu. 53 00:02:27,410 --> 00:02:29,290 Ternyata bahwa ini adalah ikan lapar. 54 00:02:29,290 --> 00:02:32,080 Jadi setelah menunggu selama 3 detik, ikan akan berpikir, 55 00:02:32,080 --> 00:02:34,420 "Aku lapar," untuk kedua keempat. 56 00:02:34,420 --> 00:02:36,440 Script ini juga berjalan selamanya. 57 00:02:36,440 --> 00:02:38,940 Dan seperti yang kita lihat, dari menjalankan program dengan mengklik 58 00:02:38,940 --> 00:02:41,730 bendera hijau, kedua script tampaknya mengeksekusi 59 00:02:41,730 --> 00:02:43,100 secara bersamaan. 60 00:02:43,100 --> 00:02:46,460 Ikan bergerak dan berpikir pada saat yang sama. 61 00:02:46,460 --> 00:02:49,030 >> Karena ikan miskin terlihat begitu lapar, mari kita tambahkan di beberapa 62 00:02:49,030 --> 00:02:50,670 murahan puff untuk itu untuk makan. 63 00:02:50,670 --> 00:02:53,060 Mudah-mudahan mereka tidak akan hancur dalam air. 64 00:02:53,060 --> 00:02:55,560 Ketika kita menambahkan dalam sprite kedua, kita juga akan dapat 65 00:02:55,560 --> 00:02:58,020 menambahkan skrip sesuai dengan sprite itu. 66 00:02:58,020 --> 00:02:59,580 Dan, karena itu, akan ada satu set 67 00:02:59,580 --> 00:03:00,830 benang yang akan dijalankan. 68 00:03:03,590 --> 00:03:06,270 Untuk memberikan pengguna kontrol atas program kami ketika 69 00:03:06,270 --> 00:03:09,340 Ikan lapar mendapatkan makanan, mari kita mengatakan bahwa setiap kali Space 70 00:03:09,340 --> 00:03:11,840 Bar terkena, puffs cheesy muncul di panggung untuk 71 00:03:11,840 --> 00:03:13,300 ikan untuk dimakan. 72 00:03:13,300 --> 00:03:15,760 Sebelum kita memukul Space Bar, kita akan ingin menyimpan murahan 73 00:03:15,760 --> 00:03:19,020 puff tersembunyi sehingga ikan tidak bisa melihat mereka. 74 00:03:19,020 --> 00:03:21,140 Untuk melakukan hal ini, kita akan membutuhkan beberapa script untuk 75 00:03:21,140 --> 00:03:22,750 murahan puff sprite. 76 00:03:22,750 --> 00:03:26,980 Naskah pertama, bendera hijau, hanya akan menyembunyikan makanan. 77 00:03:26,980 --> 00:03:29,530 Berbeda dengan script lain kita telah menulis, yang satu ini tidak akan terus 78 00:03:29,530 --> 00:03:30,560 berjalan selamanya. 79 00:03:30,560 --> 00:03:33,250 Ini akan mulai dan selesai sangat cepat, tepat ketika kita klik 80 00:03:33,250 --> 00:03:35,000 tombol hijau bendera. 81 00:03:35,000 --> 00:03:37,180 >> Script berikutnya yang kita miliki akan menunggu untuk Space Bar untuk menjadi 82 00:03:37,180 --> 00:03:39,590 ditekan sebelum mengeksekusi. 83 00:03:39,590 --> 00:03:42,770 Kita bisa memanggil menunggu input pengguna "menunggu" atau "mendengarkan" 84 00:03:42,770 --> 00:03:43,860 untuk sebuah event. 85 00:03:43,860 --> 00:03:46,750 Dan kode yang mengeksekusi ketika sebuah peristiwa diterima atau 86 00:03:46,750 --> 00:03:50,280 mendengar disebut acara kode penanganan. 87 00:03:50,280 --> 00:03:53,550 Space Bar kami event handler akan menampilkan puffs cheesy pada 88 00:03:53,550 --> 00:03:56,330 layar sehingga ikan bisa makan mereka. 89 00:03:56,330 --> 00:03:58,880 Pada titik ini, semuanya terlihat baik. 90 00:03:58,880 --> 00:04:00,990 >> Hal berikutnya yang perlu kita lakukan adalah untuk mencari tahu bagaimana untuk mendapatkan 91 00:04:00,990 --> 00:04:03,570 ikan untuk menyadari bahwa ada makanan untuk dimakan. 92 00:04:03,570 --> 00:04:06,030 Mari kita tambahkan thread lain untuk ikan yang terus-menerus 93 00:04:06,030 --> 00:04:08,790 memeriksa apakah atau tidak itu menyentuh puff cheesy. 94 00:04:08,790 --> 00:04:11,510 Kami melakukan ini di thread terpisah sejak itu kita bisa 95 00:04:11,510 --> 00:04:13,710 terus-menerus memeriksa untuk makanan. 96 00:04:13,710 --> 00:04:16,829 Jika tidak, kita hanya akan dapat secara berkala memeriksa untuk makanan 97 00:04:16,829 --> 00:04:21,180 di antara meluncur, berbalik, menunggu, atau berpikir. 98 00:04:21,180 --> 00:04:22,000 >> OK. 99 00:04:22,000 --> 00:04:23,785 Sekarang mari kita menjalankan program Scratch kami. 100 00:04:23,785 --> 00:04:26,921 Seperti yang diharapkan, makanan segera menyembunyikan dan 101 00:04:26,921 --> 00:04:28,920 Ikan lapar berenang bolak-balik seperti sebelumnya. 102 00:04:32,050 --> 00:04:35,060 Ketika kita memukul Space Bar, puff murahan datang ke tampilan, 103 00:04:35,060 --> 00:04:37,470 dan ikan lapar kata whoo. 104 00:04:37,470 --> 00:04:39,340 Tapi tunggu, itu aneh. 105 00:04:39,340 --> 00:04:42,150 Bagaimana datang ikan "Aku lapar" mengganggu pikiran 106 00:04:42,150 --> 00:04:43,580 hal-hal lain? 107 00:04:43,580 --> 00:04:45,780 Hal ini karena kita tidak membangun koordinasi setiap 108 00:04:45,780 --> 00:04:47,590 antara tiga skrip ikan. 109 00:04:47,590 --> 00:04:50,610 Masing-masing berjalan di thread sendiri, menyadari apa yang 110 00:04:50,610 --> 00:04:52,120 orang lain lakukan. 111 00:04:52,120 --> 00:04:54,980 Mari kita perbaiki ini sebelum kita melanjutkan. 112 00:04:54,980 --> 00:04:57,700 >> Koordinasi antara benang adalah tugas yang rumit karena kita 113 00:04:57,700 --> 00:05:00,940 tidak memiliki kontrol eksplisit atas ketika setiap thread berjalan atau 114 00:05:00,940 --> 00:05:02,190 tidak berjalan. 115 00:05:02,190 --> 00:05:04,710 Untuk mengirim pesan dari satu thread ke yang lain, kita harus 116 00:05:04,710 --> 00:05:08,300 menggunakan variabel yang kita dapat mengatur, atau menulis, dalam satu thread 117 00:05:08,300 --> 00:05:10,170 dan membaca yang lain. 118 00:05:10,170 --> 00:05:12,920 Mari kita membuat foodFound disebut variabel yang kita dapat diatur untuk 119 00:05:12,920 --> 00:05:15,530 benar ketika ikan berlari ke puff cheesy. 120 00:05:15,530 --> 00:05:17,540 Yah, tentu saja, kami ingin memastikan bahwa kami set ke 121 00:05:17,540 --> 00:05:19,240 palsu awalnya. 122 00:05:19,240 --> 00:05:22,540 Kemudian, di thread pemikiran ikan, kami akan memeriksa untuk melihat apakah 123 00:05:22,540 --> 00:05:25,400 ikan telah menemukan makanan sebelum menampilkan "Aku lapar" 124 00:05:25,400 --> 00:05:26,770 berpikir gelembung. 125 00:05:26,770 --> 00:05:29,670 >> Sekarang, menjalankan program lagi, kita melihat bahwa ikan 126 00:05:29,670 --> 00:05:31,580 tidak bisa terganggu dengan pikiran kelaparan ketika 127 00:05:31,580 --> 00:05:33,820 puffs cheesy berada di luar. 128 00:05:33,820 --> 00:05:36,820 Masalah terakhir yang kita miliki adalah bahwa puffs cheesy tidak pergi 129 00:05:36,820 --> 00:05:39,800 pergi setelah ikan, mengutip tanda kutip, "makan" mereka. 130 00:05:39,800 --> 00:05:42,305 Dari script ikan, tidak ada cara mudah untuk menyembunyikan murahan 131 00:05:42,305 --> 00:05:44,710 puff, jadi kita perlu mengirim pesan ke puffs cheesy 132 00:05:44,710 --> 00:05:46,780 sprite untuk menyembunyikan diri. 133 00:05:46,780 --> 00:05:49,550 Kita bisa melakukan ini dengan variabel lain yang murahan puff 134 00:05:49,550 --> 00:05:52,680 sprite memiliki akses ke, serta sprite ikan. 135 00:05:52,680 --> 00:05:55,720 >> Namun, ada cara yang bersih untuk melakukan hal ini dalam kasus ini, 136 00:05:55,720 --> 00:05:57,840 sejak daripada mengirim pesan ke script yang 137 00:05:57,840 --> 00:06:00,570 di suatu tempat di tengah-tengah melaksanakan, kita dapat mengirim 138 00:06:00,570 --> 00:06:03,710 pesan ke script yang menunggu untuk memulai. 139 00:06:03,710 --> 00:06:07,360 Kami melakukan ini dengan memiliki ikan menyiarkan acara, salah satu kita akan 140 00:06:07,360 --> 00:06:08,800 sebut dimakan. 141 00:06:08,800 --> 00:06:11,510 Kemudian, kita akan membuat script untuk puffs cheesy yang akan 142 00:06:11,510 --> 00:06:13,030 menunggu acara ini. 143 00:06:13,030 --> 00:06:15,560 Hal ini mirip dengan acara Space Bar, kecuali bahwa ini 144 00:06:15,560 --> 00:06:19,250 waktu, pengguna bukan satu langsung memicu acara tersebut. 145 00:06:19,250 --> 00:06:22,800 Sekarang yang harus kita lakukan adalah mengatur kembali variabel foodFound kami 146 00:06:22,800 --> 00:06:25,750 menjadi false, dan kita sekarang dapat memberikan ikan lapar sebanyak 147 00:06:25,750 --> 00:06:28,470 porsi puffs cheesy karena ingin. 148 00:06:28,470 --> 00:06:30,040 >> Jadi tidak terlalu buruk, kan? 149 00:06:30,040 --> 00:06:33,400 Dalam C, menulis multi-threaded program yang lebih rumit, 150 00:06:33,400 --> 00:06:35,700 tapi dasar-dasar yang sama. 151 00:06:35,700 --> 00:06:38,690 Anyway, saya harap Anda memiliki banyak waktu membangun beberapa menyenangkan 152 00:06:38,690 --> 00:06:41,030 bersamaan program Scratch. 153 00:06:41,030 --> 00:06:42,570 Nama saya adalah Nate Hardison. 154 00:06:42,570 --> 00:06:45,260 Ini adalah CS50.