Làm ứng dụng chỉ chạy được một thể hiện
Bài viết này sẽ hướng dẫn bạn cách làm thế nào để bảo đảm rằng tại một thời điểm chỉ có thể chạy một thể hiện của ứng dụng. Cách thực hiện sẽ bằng cách tạo một đối tượng System.Threading.Mutex và bảo ứng dụng thu lấy quyền sở hữu đối tượng này lúc khởi...
Bài viết này sẽ hướng dẫn bạn cách làm thế nào để bảo đảm rằng tại một thời điểm chỉ có thể chạy một thể hiện của ứng dụng. Cách thực hiện sẽ bằng cách tạo một đối tượng System.Threading.Mutex và bảo ứng dụng thu lấy quyền sở hữu đối tượng này lúc khởi động.
Mutex cung cấp một cơ chế để đồng bộ hóa quá trình thực thi của các tiểu trình vượt qua biên tiến trình và còn cung cấp một cơ chế tiện lợi để bảo rằng chỉ một thể hiện của ứng dụng đang chạy. Bằng cách cố thu lấy quyền sở hữu một đối tượng Mutex lúc khởi động và thoát nếu không thể thu được Mutex, bạn có thể bảo đảm rằng chỉ một thể hiện của ứng dụng đang chạy.
Ví dụ dưới đây sử dụng một Mutex có tên là MutexExample để bảo đảm chỉ một thể hiện của ví dụ có thể thực thi.
- using System;
- using System.Threading;
-
- public class MutexExample
- {
-
- public static void Main()
- {
-
-
- bool ownsMutex;
-
- using (Mutex mutex = new Mutex(true, "MutexExample", out ownsMutex))
- {
-
-
- if (ownsMutex)
- {
- Console.WriteLine("This application currently owns the" +
- " mutex named MutexExample. Additional instances" +
- " of this application will not run until you" +
- " release the mutex by pressing Enter.");
- Console.ReadLine();
-
- mutex.ReleaseMutex();
- }
- else
- {
- Console.WriteLine("Another instance of this" +
- " application already owns the mutex named" +
- " MutexExample. This instance of the" +
- " application will terminate.");
- }
- }
-
- Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine();
- }
- }
Khi bạn tạo ứng dụng Windows Form trong VS 2005 thì tìm file Program.cs và trong hàm main đó bạn xác định luôn đây là lần chạy thứ mấy của chương trình, trước khi application tạo instance của Form chính ! Ví dụ:
- static class Program
- {
-
-
-
- [STAThread]
- static void Main()
- {
- bool firstInstance;
- System.Threading.Mutex mutex = new System.Threading.Mutex(false, "Test", out firstInstance);
- if (!firstInstance)
- {
- MessageBox.Show("Application is running !");
- Application.Exit();
- }
- else
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(fals e);
- Application.Run(new Form1());
- }
- }
- }
Có cách đơn giản nhất để làm đó là bạn Serialize một đối tượng gọi là ProgramState ra 1 file để cùng thư mục thực thi, khi định nghĩa đối tượng đó bạn để một biến boolean chẳng hạn tên là IsRunning. Khi chạy lần đầu tiên sẽ ghi ra 1 file dạng Binnary formatter hay SoapFormatter hoặc nếu muốn mã hóa theo ý bạn thì kế thừa giao diện IFormatter...Trước lúc ghi ra bạn để biến IsRunning bằng true và trong sự kiện load của chương trình đó bạn cần phải DeSerialize object đó và đọc biến IsRunning bằng true thì thoát luôn không thì chạy !
Cũng có thể với cách làm này khi Serialize, bạn ghi ra giá trị ra file, đọc file đó là tùy bạn, nên chọn cách an toàn, thậm chí bạn tạo key và viết vào Registry một key IsRunning cũng kiểu như trên. Tuy nhiên có điểm bất lợi là khi mất điện, nó vẫn ghi dạng true thì lần sau bật lên thì nó vẫn là true thì sẽ không bật được lên ứng dụng. Có cách khắc phục là bạn để thêm một biến lưu thời gian lần bật chương trình và cũng kiểm tra trong sự kiện load đó, nếu thời gian quá bao nhiêu lâu thì tự động chuyển IsRunning về false.
Một cách làm khác là đọc trong Process đang có nhưng chương trình nào đang running, nếu có chương trình bạn thì không cho bật nữa.
[Nghean-Aptech st]
Các tin mới hơn:
Hướng dẫn tích hợp giao diện trang quản trị SB Admin 2 vào Laravel 5.8.
Hướng dẫn tích hợp Google ReCaptcha v2 vào Laravel bằng curl.
Học lập trình React JS trong vòng 5 phút.
Sử dụng trình soạn thảo CKeditor tích hợp CKFinder với Laravel.
Hướng dẫn cài đặt Apache, PHP, MySQL, PHPMyAdmin trên Windows 10 và cấu hình SendMail.
Các tin cũ hơn:
8 kỹ năng lập trình sẽ “hot” trong 5 năm tới.
VB6: Lập trình tiện ích như "Task Manager".
10 kỹ năng người lập trình cần có.
Sothink Tree Menu 2.6.
Toàn vẹn dữ liệu bằng mã băm có khóa.