PDA

View Full Version : Chỉ Active 1 chương trình duy nhất



nhattruong203
24-08-2007, 17:22
Chào mọi người,
Bạn nào có đoạn code chỉ cho phép active 1 chương trình duy nhất. Ví dụ: Nếu đang active chương trình (ABC.exe) thì nếu open tiếp chương trình ABC.exe thì nó ko active nữa. Cái này để ngăn người dùng mở 1 lúc nhiều chương trình ABC.exe
Cảm ơn mọi người.

tien bac
24-08-2007, 17:50
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 để 1 biến boolean là IsRunning, nếu khi chạy đầu tiên sẽ Ghi ra 1 file dạng Binnary formatter hay SoapFormatter tùy thôi hoặc nếu muốn mã hóa theo ý bạn thì kế thừa thằng IFormatter mà viết lại...Trước lúc ghi ra bạn để biến IsRunning bằng True ! và Tất nhiên trong sự kiện load của chương trình đó bạn phải DeSerialize object đó và đọc biến IsRunning bằng true thì thoát luôn không thì chạy !

Serialize hay 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 1 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ẽ ko bật đc lên, có cách khắc phục là bạn để thêm 1 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 ngay thì tự động chuyển IsRunning về False.

Còn cách chính xác theo mình hiểu là đọc trong Process đang có nhưng chương trình nào running, nếu có chương trình bạn thì không cho bật nữa, nhưng cái này mình chưa thử

duongdragonxxx
24-08-2007, 18:34
check trong list process đang chạy

nhattruong203
24-08-2007, 20:27
Cảm ơn bác Tien bac. Về cách làm này thì tui cũng có nghĩ đến nhưng thấy không được hay lắm vì phải care nhiều thứ khác. Và vì phần này tui Execute qua Web service nên khó làm theo cách đó. Đã có lần tui vô tình thấy đoạn code này ở đâu đó trên mạng. Tuy nhiên lúc đó chưa cần nên không để ý. Giờ cần lại không có ;-(. Tui cũng đã thử đến process nhưng không có phương thức nào chạy được cả.

To Dragon: Có giải pháp cụ thể không bác?

tien bac
24-08-2007, 23:37
Có cách sau ! nếu bạn chạy vs2005 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, nếu đang chạy thì sẽ hiện thông báo và thoát! Nếu để ở Form_Load thì khi hiện messageBox xong thì nó hiện lên Form rồi tắt thì trông không được Pro lắm nên bạn phải kiểm tra trước khi application tạo instance của Form chính ! Chương trình mình đặt tên là Test

static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[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());
}
}
}

Hope this help:)

nhattruong203
29-08-2007, 17:19
Cảm ơn bác nhiều. Tui sẽ thử xem. Tuy nhiên vì như đã nói là tui dùng web service để start chương trình nên tui làm cách như sau: Trước khi người dùng start chương trình thì tui kiểm tra process này đã được start chưa. Nếu có rồi thì tui không start nữa.

tien bac
29-08-2007, 20:46
ặc bạn nhầm kô đấy sao lại web services nhỉ ? Bạn có nhầm với windows services không ? Còn theo tôi nghĩ, cái bạn đang làm chả liên quan tẹo nào tới webservices cả