Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 15 kết quả

Đề tài: Bản chất của cơ chế event trong C# như thế nào ?

  1. #1
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    Mặc định Bản chất của cơ chế event trong C# như thế nào ?

    mình hỏi nốt câu cuối cho ngà h6on nay: bản chất của cơ chế event trong C# là gì ?

    có phải là người ta định nghĩa một loạt các điều kiện để sự kiện xảy ra, rồi sau đó cho một vòng lặp vô hạn, cứ đi lần lượt kiểm tra từng điều kiện một, nếu điều kiện của event nào thỏa mãn thì thi hành delegate của event đó không.

    Một điểm nữa, tại sao lại quy ước khi subscribe một event thì dùng toán từ +=,
    ví dụ:
    this.Load += new System.EventHandler(this.Form1_Load);

    mình đọc thấy dòng lệnh trên không có nghĩa, this.Load thuộc kiểu EvenHander, một EvenHander + một EvenHandler theo lý thông thường phải ra một eventhandler mới, không liên quan gì đến từ "subcribe" cả, vậy phải hiểu dòng lệnh trên như nào cho đúng.
    cám ơn mọi người.

  2. #2
    Ngày gia nhập
    03 2009
    Nơi ở
    %appdata%\Temp
    Bài viết
    819

    Sang ngày mới rồi bạn ơi. )
    1. Muốn tìm hiểu cơ chế Event tốt nhất nên đọc về Interrupt (ngắt) của vi xử lí rồi sẽ hiểu. Trước thì mình cũng tưởng như bạn đấy )
    2. Cái thứ 2 thi mình chịu vì mình không có học C#. Trong java thì button.addActionListener(...);
    .::[The best way to predict the future is to invent it]::.
    __________________________________________________ _ - Alan Kay -

  3. #3
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    ), hôm qua nhấn nút gửi là 11:58, không biết lên kia lại thành 12:02

    tức là nó giống cơ chế ngắt của vi sử lý ? cứ vừa chạy vừa kiểm tra ?, liệu bạn có thể vẽ một cái hình minh họa dc không, (hoặc so sánh nó với cơ chế hàng đợi thông điệp của windows cũng dc), thanks nhiều.

  4. #4
    Ngày gia nhập
    04 2010
    Bài viết
    51

    Không phải là cho vòng lặp chạy rồi cứ kiểm tra liên tục vậy đâu.
    VD bạn tạo 1 control button, khi click vào button, hdh sẽ gửi thông điêp click tới button đó. Ở cấp độ thấp bên dưới, khi control được tạo, thông qua API, nó sẽ đăng ký với hdh một số method để nhận các thông điệp. Khi nhận được thông điệp MOUSE_DOWN chẳng hạn, nó sẽ gọi con trỏ hàm đăng ký sự kiện click (bên C# gọi là delegate/event), và do đó class cấp cao hơn sẽ nhận được sự kiện đó.
    mình đọc thấy dòng lệnh trên không có nghĩa, this.Load thuộc kiểu EvenHander, một EvenHander + một EvenHandler theo lý thông thường phải ra một eventhandler mới, không liên quan gì đến từ "subcribe" cả, vậy phải hiểu dòng lệnh trên như nào cho đúng.
    cám ơn mọi người.
    "Lý thông thường" là lý nào vậy bạn. Bạn đừng nhầm toán tử += trong toán học nhé. Trong lập trình OOP, có thể override toán tử mà. Trong trường hợp này, toán tử + có nghĩa là add vào list. Giống như bên java có hàm addActionListener. Môt event có thể đăng ký được nhiều phương thức mà. Thông thường thì chỉ đăng ký 1 method thôi, nên cũng thể thể dùng phép gán = , thay vì +=.

  5. #5
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    vậy event/delegate thực ra chỉ là tên gọi hướng đối tượng của cơ chế hàng đợi ?
    xin hỏi bạn thêm từ độc lập hệ điều hành trong .Net thể hiện ở đâu ?

  6. #6
    Ngày gia nhập
    04 2010
    Bài viết
    51

    Mặc định Bản chất của cơ chế event trong C# như thế nào ?

    Trích dẫn Nguyên bản được gửi bởi pkthanh92 Xem bài viết
    vậy event/delegate thực ra chỉ là tên gọi hướng đối tượng của cơ chế hàng đợi ?
    xin hỏi bạn thêm từ độc lập hệ điều hành trong .Net thể hiện ở đâu ?
    Không liên quan gì tới hàng đợi ở đây hết.
    Độc lập tự do hạnh phúc gì bạn nói chả hiểu gì cả. Bạn lấy từ đó ở đâu thì xin trích dẫn nguồn để tớ hiểu rõ...

  7. #7
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    thì gửi message từ chuột cho hệ điều hành, rồi, hệ điều hành gửi lại message cho ứng dụng, trong ứng dụng phải có một vòng lặp để liên tục kiểm tra xem có message từ hdh không chứ.

    sorry, chính xác là "chạy trên nhiều hệ điều hành khác nhau, độc lập với bộ xử lý".

    Dừng bàn luận về event trong windows, mình muốn hiểu rõ về event trong một tuyến trước đã, liệu có phải thực chất cơ chế event như mình trình bày ở trên ?

    "có phải là người ta định nghĩa một loạt các điều kiện để sự kiện xảy ra, rồi sau đó cho một vòng lặp vô hạn, cứ đi lần lượt kiểm tra từng điều kiện một, nếu điều kiện của event nào thỏa mãn thì thi hành delegate của event đó không."

  8. #8
    Ngày gia nhập
    03 2009
    Nơi ở
    %appdata%\Temp
    Bài viết
    819

    Nếu bạn hiểu về cơ chế ngắt của vi xử lí rồi thì để mình giải thích.
    Trước hết, giả sử ngắt khi bạn ấn phím K có vị trí tại 0x80020000. Vậy khi bạn muốn thực hiện một việc nào đó, bạn viết một đoạn mã cho việc đó, rồi tại vị trí ngắt trên, bạn dùng một lệnh jump để nhảy tới đoạn chương trình của bạn.
    Và CPU sẽ tự nhận ra điều này ở cuối mỗi nhịp xử lí (xử lí ngắt ở cuối mỗi chu kì đồng hồ) và thực hiện đoạn chương trình trên.
    Và hệ điều hành đã làm cho ta hết việc này rồi (HĐH mà, nó luôn kì diệu như vậy). Mối khi có sự kiện, nó sẽ gửi đến những chương trình đã đăng kí sự kiện đó để nó xử lí trong luồng tiến trình riêng của ứng dụng đó.
    Với C# và Java thì đó là Runtime (CLR và JRE) thì nó hoạt động cũng giống như hđh vậy. Nó nhận tín hiệu từ hđh và gửi nó đến các EventHandler đã đăng kí từ trước. Các EventHandler được đăng kí cũng như kiểu bạn viết một đoạn mã rồi đăng kí nó vào ngắt 0x80020000 ở trên vậy.
    Bên Java điều này được thực hiện bởi AWT Event Dispatching Thread.

    Hi vọng bạn đã hiểu!
    PS: Chịu khó tìm hiểu thêm nhiều nguồn nếu muốn hiểu sâu, tam sao thất bản mà. Những điều mình diễn tả cũng chỉ là học hỏi từ nguồn khác, và vì thế cũng có những chỗ ko chính xác bằng
    .::[The best way to predict the future is to invent it]::.
    __________________________________________________ _ - Alan Kay -

  9. #9
    Ngày gia nhập
    10 2009
    Nơi ở
    Close All
    Bài viết
    993

    Thực chất thì luôn có 1 vòng loop để liên tục lấy các Message ra để xử lí (Bạn nào học qua Win32 API thì cũng biết cái này ). Tùy vào các message loại j..... Các Message đc hàm xử lí thông điệp xử lí (WinProc) . C# nó wrapper Win32API thôi. Nên tại hàm xử lí thông điệp , các Message tương ứng sẽ đc chuyển cho các callback function của bạn đã đăng kí và thực thi.

    +Cái thứ 2 : += đó, nó là overload toán tử nên người viết có thể làm bất cứ j trong đó mà bạn. Thâm chí có thể làm khác với ý nghĩa thông thường của toán tử cũng đc nữa. Microsoft nó làm vậy cũng dễ hiểu và trực quan mà.

    P/S: Tiếp xúc nhiều thấy hàng của Microsoft đúng là trực quan,dễ sử dụng , cú pháp ngôn ngữ (C#) cũng trực quan gần sát với thực tế nhất. Cơ mà vì nó chăm sóc tận răng nên đâm ra dễ sinh lười
    Đã được chỉnh sửa lần cuối bởi tauit_dnmd : 14-01-2012 lúc 02:14 PM.

  10. #10
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Mặc định Cách tạo event trong lập trình C#

    Thứ nhất là C# và .NET ra đời để cho người lập trình không cần phải hiểu, mà cứ kéo thả cho nhanh!
    Thứ 2 bạn nên hiểu là "event is not a loop". Để trả lời câu hỏi này, bạn chỉ cần trả lời câu hỏi: Tại sao lại gọi nó là event?

    Loại Event bạn nói trong C# gần giống với callback function trong C/C++. Bạn có thể tạo ra một event một cách dễ dàng. Những thứ loằng ngoằng khác Kevin xin để một ngày nào đó 'trời đẹp được bạn gái nào đó hun một cái' sẽ viết một bài, ở đây Kevin lấy ví dụ đơn giản:

    Giả sử rằng bạn muốn tạo một listview theo cách của bạn, bạn lấy tên nó là CVietListView. Bây giờ bạn muốn tạo một ItemChanged event cho CVietListView bạn làm như sau:

    1. Phần khai báo trong class CVietListView
    Visual C# Code:
    1. private EventHandler ItemChangedEvent;
    2. public event EventHandler ItemChanged
    3. {
    4.     add
    5.     {
    6.         this.ItemChangedEvent = (EventHandler)Delegate.Combine(this.ItemChangedEvent, value);
    7.     }
    8.     remove
    9.     {
    10.         this.ItemChangedEvent = (EventHandler)Delegate.Remove(this.ItemChangedEvent, value);
    11.     }
    12. }

    2. Raise event (Thời điểm xảy ra sự kiện)
    Ở đây bạn sẽ thêm vào sau khi item được thay đổi để đúng ý nghĩa của nó! Bạn cũng có thể đặt bất kỳ chỗ nào để thử!
    if (this.ItemChangedEvent != null) this.ItemChangedEvent(this, args);

    Vậy là CVietListView của bạn có một event ItemChanged giống như các event Load, Closing, MouseClick, ... Nhưng nó được xảy ra lúc nào, thời điểm nào là do quyết định của bạn!

    Bây giờ bạn đã hiểu câu ở trên rồi đấy: "event is not a loop"!
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

Các đề tài tương tự

  1. Vay tín chấp vpbank không cần thế chấp tài sản 0989913708
    Gửi bởi ngahsew trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 36
    Bài viết cuối: 02-01-2014, 08:37 AM
  2. Trả lời: 8
    Bài viết cuối: 12-11-2013, 11:52 AM
  3. Biểu thức Regex chạy trong Expresso thì đúng nhưng chạy trong visual studio lại sai
    Gửi bởi rossoneri trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 30-06-2012, 02:58 PM
  4. Làm thế nào để chạy TC++ 3.0 chế độ fullscreen trên win vista
    Gửi bởi agustudent trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 05-12-2007, 09:38 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn