2015-01-06 14 views
5

Tôi muốn tạo thư viện được xây dựng trên đầu trang của QTcpServerQTcpSocket để sử dụng trong các chương trình không có vòng lặp sự kiện trong các chức năng main của họ (vì vòng lặp sự kiện Qt đang chặn và không cung cấp đủ độ phân giải thời gian cho yêu cầu hoạt động trong thời gian thực).Có thể tạo vòng lặp sự kiện cục bộ mà không cần gọi QApplication :: exec() không?

Tôi đã hy vọng có được điều này bằng cách tạo vòng lặp sự kiện địa phương trong lớp, nhưng chúng dường như không hoạt động trừ khi tôi đã gọi app->exec() trong chức năng chính trước tiên. Có cách nào để tạo vòng lặp sự kiện cục bộ và cho phép giao tiếp tín hiệu/khe trong chuỗi không có vòng lặp sự kiện cấp ứng dụng không?

Tôi đã xem Is there a way to use Qt without QApplication::exec()? nhưng câu trả lời không giúp được vì có vẻ như giải pháp thêm vòng lặp sự kiện cục bộ nhưng không xóa vòng lặp ứng dụng.

+0

đẻ trứng một chuỗi mới có 'QApplication :: exec()' và giữ cho nó tồn tại dưới dạng "chuỗi chính"? –

+0

Tôi sẽ thử. Nhược điểm duy nhất là ngay cả khi hoạt động nó có thể sẽ ngăn cản tôi sử dụng thư viện trong tương lai với các ứng dụng Qt thực tế vì bạn chắc chắn không thể có hai cuộc gọi đến 'QApplication :: exec' –

Trả lời

6

Bạn có thể tạo phiên bản của QCoreApplication trong một chuỗi mới trong thư viện. Bạn nên kiểm tra để tạo ra chỉ có một thể hiện của nó, Đó là bởi vì mỗi ứng dụng Qt nên chứa chỉ một QCoreApplication:

class Q_DECL_EXPORT SharedLibrary :public QObject  
{ 
Q_OBJECT 
public: 
    SharedLibrary(); 

private slots: 

    void onStarted(); 

private: 
    static int argc = 1; 
    static char * argv[] = {"SharedLibrary", NULL}; 
    static QCoreApplication * app = NULL; 
    static QThread * thread = NULL; 
}; 


SharedLibrary::SharedLibrary() 
{ 
    if (thread == NULL) 
    { 
     thread = new QThread(); 
     connect(thread, SIGNAL(started()), this, SLOT(onStarted()), Qt::DirectConnection); 
     thread->start(); 
    } 
} 
SharedLibrary::onStarted() 
{ 
    if (QCoreApplication::instance() == NULL) 
    { 
     app = new QCoreApplication(argc, argv); 
     app->exec(); 
    } 
} 

Bằng cách này bạn có thể sử dụng Qt của bạn chia sẻ thư viện thậm chí trong các ứng dụng phi Qt.

+1

và có thể đồng bộ hóa việc kiểm tra và bắt đầu vòng lặp –

+2

Điều này xứng đáng được +1 thêm cho việc kiểm tra trên 'QCoreApplication :: instance()' –

+0

@NicolasHolthaus Điểm tốt. Tôi đã làm điều đó cho bạn. – Tay2510

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