Archive

Posts Tagged ‘C#’

Về Memory leak trong MFC/C++ trên Windows

<Bài này viết lâu rồi, trên Live Spaces, nay move qua đây>

Những ai lập trình C có kinh nghiệm chắc hẳn đều thừa nhận rằng việc C/C++ giao hẳn trách nhiệm quản lí bộ nhớ cho người lập trình thực sự là một ưu điểm mạnh mẽ, và cũng chính là khuyết điểm lớn của ngôn ngữ này. Với tư tưởng đó, lập trình viên C++ luôn phải làm một công việc khó chịu và mất nhiều thời gian là phát hiện và loại trừ memory leak trong chương trình. Entry này không trình bày cặn kẽ và chi tiết về memory leak, mà chỉ là ghi lại một số kinh nghiệm của người viết. Hi vọng bài viết sẽ có ích với những người (và chỉ những người) đã có kinh nghiệm làm việc với C++, đã có những hiểu biết cơ bản về memory leak như: tại sao lại có memory leak, tại sao phải tránh memory leak v.v…
Read more…

Undefined behavior in C and C++

19/08/2010 3 comments

http://blog.regehr.org/archives/213

Another great article diving into the mess of standard C/C++ and describing the basic concepts which are often ignored by programmers.

Nonetheless, I have just read part 1. Have no time for this right now. Place it here as a bookmark, read later…

MSP Tech Passion

23/02/2009 5 comments

Today I had a presentation about Functional Programming in .NET with C# and F# at Microsoft Vietnam office, according to the MSP Tech Passion conference series. Everything is OK, and I think the audience gets somewhat exciting with my presentation.

I have uploaded the slide and demo source code here. Fell free to comment and discuss about this.

Singleton “plus”, or yet another way to improve Singleton pattern

Có thể xem Singleton là một trong những mẫu thiết kế (Design Pattern) dễ cài đặt nhưng cũng rất hiệu quả trong thiết kế phần mềm. Ở đây không nhắc lại về mẫu này, chỉ xin trình bày một số “cải tiến” nhỏ đối với Singleton mà tác giả đã sử dụng cho phần mềm của mình trong thực tế.

1. Thread-safe Singleton objects

Mục đích: Mẫu Singleton chuẩn có thể sử dụng cho các lớp chỉ có duy nhất 1 instance trong chương trình. Tuy nhiên trong các ứng dụng có nhiều thread, mà các thread này đều phải truy xuất chung đến một đối tượng Singleton thì sẽ nảy sinh nguy cơ xung đột. Do đó cần có cơ chế đảm bảo việc truy xuất đối tượng Singleton sao cho không xảy ra hiện tượng này.

Cài đặt:

public class TSSingleton
{

private static object SyncRoot = new object();

private static TSSingleton m_Instance;

protected TSSingleton()
{

// Initialize code goes here…

}

public static TSSingleton Instance
{
get
{

lock(SyncRoot)
{
if(m_Instance == null)
m_Instance = new TSSingleton();
}
return m_Instance;
}
}

}

Cài đặt khá đơn giản. Một đối tượng SyncRoot được dùng để đảm bảo tại một thời điểm, chỉ có đúng 1 thread truy xuất đối tượng TSSingleton. Kĩ thuật này hiệu quả khi đối tượng Singleton là một phần tử trong giao diện, và có vài thread đang chạy nền có như cầu truy xuất đến nó.

2. “Multi”-ton

Ứng dụng thực tế: Các chương trình chat như Yahoo Messenger, Microsoft Live Messenger v.v… có thể quản lý nhiều cửa sổ chat cùng một lúc, nhưng mỗi cửa sổ là duy nhất cho một nick. Giả sử bạn đang chat với nick A, thì chỉ duy nhất 1 cửa sổ chat được tạo ra, ứng với nick chat này. Như vậy nảy sinh yêu cầu có một tập các đối tượng Singleton. Cài đặt cái này trong C# cũng không quá khó:

using System.Collections.Generic;

public class Multiton
{

private static Dictionary<string, Multiton> m_arrInstances = new Dictionary<string, Multiton>();

private readonly string m_sID;

protected Multiton(string sID)
{
m_sID = sID;
// Initialize code goes here…
}

public static GetInstance(string ID)
{
if(!m_arrInstances.ContainsKey(ID))
m_arrInstances[ID] = new Multiton(ID);

return m_arrInstances[ID];
}

}

Trong destructor của lớp, ta cần thêm vào câu lệnh:

m_arrInstances.Remove(m_sID);

để loại đối tượng này khỏi danh sách!