Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 12

Chủ đề: [VC] PrevInstance ???

  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    FindWindows không dùng được với các ứng dụng không có Windows [IMG]images/smilies/biggrin.png[/IMG]. Còn ShareMem thì em chưa dùng bao giờ. Nói chung là khoái Mutex.

    Lập trình trong Win có cái Event, Mutex... thoải mái thật. Hôm nọ em bập bẹ làm cho vi xử lý mấy tí -> ngán ngẩm cả người.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình cũng không biết là có tất cả những cách nào để phát hiện ra một instance đã có nhưng thấy cách dùng Mutex là ngắn gọn nhất:
    Mã:
    HANDLE CheckPreviousApp(const wchar_t* MutexName)
    {
    	HANDLE Mutex = CreateMutex(NULL, true, MutexName);
    	int nResult = GetLastError();
    	if (nResult == ERROR_ALREADY_EXISTS)
    		return 0;
    	else
    		return Mutex;
    }
    Sử dụng:
    Mã:
    		Mutex = CheckPreviousApp(L"test");
    		if (!Mutex)
    			return 0;
    Bác nào biết thêm về cái này tutorial cho anh em phát nhỉ. Thanks

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    [VC] PrevInstance ???

    Em muốn chương trình của mình chỉ đc. chạy 1 lần, em thấy trong hàm WinMain có tham số PrevInstance nhưng nó luôn mang giá trị 0, kể cả đã có 1 íntance trước đó
    Làm sao để biết đã có 1 íntance của chương trình ???

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Giả sử chúng ta có vấn đề sau: app của ct đã run và minimize xuống Tray Icon, giờ user run app của ta lần 2. Yêu cầu là windows của app chúng ta phải restore và show lên, và chỉ 1 instance. Làm theo cách mutex, event with name không giải quyết được vấn đề này.

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi TQN
    FindWindows cũng không dùng được, vì có trường hợp user run 2 instance liên tiếp nhau (vd: double click 2 lần thiệt nhanh), khi đó main window handle chưa có do đang trong quá trình khởi tạo.
    FindWindows chỉ dùng trong trường hợp cửa sổ của chương trình đích (chương trình thứ nhất) đã tồn tại (có thể ở trạng thái hidding như trường hợp ẩn trên taskbar). Còn bạn đặt ra bài toán user run quá nhanh, thiết nghĩ kết hợp dùng mutex là giải quyết tốt vấn đề. Nếu muốn "pro" hơn, bạn có thể dùng share-memory tạo một kênh IPC giữa các process.

  7. #7
    Trích dẫn Gửi bởi TQN
    Giả sử chúng ta có vấn đề sau: app của ct đã run và minimize xuống Tray Icon, giờ user run app của ta lần 2. Yêu cầu là windows của app chúng ta phải restore và show lên, và chỉ 1 instance. Làm theo cách mutex, event with name không giải quyết được vấn đề này.
    Cái này phải vận võ FindWindows rồi!

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    FindWindows cũng không dùng được, vì có trường hợp user run 2 instance liên tiếp nhau (vd: double click 2 lần thiệt nhanh), khi đó main window handle chưa có do đang trong quá trình khởi tạo.

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi TQN
    Giả sử chúng ta có vấn đề sau: app của ct đã run và minimize xuống Tray Icon, giờ user run app của ta lần 2. Yêu cầu là windows của app chúng ta phải restore và show lên, và chỉ 1 instance. Làm theo cách mutex, event with name không giải quyết được vấn đề này.
    Hơ, sao lại kô được nhỉ? Ngay cả Event cũng làm được mà [IMG]images/smilies/smile.png[/IMG]

    - Process của ta khi start lên thì phải signal một event, ví dụ "I'm started".
    - Process của ta khi đã Minimize trên System Tray thì phải:
    + Signal event, ví dụ "I'm minimized"
    + Wait trên một event khác, ví dụ "NotifyMe".
    - Khi user start một process mới, kiểm tra xem có event "I'm started" chưa? Nếu có rồi thì xem có "I'm minimized" kô? Có nữa thì signal event "NotifyMe" và kết thúc. Khi đó, thread mà wait cái event "NotifyMe" sẽ tự động restore lại cái cửa sổ.

    Ngoài ra, các kỹ thuật để chạy 1-instance có thể dùng: socket, lock file...
    Thực chất mọi kỹ thuật này là Inter-Process Communication (IPC)

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Tui nói là app đã minimize xuống tray icon, chứ không phải là taskbar. App đầu chả lẽ cứ đứng đó mà wait hay check liên tục cho event NotifyMe à, sao "xài sang" thế.

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •