Sử dụng cỏc thành viờn tĩnh

Một phần của tài liệu TÌM HIỂU KỸ THUẬT MULTICAST XÂY DỰNG ỨNG DỤNG GIẢNG DẠY TRÊN MẠNG LAN (Trang 32 - 50)

Ta cú thể truy cập cỏc thành viờn static thụng qua tờn của lớp mà nú được khai bỏo trong đú.

a. Cỏch gọi một thành viờn tĩnh

Phương thức tĩnh (static) được núi là hoạt động trong lớp. Do đú, nú khụng thể được tham chiếu this chỉ tới. Phương thức static cũng khụng truy cập trực tiếp vào cỏc thành viờn khụng static được mà phải dựng qua thể hiện của đối tượng(đối với hàm main()).

b. Sử dụng Constructors tĩnh

Constructor tĩnh (static constructor) sẽ được chạy trước khi bất kỳ đối tượng nào tạo ra.Vớ dụ:

static Time( ) {

Name = "Time"; }

Khi dựng constructor tĩnh phải khỏ thận trọng vỡ nú cú thể cú kết quả khú lường.

c. Constructor private

Khi muốn tạo một lớp mà khụng cho phộp tạo bất kỷ một thể hiện nào của lớp thỡ ta dựng constructor private.

d. Sử dụng cỏc trường tĩnh

Cỏch dựng chung cỏc biến thành viờn tĩnh là giữ vết của một số cỏc thể hiện mà hiện tại nú đang tồn tại trong lớp đú.

2.10.4. Truyền tham số

C# cung cấp cỏc tham số ref để h iệu chỉnh giỏ trị của những đối tượng bằng cỏc tham chiếu.

a. Truyền bằng tham chiếu

Một hàm chỉ cú thể trả về một giỏ trị. Trong trường hợp muốn nhận về nhiều kết quả, ta sử dụng chớnh cỏc tham số truyền cho hàm như cỏc tham số cú đầu ra (chứa trị trả về). Ta gọi tham số truyền theo kiểu này là tham chiếu.

Trong C#, tất cả cỏc biến cú kiểu tham chiếu sẽ mặc định là tham chiếu khi cỏc biến này được truyền cho hàm. Cỏc biến kiểu giỏ trị để khai bỏo tham chiếu, sử dụng từ khúa ref.

b. Truyền tham số đầu ra (out parameter)

Để sử dụng được, một biến phải được khai bỏo và khởi tạo giỏ trị ban đầu. Cỏc biến theHour, theMinute, theSecond phải được khởi tạo giỏ trị 0 trước khi truyền cho hàm GetTime. Sau lời gọi hàm thỡ giỏ trị cỏc biến sẽ thay đổi ngay, vỡ vậy C# cung cấp từ khúa out để khụng cần phải khởi tạo tham số trước khi dựng.

2.11. Kế thừa và Đa hỡnh

Kế thừa là cỏch tạo mới một lớp từ những lớp cú sẵn. Tức là nú cho phộp tỏi sử dụng lại mó nguồn đó viết trong lớp cú sẵn. Đa hỡnh là việc lớp B thừa kế cỏc đặc tớnh từ lớp A nhưng cú thờm một số cài đặt riờng.

2.11.1 Sự kế thừa

Trong C#, mối quan hệ chi tiết hoỏ là một kiểu kế thừa. Sự kế thừa khụng cho mang ý nghĩa chi tiết hoỏ mà cũn mang ý nghĩa chung của tự nhiờn về mối quan hệ này. Khi ta núi rằng ListBox kế thửa từ Window cú nghĩa là nú chi tiết hoỏ Window. Window được xem như là lớp cơ sở (base class) và ListBox được xem là lớp kế thừa (derived class). Lớp ListBox này nhận tất cả cỏc đặc tớnh và hành vi của Window và chi tiết hoỏ nú bằng một số thuộc tớnh và phương thức của nú cần.

Trong C#, khi ta tạo một lớp kế thừa bằng cỏch cụng một thờm dấu “:” và sau tờn của lớp kế thừa và theo sau đú là lớp cơ sở như sau:

public class ListBox : Window cú nghĩa là ta khai bỏo một lớp mới ListBox kế thừa từ lớp Window.

Lớp kế thừa sẽ thừa hưởng được tất cỏc phương thức và biến thành viờn của lớp cơ sở, thậm chớ cũn thừa hưởng cả cỏc thành viờn mà cơ sở đó thừa hưởng.

2.11.2. Đa hỡnh

Đa hỡnh là việc lớp B thừa kế cỏc đặc tớnh từ lớp A nhưng cú thờm một số cài đặt riờng. ListBox và Button đều là một Window, ta muốn cú một form để giữ tập hợp tất cả cỏc thể hiện của Window để khi một thể hiện nào được mở thỡ nú cú thể bắt Window của nú vẽ lờn. Ngắn gọn, form này muốn quản lý mọi cư

xử của tất cà cỏc đối tượng đa hỡnh của Window.Tạo phương thức đa hỡnh, ta cần đặt từ khoỏ virtual trong phương thức của lớp cơ sở. Vớ dụ như:

public virtual void DrawWindow( )

Trong lớp kế thừa để nạp chồng lại mó nguồn của lớp cơ sở ta dựng từ khoỏ override khi khai bỏo phương thức và nội dung bờn trong viết bỡnh thường. Vớ dụ về nạp chồng phương thức DrawWindow: (adsbygoogle = window.adsbygoogle || []).push({});

public override void DrawWindow( ) {

base.DrawWindow( ); // gọi phương thức của lớp co sở Console.WriteLine ("Writing string to the listbox: {0}", listBoxContents);

}

Dựng hỡnh thức đa hỡnh phương thức này thỡ tuỳ kiểu khai bỏo của đối tượng nào thỡ nú dựng phương thức của lớp đú.

Khi cần viết lại một phương thức trong lớp kế thừa mà đó cú trong lớp cơ sở nhưng ta khụng muốn nạp chồng lại phương thức virtual trong lớp cơ sở ta dựng từ khoỏ new đỏnh dấu trước khi từ khoỏ virtual trong lớp kế thừa.

public class ListBox : Window {

public new virtual void Sort( ) {...} }

2.12. Cấu trỳc

Một cấu trỳc (struct) là một kiểu do người dựng định nghĩa, nú tương tự như lớp như nhẹ hơn lớp.

Định nghĩa cấu trỳc Cỳ phỏp

[thuộc tớnh] [kiểu truy cập] struct <định danh> [: <danh sỏch cỏc giao diện >] {

// Cỏc thành viờn của cấu trỳc }

Khụng giống như lớp, cấu trỳc khụng hỗ trợ kế thừa. Tất cả cỏc cấu trỳc thừa kế ngầm định object nhưng nú khụng thể thừa kế từ bất kỳ lớp hay cấu trỳc nào khỏc. Cỏc cấu trỳc cũng ngầm định là đó niờm phong. Tuy nhiờn, nú cú điểm giống với lớp là cho phộp cài đặt đa giao diện.

Cấu trỳc khụng cú hủy tử cũng như khụng thể đặt cỏc tham số tuỳ ý cho Constructor. Nếu ta khụng cài đặt bất kỳ hàm dựng nào thỡ cấu trỳc được cung cấp hàm dựng mặc định, đặt giỏ trị 0 cho tất cả cỏc biến thành viờn.

Do cấu trỳc được thiết kế cho nhẹ nhàng nờn cỏc biến thành viờn đều là kiểu private và được gúi gọn lại hết. Tuỳ từng tỡnh huống và mục đớch sử dụng mà ta cần cõn nhắc chọn lựa dựng lớp hay cấu trỳc.

2.13. Windows Form

Hầu hết mọi ứng dụng Windows Form mở rộng chức năng của

System.Windows.Forms. Chức năng cơ bản của lớp Form khụng thể tạo một cửa sổ cú thể sống và tương tỏc trong mụi trường Windows một cỏch đỳng đắn. Đõy là một thuận lợi như một điểm khởi đầu và bằng việc mở rộng lớp Form và thờm cỏc control tuỳ biến và cỏc bộ điều khiển sự kiện tuỳ biến, một ứng dụng rất hữu ớch được tạo để cú thể tương tỏc với người dựng và dữ liệu hiện tại thụng qua một giao diện người dựng tinh vi.

Cỏc lớp thừa kế từ System.Windows.Forms:

System.Windows.Forms.Control - hành động này như lớp cơ bản cho phần lớn cỏc lớp trong namespace. Nú chứa chức năng cơ bản của thao tỏc xử lý bàn phớm và nhập từ chuột và xử lý tin nhắn window.

System.Windows.Forms.ButtonBase - Lớp này hỗ trợ chức năng cơ bản của một nỳt mà mọi lớp thừa hưởng sử dụng trong cỏc cỏch khỏc nhau.

System.Windows.Forms.TextBoxBase - một lần nữa, lớp này là một lớp cơ sở được sử dụng để cung cấp chức năng và thuộc tớnh thụng thuờng cho cỏc lớp thừa hưởng. Cả hai lớp TextBox và RichTextBox sử dụng chức năng cung cấp bởi TextBoxBase.

System.Windows.Forms.ScrollableControl - đõy là một lớp cơ bản khỏc cung cấp hỗ trợ cho cỏc lớp thừa hưởng. Lớp này quản lý sự phỏt sinh và hiển thị của cỏc thanh cuộn đến người dựng để truy cập đến gốc của một hiển thị.

System.Windows.Forms.ContainerControl - Lớp này quản lý chức năng yờu cầu cho một control để hành động như một sự chứa đựng những control khỏc.

System.Windows.Forms.Panel - đõy là control khỏc cú thể chứa cỏc control thờm vào, nhưng khỏc với lớp ContainerControl, nú phõn loại cỏc control một cỏch đơn giản.

System.Windows.Forms.Form - Đõy là lớp mà phõn phỏt với việc tạo ra và hiển thị cỏc cửa sổ. Lớp này cú thể đuợc dựng để tạo bất kỳ loại cửa sổ nào: standard, toolbox, borderless, even modal dialog boxes và multi-document interfaces.

System.Windows.Forms.UserControl - Đõy là lớp cú thể được dựng để thừa hưởng từ việc tạo một custom control đến việc được dựng trong một nơi phức tạp trong một ứng dụng hay tổ chức.

2.14. Truy cập dữ liệu

Trong phần này chỳng ta sẽ khảo sỏt sang trỡnh cung cấp dữ liệu OLE DB .NET Data Provider, với trỡnh cung cấp dữ liệu này ta cú thể kết nối đến bất kỳ hệ quản trị cơ sở dữ liệu nào cú hỗ trợ trỡnh cung cấp dữ liệu OLE DB Providers, cụ thể là Microsoft Access với tập CSDLnorthwind.mdb.

Đầu tiờn là chuỗi kết nối : (adsbygoogle = window.adsbygoogle || []).push({});

string connectionString = "provider=Microsoft.JET.OLEDB.4.0; " + "data source = c:\\northwind.mdb";

Chuỗi trờn sẽ kết nối đến cơ sở dữ liệu northwind trờn ổ đĩa C. Kế tiếp ta là đối tượng OleDbDataAdapter

OleDbDataAdapter DataAdapter = new OleDbDataAdapter(

commandString, connectionString);

Chỳng ta phải đảm bảo là namespace OleDb được thờm vào ứng dụng : using System.Data.OleDb;

Sau đõy sẽ trớch ra một đoạn mó chớnh phục vụ cho việc kết nối theo cỏch này : public ADOForm1( )

{

InitializeComponent( );

// chuỗi kết nối đến cơ sở dữ liệu

string connectionString = "provider=Microsoft.JET.OLEDB.4.0;" + "data source = c:\\nwind.mdb";

// chuỗi truy vấn dữ liệu string commandString =

"Select CompanyName, ContactName from Customers"; // tạo đối tượng OleDbDataAdapter và DataSet mới

OleDbDataAdapter DataAdapter = new OleDbDataAdapter( commandString, connectionString);

DataSet dataSet = new DataSet( ); // đẩy dữ liệu vào dataSet

DataAdapter.Fill(DataSet,"Customers"); // lõy về bảng dữ liệu Customers

DataTable dataTable = DataSet.Tables[0]; // duyệt qua từng dũng dữ liệu

foreach (DataRow dataRow in dataTable.Rows) {

lbCustomers.Items.Add(dataRow["CompanyName"] + " (" + dataRow["ContactName"] + ")" );

} }

CHƢƠNG 3: CHƢƠNG TRèNH ỨNG DỤNG 3.1. Chức năng của chƣơng trỡnh

Chương trỡnh được viết trờn nền tảng ngụn ngữ C#, nhằm tạo ra một chương trỡnh ứng dụng cho cỏc đối tượng :

Những đối tượng sử dụng hệ thống gốm cú:

 Giỏo viờn: Người làm cụng tỏc giảng dạy

 Sinh viờn: Người học thụng qua hệ thống mạng LAN

3.1.1. Chức năng dành cho giỏo viờn:

3.1.1.1. Quản lý lớp học của mỡnh:

Mặc định là cỏc lớp được tạo ra là khụng cú mật khẩu, mọi sinh viờn đều cú thể tham gia vào lớp học được.

Giỏo viờn cú thể thay đổi địa chỉ IP của lớp mỡnh

Giỏo viờn là người chủ của một lớp học cũng cú thể xoỏ đi lớp học đú

3.1.1.2. cho xem – khụng cho xem bài giảng của giỏo viờn (adsbygoogle = window.adsbygoogle || []).push({});

Khi giỏo viờn bật chức năng cho phộp xem thỡ mới cú thể thấy được hỡnh ảnh của bài giảng trờn giao diện.

3.1.2. Chức năng dành cho sinh viờn:

3.1.2.1. Đăng nhập vào học

Sinh viờn được cấp địa chỉ IP, sau khi đăng nhập vào hệ thống sinh viờn đú mới cú quyền tham gia vào lớp học được mở, bài giảng sẽ được phỏt trờn màn hỡnh giao diện của sinh viờn.

3.2. Thiết kế giao diện.

3.2.1. Giao diện của giỏo viờn

3.2.1.1. Giao diện nhập địa chỉ và tờn bài giảng của giỏo viờn

Hỡnh 3.2.1 Địa chỉ và tờn bài giảng của giỏo viờn

STT Tờn Mụ tả

1 Title Hiển thị tiờu đề của giao diện 2 Hoat động Chỉ trạng thỏi của giao diện

3 Nhúm Là một TextBbox để nhập địa chỉ IP của lớp học 4 Bài giảng Là một TexBox nhập bài giảng cho giỏo viờn đứng lớp

3.2.1.2. Giao diện hiển thị nội dung và thời gian bài giảng của giỏo viờn

3.2.1.3. Giao diện bắt đầu và kết thỳc bài giảng

Hỡnh 3.2.3 giao diện bắt đầu và kết thỳc bài giảng

STT Tờn Mụ tả

1 Tham gia Kớch vào nỳt Button để chuẩn bị bài giảng

2 Dũ chuyển

động Chỉ trạng thỏi hoạt động của bài giảng

3 ListBox Là một ListBbox hiển thị nội dung và thời gian bài giảng

STT Tờn Mụ tả

1 Bắt Đầu Bắt đầu bài giảng 2 Kết Thỳc Kết thỳc bài giảng

3.2.2. Giao diện sinh viờn

3.2.2.1. giao diện sinh viờn tham gia bài giảng

Hỡnh 3.2.4 – Giao diện sinh viờn tham gia bài giảng

STT Tờn Mụ tả

1 Nhúm TexBox nhập địa chỉ IP tham gia vào lớp học 2 Tham gia Kớch vào Nỳt Button tham gia vào lớp học

3 Nhật ký

tham gia ListBox hiển thị tờn và thời gian bài giảng

4 Màn hỡnh

3.3.Thiết kế modul chƣơng trỡnh 3.3.1 Modul chƣơng trỡnh giỏo viờn (adsbygoogle = window.adsbygoogle || []).push({});

private void btnThamGiaRoiKhoi_Click(object sender, System.EventArgs e) {

ep = new IPEndPoint(IPAddress.Parse(text_IP_Multicast.Text), 5000); if(btnThamGiaRoiKhoi.Text == "Tham Gia")

{

HookRtpEvents(); // 1

JoinRtpSession(textLecture.Text + " Bắt đầu lỳc " + DateTime.Now.ToShortTimeString ()); // 2

// Change the UI

btnThamGiaRoiKhoi.Text = "Rời khỏi"; //txtSend.Enabled = true; text_IP_Multicast.Enabled = false; button1.Enabled = true; textLecture.Enabled = false; } else { Cleanup(); // 6 // Change the UI

btnThamGiaRoiKhoi.Text = "Tham gia"; //txtReceive.Clear(); text_IP_Multicast.Enabled = true; text_IP_Multicast.Enabled = true; button1.Enabled = false; textLecture.Enabled = true; button3.Enabled = false; sendingSt.ForeColor = Color.Red; sendingSt.Text = "Dừng"; notifyIcon1.Text = "RTP Presenter – Dừng"; } }

3.3.1.2 Modul ngừng truyền bài giảng

private void RoiPhien() {

if(rtpSession != null) {

// Clean up all outstanding objects owned by the RtpSession rtpSession.Dispose();

rtpSession = null; rtpSender = null; }

}

3.3.1.3 Modul hiển thị thụng tin bài giảng qua ListBox private void ShowMessage(string msg)

{

listBox1.Items.Add(msg); }

Nhận dữ liệu từ mạng

private void RtpParticipantAdded(object sender, RtpEvents.RtpParticipantEventArgs ea)

{

ShowMessage(string.Format("{0} đó tham gia", ea.RtpParticipant.Name));

}

Dữ liệu bị remove

private void RtpParticipantRemoved(object sender, RtpEvents.RtpParticipantEventArgs ea)

{

ShowMessage(string.Format("{0} đó rời khỏi", ea.RtpParticipant.Name));

}

3.3.1.4. Modul hiển thị nội dung bài giảng trờn màn hỡnh sinh viờn void send_img() { try { if (MotionFlag.Checked) { (adsbygoogle = window.adsbygoogle || []).push({});

Image oldimage = scr.Get_Resized_Image(100, 100,scr.GetDesktopBitmapBytes());

while (true) {

Image newimage = scr.Get_Resized_Image(100, 100, scr.GetDesktopBitmapBytes());

float difference = scr.difference(newimage, oldimage); differencelab.Text = difference.ToString() + "%"; if (difference >= 1)

{

sendingSt.ForeColor = Color.Green; sendingSt.Text = "Đang gửi ...";

notifyIcon1.Text = "RTP Presenter – Đang gửi..."; rtpSender.Send(scr.GetDesktopBitmapBytes()); oldimage = scr.Get_Resized_Image(100, 100, scr.GetDesktopBitmapBytes());

}

else { sendingSt.ForeColor = Color.Red; sendingSt.Text = "Tạm dừng"; notifyIcon1.Text = "RTP Presenter – Tạm dừng"; } } } else { sendingSt.ForeColor = Color.Green; sendingSt.Text = "Đang gửi ...";

notifyIcon1.Text = "RTP Presenter – Đang gửi..."; while (true) { rtpSender.Send(scr.GetDesktopBitmapBytes()); } } } catch (Exception ) {} }

3.3.2. Modul giao diện chƣơng trỡnh sinh viờn

private void btnThamGiaRoiKhoi_Click(object sender, System.EventArgs e) {

ep = new IPEndPoint(IPAddress.Parse(text_IP_Multicast.Text), 5000); if(btnThamGiaRoiKhoi.Text == "Tham gia")

{

HookRtpEvents(); // 1

JoinRtpSession(Dns.GetHostName()); // 2 // Change the UI

btnThamGiaRoiKhoi.Text = "Rời khỏi"; //txtSend.Enabled = true;

//txtSend.Focus();

text_IP_Multicast.Enabled = false; }

else {

Cleanup(); // 6 // Change the UI

btnThamGiaRoiKhoi.Text = "Tham gia"; //txtReceive.Clear();

text_IP_Multicast.Enabled = true; }

}

3.4. Giao diện chƣơng trỡnh thực nghiệm

3.4.1. giao diện giỏo viờn:

H3.4.1.2. Giao diện bắt đầu khi nhập giảng

H3.4.1.4. Giao diện kết thỳc bài giảng

3.4.2. Giao diện bài học của sinh viờn

3.4.2.1 Giao diện bài học sinh viờn (adsbygoogle = window.adsbygoogle || []).push({});

3.2.2. Giao diện sinh viờn khi tham gia bài giảng

KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN 1. Kết luận

Dựa trờn tỡm hiểu và nghiờn cứu cụng nghệ truyền thụng đa phương tiện ,em bước đầu xõy dựng hệ thống hỗ trợ cho việc đào tạo từ xa thụng qua mạng LAN.

Hệ thống cung cấp cho giỏo viờn những cụng cụ giỳp việc thu hỡnh, phỏt hỡnh, và õm thanh. Hệ thống đó giỳp cho giỏo viờn thực sự tham gia vào một lớp học ảo, giỳp cho sinh viờn cú điều kiện giao tiếp trực tiếp với giỏo viờn đứng lớp.

Hệ thống cũng giỳp cho giỏo viờn tạo ra một lớp học riờng của chớnh mỡnh hoặc tạo ra một diễn đàn thảo luận. Đồng thời cũng giỳp cho sinh viờn cú thể đăng ký làm thành viờn của lớp học.Hệ thống được tổ chức thành hai phần :

- Phần Server : Giữ trỏch nghiệm tạo, quản lý cỏc lớp học trong hệ thống. Làm nhiệm vụ giữ kết nối với cỏc thành viờn khỏc trờn hệ thống.Hỗ trợ người dựng cú thể truyền nhận được tớn hiệu õm thanh và hỡnh ảnh.

- Phần Client : Giữ trỏch nhiệm kết nối với server. Hỗ trợ người sử dụng liờn lạc với cỏc thành viờn khỏc trong hệ thống. Nhận và phỏt tớn hiệu õm thanh, hỡnh ảnh cho cỏc thành viờn khỏc cú tham gia hệ thống.

2. Hƣớng phỏt triển :

- Cải tiến chất lượng truyền thụng về hỡnh ảnh, õm thanh

- Cho phộp sinh viờn lưu lại bài giảng của giỏo viờn lờn mỏy tớnh. - Mở rộng ra mụ hỡnh toàn cầu là mạng WAN, Internet.

TÀI LIỆU THAM KHẢO

[1]. Phạm Hồng Tài, “Tự học C#” NXB Thống Kờ, 01/2003 [2]. Jesse Liberty & O‟Reilly, “Programming C#”.

Một phần của tài liệu TÌM HIỂU KỸ THUẬT MULTICAST XÂY DỰNG ỨNG DỤNG GIẢNG DẠY TRÊN MẠNG LAN (Trang 32 - 50)