2011-12-01 37 views
5

Mỗi lần tôi chạy dự án của mình trong Qt Creator, nó quay một phiên bản khác của ứng dụng của tôi. Tôi phải tự bỏ các ứng dụng hoặc người nào khác Dock của tôi được đầy đủ khá nhanh. Thật là một nỗi đau. Có cách nào để giái quyết vấn đề này không? Nó sẽ có ý nghĩa hơn rất nhiều nếu khi tôi chạy lại ứng dụng, tôi chỉ có thể chấm dứt phiên bản đã chạy. Điều này có thể được thực hiện?Qt Creator: Thoát phiên bản trước của ứng dụng trước khi chạy lại?

+0

Bản sao có thể có của [Bạn có thể định cấu hình Trình tạo Qt để giết ứng dụng đang chạy trước khi xây dựng hoặc chạy không?] (Http://stackoverflow.com/questions/14964093/can-you-configure-qt-creator-to -kill-the-running-application-before-building-hoặc) – bpierre

Trả lời

1

bạn có thể sử dụng shared memory để khắc phục sự cố của mình. Tôi đã sử dụng cách tiếp cận này để không bắt đầu một thể hiện khác của chương trình của tôi trong khi đã có một cá thể đang chạy. Trên thực tế tôi đã thực hiện điều này để đạt được cái gọi là ứng dụng ví dụ đơn lẻ.

Tuy nhiên trường hợp của bạn hơi khác một chút so với tôi, bạn cần bằng cách nào đó gửi tín hiệu từ ứng dụng thứ 2 đến ứng dụng đầu tiên để đóng nó. Tôi nghĩ bạn có thể đạt được hành vi này vẫn đang sử dụng QSharedMemory.

Những gì tôi đã làm để đạt được ứng dụng cá thể đơn là tạo bộ nhớ dùng chung với id duy nhất (UUID) làm khóa và mỗi lần chương trình của tôi bắt đầu đặt khóa trên đó, vì vậy nếu chương trình đã bị khóa hiểu rằng đã có một cá thể đang chạy và đóng tự động.

Bạn cần cải thiện việc triển khai này để điều chỉnh yêu cầu của mình. Về lý thuyết những gì bạn cần làm là đặt một con trỏ hàm (hoặc tín hiệu qt) vào bộ nhớ chia sẻ và khi một cá thể khác xuất hiện, hãy làm cho hàm thứ hai của bạn kích hoạt chức năng nào đó để thoát khỏi thể hiện đầu tiên. Đáng tiếc là tôi không biết làm thế nào để thực hiện điều này nhưng tôi hy vọng điều này sẽ cung cấp cho bạn một ý kiến ​​...

Dòng chảy nên được phần nào thích sau:

IN MAIN 
    check if shared memory in use 
     if yes 
     fire the exit function via shared memory to close 1st app 
     if no 
     put the function pointer which will close the app when another instance come up 

    do stuff 

Để cung cấp cho bạn một gợi ý nhỏ, mã của tôi ví dụ duy nhất là như sau

QSharedMemory shared(AppConstants::UUID); //Global variable 

int main(){ 
// Ensure single instanse of App 
if(!shared.create(512, QSharedMemory::ReadWrite)) 
{ 
    // QMessageBox msgBox; 
    QMessageBox::critical(0, QObject::tr("App is already running!"), QObject::tr("App is already running!"), QMessageBox::Ok, QMessageBox::Ok); 
    qCritical() << "Cevirgec is already running!"; 

    exit(0); 
} 
else { 
    qDebug() << "App staring..."; 
} 
} 

chúc may mắn và đừng quên chia sẻ giải pháp của bạn đây;)

EDIT:

Nếu đặt con trỏ hàm hoặc tín hiệu Qt và sau đó kích hoạt không thể (tôi hy vọng không) bạn có thể đặt biến cho bộ nhớ dùng chung để cho phép giữ số lượng phiên bản đang chạy và ứng dụng của bạn theo định kỳ (trong chuỗi) kiểm tra nó và nếu nó lớn hơn 1 đóng ứng dụng.

Xem ra các điều kiện chủng tộc tại đây! Bạn có thể tránh các điều kiện chủng tộc bằng cách đặt một cặp số ngẫu nhiên được tạo bởi mỗi cá thể và thời gian bắt đầu. vì vậy trước khi đóng, ứng dụng của bạn đảm bảo rằng đó là ứng dụng cũ hơn. Ví dụ: QPair<int, QDateTime>

+1

Chúa Giêsu Kitô. Tôi đã chỉ hy vọng tôi sẽ bỏ lỡ một thiết lập trong Qt Creator. Đây là điên rồ. Cảm ơn cho giải pháp của bạn mặc dù, nó thực sự dường như là cách tốt nhất để làm điều đó. Nhưng con người, điều này phản ánh kém trên Qt Creator. – jbrennan

+0

tốt, những gì bạn muốn là quá thấp để mong đợi QTCreator để xử lý nó: ( – destan

+1

Hmm, tôi figured Qt Creator sẽ xử lý nó. Xcode thực hiện điều này tự động. – jbrennan

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