Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: [VC] PrevInstance ???

  1. #1
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Mặc định [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 ???

  2. #2
    Ngày gia nhập
    09 2006
    Bài viết
    711

    hPrevInstance không có tác dụng trên Win32, luôn mang giá trị 0. Là tàn tích của Win16. Dùng FindWindows, sharemem hay mutex để viết single instance.

  3. #3
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    FindWindows không dùng được với các ứng dụng không có Windows . 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.

  4. #4
    Ngày gia nhập
    07 2006
    Bài viết
    166

    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:
    Code:
    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:
    Code:
    		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

  5. #5
    Ngày gia nhập
    09 2006
    Bài viết
    711

    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 gia nhập
    08 2006
    Bài viết
    18

    Mặc định [VC] PrevInstance ???

    Trích dẫn Nguyên bản được 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!

  7. #7
    Ngày gia nhập
    09 2006
    Bài viết
    711

    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.

  8. #8
    Ngày gia nhập
    08 2006
    Bài viết
    18

    Trích dẫn Nguyên bản được 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.

  9. #9
    No Avatar
    instcode Khách

    Trích dẫn Nguyên bản được 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à

    - 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)
    Đã được chỉnh sửa lần cuối bởi instcode : 19-11-2006 lúc 08:49 PM.

  10. #10
    Ngày gia nhập
    09 2006
    Bài viết
    711

    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ế.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn