2010-01-15 26 views

Trả lời

10

Nói chung một 'cuộc gọi lại' nằm dưới sự kiểm soát của quá trình phát hiện. Vì vậy, bạn yêu cầu trình quản lý GUI "gọi myaction khi nút này được nhấn" và trình quản lý GUI gọi hành động khi nút được nhấn.

Trình xử lý sự kiện mặt khác hoạt động ở một bước đã bị xóa. Trình quản lý GUI được cấu hình để gửi tin nhắn đến một trình xử lý sự kiện. Bạn nói với người quản lý sự kiện rằng việc nhấn nút được xử lý bởi chương trình myaction. Khi nút được đẩy, trình quản lý GUI sẽ đặt một thông báo trên hàng đợi xử lý sự kiện và tiếp tục với quản lý GUI, trình xử lý sự kiện sẽ nhận thông báo từ hàng đợi, xem đó là một nút nhấn, kích hoạt chương trình myaction và chuyển sang xử lý sự kiện tiếp theo. Thông thường chương trình myaction sẽ chạy như một luồng độc lập hoặc thậm chí là một quá trình riêng biệt.

Trong khi mẫu "trình xử lý sự kiện" phức tạp hơn, nó mạnh mẽ hơn và ít có khả năng treo khi hành động không thành công. Nó cũng làm cho một giao diện đồ họa đáp ứng hơn.

+0

Câu trả lời này phải được đánh dấu là Đã chấp nhận. –

26

Trình xử lý sự kiện là một kiểu gọi lại. Nó được gọi bất cứ khi nào một sự kiện xảy ra. Thuật ngữ này thường được sử dụng trong điều khoản của giao diện người dùng, nơi các sự kiện là những thứ như di chuyển chuột, nhấp vào một cái gì đó và như vậy.

+5

Vì vậy, có các trường hợp khác khi gọi lại có thể được gọi? Ngoài các sự kiện? Bạn có thể cho ví dụ về một tình huống như vậy không? –

+2

@cletus, tôi thích bạn trả lời, nhưng bạn có thể thêm một số ví dụ về xử lý sự kiện là gì và gọi lại là gì. Tôi hiểu những gì bạn nói .. nhưng một cuộc gọi lại luôn xảy ra bởi vì "điều gì đó xảy ra", điều gì đó xảy ra xảy ra 99,999999% (với sự khiêm tốn của tôi) là một sự kiện, tôi sẽ không sử dụng từ khác, và do đó, ý nghĩa khác. .. và ở đó trước khi kết luận rằng kỹ thuật nói là điều CÙNG. Xin hãy giúp tôi cải thiện sự thừa nhận của tôi. Cảm ơn!! Lời chào hỏi! :). Hãy thử suy nghĩ theo cách này ... Bạn có thể liệt kê các loại gọi lại khác không thuộc về một sự kiện cụ thể không? – Victor

36

Gọi lại là thủ tục bạn chuyển làm đối số cho một quy trình khác. Các thủ tục nhận được tham số có thể gọi nó, hoặc chia sẻ nó để một số thủ tục khác trong hệ thống có thể gọi nó.

Trình xử lý sự kiện là thủ tục được gọi khi sự kiện diễn ra. Nó có thể là một cuộc gọi lại.

-3

Trình xử lý sự kiện là cuộc gọi lại từ hệ thống.

0

Tôi thích cách tất cả các câu trả lời này khác nhau.

Tôi sẽ kết luận từ điều này, đó là từ quan điểm thuật ngữ của Sự kiện và Gọi lại có thể hoán đổi cho nhau. Những gì họ có ý nghĩa trong một ngôn ngữ lập trình cụ thể hoặc khuôn khổ và khác nhau mặc dù, bởi vì bất kỳ nền tảng có xu hướng chọn thuật ngữ yêu thích của họ.

+0

Không thể hoán đổi cho nhau; thay vào đó, một trình xử lý sự kiện là một kiểu gọi lại.Đó là sự thật, tuy nhiên mà mọi người một số lần sử dụng một loại rất cụ thể của một điều để chỉ loại chung. Một Kleenex là một mô, nhưng bạn sẽ không thực sự nói rằng bạn có thể sử dụng các từ thay thế cho nhau, phải không? –

+0

Vì vậy, xin vui lòng Esteban khai sáng cho chúng tôi với các ví dụ cụ thể về các cuộc gọi lại không phải là trình xử lý sự kiện. Đối với kỹ thuật nói của tôi là, trong khía cạnh ngữ nghĩa cơ bản khác nhau, cùng một điều. Cảm ơn và lời chào :). – Victor

8

Gọi lại (từ Wikipedia): "mã thực thi được chuyển làm đối số cho mã khác".
Trình xử lý sự kiện (một lần nữa từ Wikipedia): "chương trình con gọi lại không đồng bộ xử lý các đầu vào nhận được trong một chương trình".

Điều này xảy ra theo cách tôi luôn hiểu: trình xử lý sự kiện là kiểu gọi lại rất cụ thể.

9

Câu hỏi này rất cũ nhưng tôi thấy liên kết này từ MSDN rất thú vị. Tôi hy vọng bất kỳ ai khác tình cờ gặp câu hỏi này sẽ nhận được điều gì đó từ liên kết này.

+1

Liên kết tuyệt vời. Cảm ơn. – Tilak

+2

Thú vị. Để diễn giải bài báo: một sự kiện giống như một tweet; bất cứ ai cũng có thể đọc và trả lời nó. Trong khi gọi lại giống như một tin nhắn văn bản; chỉ người bạn gửi nó mới có thể đọc và trả lời nó. – shawnhcorey

1

Câu trả lời của James Anderson là chi tiết nhất. Mở rộng câu trả lời của anh ấy; Gọi lại đề cập đến bất kỳ mã nào, được chuyển thành đối số cho một phương thức, được dự định sẽ được gọi sau không đồng bộ. Tuy nhiên, một cuộc gọi lại không xác định cách thức thực hiện quá trình gọi lại. Đây là nơi phân loại callbacks bắt đầu. Theo truyền thống, một quá trình gọi lại sẽ xem xét:

  • nhà phát triển định nghĩa một callback và chuyển nó vào một thư viện chức năng được xác định (một trong đó biết phải làm gì với các cuộc gọi lại để quá trình gọi điện thoại hoặc quá trình phát hiện có thể gọi nó) ví dụ trong nút,

var server = require('http').createServer(function(req, res){/* your code */});

các createServer là thư viện được xác định chức năng mà làm cho chắc chắn quá trình phát hiện được gọi callback đúng, mà trong trường hợp này là function(req, res){/* your code */}

  • trong thời gian chạy, quá trình phát hiện nhận được vị trí trực tiếp của cuộc gọi lại (vì hàm thư viện được định nghĩa đã thực hiện nó cho bạn) và gọi nó. Điều này có nghĩa là 2 điều:
    • nhà phát triển thư viện sẽ luôn cần biết cách xử lý các quy trình phát hiện khác nhau vì mỗi cách có thể có cách gọi khác lại
    • và nếu gọi lại cần gọi nhiều lần , nó có thể thực hiện quá trình phát hiện. Ví dụ: nếu quá trình phát hiện là một quá trình GUI, thì bạn sẽ muốn thread GUI chạy với nhiệm vụ ít hơn nhiều càng tốt, cho một trải nghiệm GUI mượt mà.

Như vậy kết quả cần thực hiện một cơ chế gọi lại, trong đó giải quyết những 2 vấn đề:

  • một quá trình bên ngoài mà sẽ xác định một điểm đồng thời cho hàm thư viện để đăng ký callbacks và cho quy trình phát hiện để thông báo khi nào các cuộc gọi lại đã đăng ký này cần phải được gọi.
    • Điều này có nghĩa là các nhà phát triển của cả hai quy trình này giờ đây có thể làm việc độc lập với nhau, mà không thực sự biết cách của nhau.
    • Quá trình bên ngoài này được gọi là vòng lặp sự kiện (trong nút, ví dụ:). Thuật ngữ 'sự kiện' chỉ đơn giản là quá trình thông báo vòng lặp sự kiện theo quy trình phát hiện và cuộc gọi lại đã đăng ký được gọi là trình xử lý sự kiện.
  • quy trình bên ngoài (hoặc vòng lặp sự kiện) đã xếp hàng đợi các sự kiện và thực hiện chúng, do đó thực hiện quá trình phát hiện có thể tiếp tục.

Như vậy cho các sự kiện đã xảy ra nhiều lần, vòng lặp sự kiện hoặc xử lý sự kiện đã trở thành con đường của callbacks thực hiện, trong khi callbacks ban đầu vẫn được ưa chuộng hơn cho một lần sự kiện như bạn đang không thực sự tác vụ việc phát hiện và không cần phải có vòng lặp sự kiện cho một sự kiện vì nó không hiệu quả.

  • Mã js nút ở trên là sự kiện một lần (vì kết nối với máy chủ cho khách hàng là sự kiện một lần trong khi có nhiều câu trả lời được thực hiện dưới dạng trình xử lý sự kiện) và là ví dụ gọi lại đơn giản.
0

Cơ chế cơ bản tương tự, nhưng ngữ nghĩa thì khác. Cả gọi lại và trình xử lý sự kiện được gọi là không đồng bộ.

Chức năng gọi lại thường được chuyển một cách rõ ràng từ thói quen người gọi để yêu cầu một số thông tin. Thông tin được trả về một thời gian sau đó, được truyền lại như là các đối số quay lại cuộc gọi lại bởi callee. Tại thời điểm này, các thói quen gọi điện thoại hoàn thành kinh doanh của mình. Thường thì gọi lại là một đóng cửa - cú pháp bên trong thói quen gọi điện thoại, và thường không được đặt tên (ẩn danh). Nó có thể trông giống như dưới đây, trong javascript:

function caller() { 
    someLibrary.getMeSomething(arg1, arg2, function(returnedData) { 
     // this is the callback which will do something with returnedData 
    }); 
} 

Vì vậy, các callee (someLibrary.getMeSomething) được đưa ra một hàm callback nặc danh, và một thời gian sau đó chức năng này được gọi với returnedData. Một cuộc gọi lại giống như một sự kiện một lần cho một người nhận đơn lẻ.

Trình xử lý sự kiện cũng được gọi lại, nhưng nói chung chúng được sử dụng trong một khoảng thời gian dài cho nhiều sự kiện, như nhấp chuột, sự kiện mạng vv Ngoài ra, nhiều đối tượng có thể quan tâm đến cùng một sự kiện. Vì những lý do này, bạn thường 'đăng ký' hoặc 'đăng ký' cho các sự kiện trong mã thiết lập (như khởi tạo đối tượng) và trình xử lý sự kiện thường là phương thức được đặt tên. Thông thường, mỗi loại sự kiện được xác định là một hằng số hoặc chuỗi.

Vì vậy, trong Python nó có thể trông giống như:

class MyUIClass: 

    def __init__(self): 
     someUILib.register(someUILib.events.MOUSE_CLICK, self.my_mouse_click_handler); 

    def my_mouse_click_handler(self, eventInfo): 
     # do something with event 
     if eventInfo.x < 100: 
      print 'You clicked in the margin' 
3

Một khía cạnh khác của việc này là sự kiện mô tả một cái gì đó đã xảy ra trong quá khứ, trong khi một callback thường được sử dụng trong khi một cái gì đó đang xảy ra.

Khi một sự kiện kích hoạt, bạn đang được thông báo rằng có điều gì đó đã xảy ra. Khi một cuộc gọi lại được sử dụng, bạn đang được yêu cầu tham gia vào một cái gì đó.

Thư viện hoặc khung công tác có thể phát hành sự kiện cho bạn biết điều gì đó đã xảy ra. Một khung công tác cung cấp cho bạn các điểm mà tại đó bạn có thể cắm mã (có thể là gọi lại) để bạn có thể chủ động tham gia vào một quy trình.

Một phần của vấn đề là sự kiện đó, gọi lại tham khảo các kỹ thuật mcehanisms cũng như các quy trình trừu tượng hơn.

+0

Tôi coi đây là câu trả lời hay nhất. –

7

Sự kiện - Suy nghĩ về máy chủ (Employee) và Client (Boss). Một nhân viên có thể có nhiều Boss. Nhân viên Tăng sự kiện, khi anh ta hoàn thành nhiệm vụ, và các Boss có thể quyết định lắng nghe sự kiện Nhân viên hay không. Nhân viên là nhà xuất bản và các ông chủ là người đăng ký.

Gọi lại - Boss yêu cầu nhân viên thực hiện một công việc và khi kết thúc công việc, Boss muốn được thông báo. Các nhân viên sẽ đảm bảo rằng khi công việc được thực hiện, anh ta thông báo chỉ Boss mà yêu cầu, không cần thiết tất cả các Bosses. Nhân viên sẽ không thông báo cho Boss, nếu công việc từng phần được thực hiện. Nó sẽ chỉ sau khi tất cả các nhiệm vụ được thực hiện. Chỉ một ông chủ yêu cầu thông tin, và nhân viên chỉ đăng trả lời cho một ông chủ.

Các vấn đề liên quan