2010-11-03 68 views
10

Tôi muốn ứng dụng của mình chỉ mở một quy trình, tức là nếu một quá trình đã được mở và người dùng muốn mở lại exe - nó sẽ không mở một quy trình khác.Làm cách nào để buộc ứng dụng của tôi chỉ mở một exe? qt, linux

làm cách nào tôi có thể thực hiện trong Qt - linux?

10x!

+3

Bạn thực sự phải chấp nhận câu trả lời cho câu hỏi của mình trừ khi bạn không muốn mọi người trả lời nữa. – ereOn

Trả lời

0

Ứng dụng của bạn có thể kiểm tra xem một tệp nhất định trong thư mục chính của người dùng có hiển thị hay không. Nếu có, ứng dụng sẽ thoát. Nếu không có, ứng dụng sẽ tạo và tiếp tục. Tất nhiên, bạn có thể nhận được một điều kiện chủng tộc nếu người dùng khởi động ứng dụng nhiều lần cùng một lúc. Nhưng đối với hầu hết các trường hợp, giải pháp đơn giản này là đủ.

+0

Tôi không biết ai đã bỏ phiếu này và tại sao. Nhưng điều này là nguy hiểm và không di động. 'Qt' có hỗ trợ gốc cho tính năng này, do đó, nó là khôn ngoan để sử dụng nó. – ereOn

+0

Tôi đồng ý về 'không di động' và QtSingleApplication là tùy chọn tốt hơn. Nhưng tại sao lại nguy hiểm? Bởi vì điều kiện chủng tộc? Một cờ O_CREATE mở trong mở() nên xử lý với điều đó .. – bew

+0

Nguy hiểm vì bất kỳ ai tạo tệp này bằng tay đều có thể ngăn chương trình của bạn chạy. – ereOn

23

Điều bạn đang tìm kiếm là QtSingleApplication.

Nếu bạn bắt đầu một phiên bản ứng dụng khác, ứng dụng đầu tiên thậm chí sẽ được thông báo về nó (bạn có thể chuyển bất kỳ cấu trúc dữ liệu nào bạn muốn).

Tôi đã sử dụng nó để đưa ứng dụng hiện có lên mặt trước bất cứ khi nào một phiên bản khác được bắt đầu.

+0

Bị bỏ qua vì QtSingleApplication chỉ hoạt động trong quy trình của người dùng hiện tại.Nó sẽ không hoạt động nếu người dùng khác bắt đầu quá trình tương tự trong các phiên người dùng khác. –

+5

@JimInTexas: Không vi phạm, nhưng OP chỉ muốn một cách để ngăn chặn cùng một người dùng bắt đầu một số quy trình của ứng dụng của riêng mình. Với mục đích đó, 'QtSingleApplication' là ** chính xác ** những gì anh ta cần. Bây giờ có lẽ nó sẽ không phù hợp với ** trường hợp sử dụng cụ thể của bạn **, nhưng điều đó không liên quan đến câu hỏi. Thông thường, các câu trả lời được giảm xuống bởi vì chúng sai, và theo như câu hỏi này là có liên quan, nó không phải là trường hợp. Là nó ? – ereOn

15

Sử dụng mã sau trong main.cpp để ngăn không cho chạy nhiều phiên bản ứng dụng của bạn. Tôi đã thử nghiệm mã này dưới Linux (trong QtCreator) và nó hoạt động (làm việc cho Windows quá). Tôi thấy giải pháp này đơn giản và dễ thực hiện. Ví dụ này dành cho ứng dụng bảng điều khiển. Mã vẫn giữ nguyên cho một ứng dụng GUI, kiểm tra các chú thích trong mã.

//main.cpp 
#include <QCoreApplication> //Console application 
//#include <QApplication>  //GUI application 
#include <QSharedMemory> 
#include <QDebug> 
//Your QMainWindow derivated class goes here : 
//#include "MainWindow.h" 

int main(int argc, char *argv[]) 
{ 

    QCoreApplication app(argc, argv); 

    app.processEvents(); 

    //---- Check for another instance code snippet ---- 

    //GUID : Generated once for your application 
    // you could get one GUID here: http://www.guidgenerator.com/online-guid-generator.aspx 
    QSharedMemory shared("62d60669-bb94-4a94-88bb-b964890a7e04"); 

    if(!shared.create(512, QSharedMemory::ReadWrite)) 
    { 
    // For a GUI application, replace this by : 
    // QMessageBox msgBox; 
    //msgBox.setText(QObject::tr("Can't start more than one instance of the application.")); 
    //msgBox.setIcon(QMessageBox::Critical); 
    //msgBox.exec(); 

    qWarning() << "Can't start more than one instance of the application."; 

    exit(0); 
    } 
    else { 
     qDebug() << "Application started successfully."; 
    } 
    //---- END OF Check for another instance code snippet ---- 

    // Only one instance is running, declare MainWindow 
    //MainWindow myMainWindow; 
    //myMainWindow.show(); 


    //We enter the Qt Event loop here, we don't leave until the MainWindow is closed 
    //or the console application is terminated. 
    return app.exec(); 
} 
+0

Làm cách nào để mở cửa sổ chính của ứng dụng nếu ứng dụng đã bắt đầu? – devdev

+1

Nếu bắt đầu ứng dụng của bạn và nó là trường hợp duy nhất, việc thực hiện sẽ đạt đến vòng lặp sự kiện Qt (app.exec) và cửa sổ chính của bạn sẽ được hiển thị như bình thường. Nếu nó không phải là cá thể duy nhất chạy, cá thể mới sẽ đến lối ra() trước khi hiển thị cửa sổ chính. Cửa sổ hiện tại của bạn sẽ vẫn mở. Tôi đã thêm một số nhận xét khác trong ví dụ của tôi ở trên. –

+3

Quá mỏng manh Tôi nghĩ - nếu ứng dụng gặp sự cố, nó sẽ rời khỏi phân đoạn sharedmem phía sau và bạn không thể khởi động lại quy trình. "Nhưng nếu luồng hoặc quá trình cuối cùng bị treo mà không chạy trình phá hủy QSharedMemory, thì phân đoạn bộ nhớ chia sẻ tồn tại sau sự cố." (Tài liệu QSharedMemory) –

3

Điều này có thể không làm bạn quan tâm, nhưng tôi nghĩ sẽ rất hữu ích khi hiển thị. Tôi đang sử dụng QtSingleApplication bản thân mình và trải nghiệm một số hành vi kỳ lạ vài ngày trước. QtSingleApplication dường như không hoạt động trong mọi trường hợp. Tôi đã thực hiện điều này expierence trong cửa sổ, nhưng tùy thuộc vào thời tiết này là một cửa sổ cụ thể lỗi hoặc dự định bởi các thiết kế của QtSingleApplication, nó cũng có thể áp dụng cho Linux.

Tùy thuộc vào cách bạn bắt đầu ứng dụng của bạn nhiều trường hợp có thể. Tôi đã thực hiện trải nghiệm này khi tôi thử nghiệm ứng dụng của mình bằng trình cài đặt của mình. Trình cài đặt tự động khởi động ứng dụng sau khi hoàn tất. Khi tôi sau đó bắt đầu ứng dụng của tôi bằng cách sử dụng liên kết máy tính để bàn, tôi đã có hai trường hợp chạy. Vì vậy, chức năng của QtSingleApplication dường như phụ thuộc vào cách thức (và theo đó người dùng?) Ứng dụng được bắt đầu. Tài liệu không rõ ràng về điều này. Nhưng tôi nghĩ người ta thường mong đợi điều này để làm việc trong mọi hoàn cảnh, nếu không được nêu khác đi.

Vì vậy, nếu bạn không cần chức năng bổ sung được thêm bởi QtSingleApplication, QSystemSemaphore hoặc QSharedMemory có vẻ là cách tốt nhất để đi.

Các vấn đề liên quan