[Powered by Google Translate] NATE hardison: Khi bạn đã có nhiều chương trình mở trên một máy tính, nó có vẻ như tất cả mọi thứ chạy cùng một lúc. Ví dụ, bạn có thể được làm việc trong một trình duyệt web như Firefox hoặc Internet Explorer, nghe nhạc trên iTunes, và viết một bài luận với Word. Tuy nhiên, dưới mui xe, các chương trình thực sự chạy một tại một thời điểm. Đó là công việc của hệ điều hành, Windows, Mac OSX, hoặc Linux, để quản lý các quy trình riêng biệt, như là chương trình này được biết đến, và chuyển đổi giữa chúng để khi bạn đi kiểm tra trang Facebook của bạn để làm việc trên bài luận của bạn một lần nữa, Word là một trong đó là chạy. Đôi khi, mặc dù, chúng tôi muốn chương trình tự để có thể làm nhiều điều như thế này, quá. Nếu bạn đang như tôi, bạn có thể có một loạt các các tab khác nhau mở ra trong trình duyệt web của bạn, một cho email, một với lịch, và như vậy. Chúng ta có thể đối xử với mỗi tab là một chương trình riêng biệt hoặc những quá trình, như Google Chrome không có gì, nhưng nhiều chương trình sử dụng một phiên bản trọng lượng nhẹ của một quá trình được gọi là một sợi. Một sợi chỉ là một đơn vị chế biến, một bộ hướng dẫn hoặc mã có thể "chạy", quote unquote, đồng thời với các chủ đề khác. Đây là những gì làm cho nó có thể cho bạn để duyệt Facebook trong khi nghe tôi trong nền hoặc có hai Video YouTube đang chơi cùng một lúc. Vì vậy, chủ đề chung này, được gọi là đồng thời, thường không đi lên ngay từ đầu khóa học khoa học máy tính bởi vì các chi tiết cấp thấp hơn yêu cầu thảo luận hệ điều hành và các loại tương tự. Tuy nhiên, các ngôn ngữ lập trình, chúng tôi sử dụng tại đầu CS50, Scratch, cung cấp một số công cụ tiện lợi để làm cho nó dễ dàng hơn để viết các chương trình với nhiều điều xảy ra cùng một lúc. Khi bạn xây dựng các chương trình Scratch, bạn liên tục làm việc với các chủ đề. Mỗi kịch bản Scratch, mà là một khối mã bắt đầu với một trong những "khi" mảnh ghép, có thể được coi như là một chủ đề riêng biệt. Hãy xem xét một chương trình Scratch đơn giản để xem cách làm việc này. Ở đây, chúng tôi đã có một đối tượng cá, hoặc sprite, với hai kịch bản rằng cả hai bắt đầu khi chúng ta nhấn vào nút lá cờ nhỏ màu xanh lá cây. Các kịch bản đầu tiên kiểm soát chuyển động của cá. Khi lá cờ màu xanh lá cây được nhấp, cá bị đặt ở phía bên trái của màn hình, được gọi là sân khấu, phải đối mặt với bên phải. Sau đó, trong một tập hợp các hướng dẫn sẽ chạy mãi mãi, cho đến khi chúng tôi dừng chương trình, cá lướt nhẹ về phía bên phải, quay lại, quay ngược lại về phía bên trái, và quay lại một lần nữa. Kịch bản thứ hai điều khiển quá trình suy nghĩ của cá. Nó chỉ ra rằng đây là một con cá đói. Vì vậy, sau khi chờ đợi 3 giây, con cá sẽ nghĩ, "Tôi đói", cho một thứ hai thứ tư. Kịch bản này cũng chạy mãi mãi. Và như chúng ta thấy, từ chạy chương trình bằng cách nhấn vào màu xanh lá cây cờ, cả hai tập tin xuất hiện để thực hiện cùng một lúc. Cá di chuyển và nghĩ rằng cùng một lúc. Kể từ khi cá nghèo trông đói quá, chúng ta hãy thêm vào một số cheesy nhát cho nó ăn. Hy vọng rằng họ sẽ không tan rã trong nước. Khi chúng ta thêm vào một ma thứ hai, chúng tôi cũng sẽ có thể thêm vào trong kịch bản tương ứng với ma đó. Và, do đó, có sẽ là một tập hợp các chủ đề sẽ chạy. Để cung cấp cho người sử dụng của chương trình kiểm soát của chúng tôi hơn khi đói cá được thực phẩm, chúng ta hãy nói rằng bất cứ khi nào không gian Bar là hit, nhát cheesy xuất hiện trên sân khấu. cá để ăn. Trước khi chúng tôi nhấn thanh Space, chúng tôi sẽ muốn giữ cheesy nhát ẩn để cá không thể nhìn thấy chúng. Để làm điều này, chúng tôi sẽ cần một vài kịch bản cho cheesy nhát ma. Các kịch bản đầu tiên, lá cờ màu xanh lá cây, sẽ giấu thức ăn. Không giống như các kịch bản khác mà chúng tôi đã viết, một trong những điều này sẽ không giữ chạy mãi mãi. Nó sẽ bắt đầu và kết thúc rất nhanh chóng, ngay khi chúng ta click nút lá cờ màu xanh lá cây. Các kịch bản tiếp theo chúng ta sẽ chờ đợi cho thanh Space để ép trước khi thực hiện. Chúng ta có thể chờ cuộc gọi cho người sử dụng đầu vào "chờ đợi" hay "lắng nghe" cho một sự kiện. Và mã để thực thi khi một sự kiện được nhận hoặc nghe được gọi là mã xử lý sự kiện. Space Bar xử lý sự kiện của chúng tôi sẽ hiển thị các nhát cheesy trên màn hình để cá có thể ăn chúng. Tại thời điểm này, mọi thứ đều tốt. Điều tiếp theo chúng ta cần làm là tìm hiểu làm thế nào để có được cá để nhận ra rằng có thực phẩm để ăn. Hãy thêm một thread để cá liên tục kiểm tra có hay không nó chạm vào nhát cheesy. Chúng tôi làm điều này trong một thread riêng biệt vì đó là cách chúng ta có thể liên tục kiểm tra cho thực phẩm. Nếu không, chúng tôi chỉ muốn có thể kiểm tra định kỳ đối với thực phẩm giữa trượt, quay lại, chờ đợi, hoặc suy nghĩ. OK. Bây giờ hãy chạy chương trình Scratch của chúng tôi. Theo dự kiến, các thực phẩm ngay lập tức ẩn và đói cá bơi qua lại giống như trước đây. Khi chúng ta nhấn thanh Space, nhát cheesy đi vào xem, và cá đói nói whoo. Nhưng chờ đợi, đó là lạ. Làm thế nào đến cá "Tôi đói" làm gián đoạn suy nghĩ các công cụ khác? Điều này là bởi vì chúng tôi đã không thiết lập bất kỳ phối hợp giữa ba kịch bản cá. Mỗi đang chạy trong thread riêng của mình, quên những gì các người khác đang làm. Hãy để sửa lỗi này trước khi chúng tôi di chuyển trên. Phối hợp giữa các chủ đề là một nhiệm vụ khó khăn vì chúng ta không có kiểm soát rõ ràng hơn khi mỗi thread chạy hoặc không chạy. Để gửi một tin nhắn từ một trong những chủ đề khác, chúng tôi sẽ cần sử dụng một biến mà chúng ta có thể thiết lập, hoặc viết, trong một thread và đọc trong khác. Hãy tạo ra một foodFound gọi là biến mà chúng ta có thể thiết lập để đúng khi cá chạy vào nhát cheesy. Vâng, tất nhiên, chúng tôi muốn đảm bảo rằng chúng tôi đặt nó vào sai ban đầu. Sau đó, trong luồng suy nghĩ của cá, chúng tôi sẽ kiểm tra để xem nếu cá đã tìm thấy thức ăn trước khi hiển thị "Tôi đói" nghĩ rằng bong bóng. Bây giờ, chạy chương trình một lần nữa, chúng ta thấy rằng loài cá không bị gián đoạn suy nghĩ của đói nhát cheesy. Vấn đề cuối cùng chúng ta có là rằng nhát cheesy không đi đi sau khi cá, trích dẫn unquote, "ăn". Từ kịch bản cá, không có cách nào dễ dàng để ẩn cheesy nhát, vì vậy chúng tôi cần phải gửi một thông điệp tới các nhát cheesy sprite để ẩn thân. Chúng ta có thể làm điều này với một biến khác mà nhát cheesy sprite có quyền truy cập, cũng như sprite cá. Tuy nhiên, có một cách sạch hơn để làm điều này trong trường hợp này, kể từ khi thay vì gửi một thông điệp đến một kịch bản đó là một nơi nào đó ở giữa thực hiện, chúng tôi có thể gửi tin nhắn đến một kịch bản mà chờ đợi để bắt đầu. Chúng tôi làm điều này bằng cách có cá phát sóng một sự kiện, một trong chúng tôi sẽ gọi ăn. Sau đó, chúng tôi sẽ tạo ra một kịch bản cho các nhát cheesy sẽ chờ cho sự kiện này. Điều này cũng tương tự như sự kiện Bar Space, ngoại trừ việc này thời gian, người sử dụng không phải là người trực tiếp gây ra sự kiện. Bây giờ tất cả chúng ta phải làm là thiết lập biến foodFound của chúng tôi trở lại là sai, và bây giờ chúng tôi có thể cung cấp cho các cá đói như nhiều người phần nhát cheesy như nó muốn. Vì vậy, không quá xấu, phải không? Trong C, viết các chương trình đa luồng là phức tạp hơn, nhưng những điều cơ bản là giống nhau. Dù sao, tôi hy vọng bạn có một thời gian tuyệt vời xây dựng một số thú vị đồng thời các chương trình trong Scratch. Tên là Nate hardison. Đây là CS50.