Tuesday, August 26, 2008

ThreadPool

Tôi đang quan tâm đến vấn đề download dữ liệu từ NET, tuy nhiên làm tiểu trình như hiện tại download lần lượt bị cho là như thế không tốt vì sẽ rất lâu, hơn nữa không tận dụng được năng lực của NET cũng như xử lý của CPU. Giải pháp thay thế là sử dụng nhiều tiến trình download cùng một lúc. Keyword cho vấn đề này là THREADPOOL. Rất hấp dẫn đấy thế là lại có cái chuyên về công nghệ để vọc nữa rồi.

Lân la trên mạng thì được bác Google mách nhỏ là dùng ThreadPool thì có thể theo một số ví dụ đơn giản có sẵn từ đây. Thế là lại lần mò làm theo thôi. Cũng nhanh và ok lắm. Nhìn chuyên nghiệp và nhanh hơn hẳn phương pháp tuần tự trước.

Khai báo một phương thức chứa mã lệnh cần thực thi; phương thức này phải trả về void và chỉ nhận một đối số. Sau đó, tạo một thể hiện của ủy nhiệm System.Threading.WaitCallback tham chiếu đến phương thức này. Tiếp tục, gọi phương thức tĩnh QueueUserWorkItem của lớp System.Threading.ThreadPool, và truyền thể hiện ủy nhiệm đã tạo làm đối số. Bộ thực thi sẽ xếp thể hiện ủy nhiệm này vào hàng đợi và thực thi nó khi một tiểu trình trong thread-pool sẵn sàng.

Nếu ứng dụng sử dụng nhiều tiểu trình có thời gian sống ngắn hay duy trì một số lượng lớn các tiểu trình đồng thời thì hiệu năng có thể giảm sút bởi các chi phí cho việc tạo, vận hành và hủy các tiểu trình. Ngoài ra, trong một hệ thống hỗ-trợ-đa-tiểu-trình, các tiểu trình thường ở trạng thái rỗi suốt một khoảng thời gian dài để chờ điều kiện thực thi phù hợp. Việc sử dụng thread-pool sẽ cung cấp một giải pháp chung nhằm cải thiện tính quy mô và hiệu năng của các hệ thống hỗ-trợ-đa-tiểu-trình.

Có từng làm mới thấy rằng: ThreadPool đảm bảo được yêu cầu: chỉ cần cung cấp hàm thực hiện, hệ thống sẽ tự động gọi chạy. Chúng ta có thể cung cấp tham số quy định số tiểu trình chạy tối đa tại một thời điểm. Tuy nhiên, hạn chế của ThreadPool lại là các tiến trình khi đã cung cấp cho ThreadPool tức là đã ngoài tầm kiểm soát, không thể Abort / Pause hay Resume gì nữa, mà nó sẽ tự động Start theo tình trạng của hệ thống. Điểm này chính là hạn chế của ThreadPool, nên nếu muốn nó chạy hiệu quả thì chúng ta cần bổ sung một Thread thường trực, cung cấp thread cho ThreadPool, và trong các hàm xử lý, cần thêm một số điều kiện thoát khi mà môi trường thay đổi.

Mốt số đặc điểm của ThreadPool:
+ Tất cả các phương thức của ThreadPool đều là hàm tĩnh, truy cập thông qua lớp.
+ Các Thread đưa vào ThreadPool không bị giới hạn trong một lớp / đối tượng.
+ ThreadPool tự thân không có hàm Stop / Abort dành cho các Thread nó chứa.
+ Có thể quy định số tiểu trình chạy đồng thời thông qua hàm ThreadPool.SetMaxThreads.

Tham khảo:
[C#] Thực thi phương thức với thread-pool
C# Tutorial - Using The ThreadPool
ThreadPool Class

Monday, August 25, 2008

ExecuteExternalFile

[VC++ / MFC]

void ExecuteExternalFile(const char* csExecuteCommand)
{

STARTUPINFO sInfo;
ZeroMemory(&sInfo,sizeof(sInfo));
sInfo.cb = sizeof(sInfo);

PROCESS_INFORMATION pInfo;
ZeroMemory(&pInfo,sizeof(pInfo));
sInfo.cb = sizeof(sInfo);

//Create the process here.

CreateProcess(0, //LPCWSTR lpszImageName,
(char*)csExecuteCommand, //LPCWSTR lpszCmdLine,
0, //LPSECURITY_ATTRIBUTES lpsaProcess,
0, //LPSECURITY_ATTRIBUTES lpsaThread,
TRUE, //BOOL fInheritHandles,
NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW, //DWORD fdwCreate,
0, //LPVOID lpvEnvironment,
0, //LPWSTR lpszCurDir,
&sInfo,//LPSTARTUPINFOW lpsiStartInfo,
&pInfo//LPPROCESS_INFORMATION lppiProcInfo
);

// Wait until child processes exit.
WaitForSingleObject( pInfo.hProcess, INFINITE );

// Close process and thread handles.
CloseHandle( pInfo.hProcess );
CloseHandle( pInfo.hThread );
}

[C#.NET]

private static bool GetVieKeywords(string csExecuteFile, string csExecuteParam)
{

try
{

Process proc = new Process();

proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;

proc.StartInfo.FileName = csExecuteFile;
proc.StartInfo.Arguments = csExecuteParam;
proc.Start();
proc.WaitForExit();
proc = null;

}
catch (Exception)
{

//Extract fail.
return false;

}

return true;

}


Thủy cung thần tiên 08/2008


Sau 4 tuần setup hồ thủy sinh mới với cỏ Trân Châu, cỏ Nhật, Tiêu Thảo... thì bây giờ cũng đã có thành quả rồi. Rảnh rỗi viết về những gì nếm trải thú vui này cũng thú vị lắm.