2013-07-15 27 views
6

Thông thường nếu tôi đang sử dụng chức năng chuyên sâu quy trình, tôi có thể gọi QCoreApplication::processEvents() hoặc QEventLoop::processEvents() để đảm bảo rằng quá trình xử lý của tôi không chặn các tín hiệu và vị trí khác.Làm cách nào để xử lý sự kiện trên QThread?

Tuy nhiên, nếu tôi tạo QThread mới và chuyển công nhân đến chủ đề đó, thì tôi không có QCoreApplication hoặc QEventLoop để gọi processEvents().

Từ nghiên cứu của tôi, có vẻ như rằng tôi sẽ có thể cài đặt một QEventLoop trên mới QThread tôi tạo ra, và sau đó tôi có thể gọi processEvents() trên QEventLoop đó.

Tuy nhiên, tôi không thể tìm ra cách thực hiện việc này. Tôi có thể thấy hình như sau:

QThread *thread = new QThread(this); 
Worker *worker = new Worker(this); 
QEventLoop *loop = new QEventLoop(); 

connect(thread, SIGNAL(finished()), worker, SLOT(deleteLater())); 
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); 
connect(thread, SIGNAL(started()), worker, SLOT(startProcessing())); 
connect(worker, SIGNAL(done()), thread, SLOT(quit())); 
connect(worker, SIGNAL(done()), loop, SLOT(quit())); 

worker->moveToThread(thread);  

//loop->exec() // blocks processing of this thread 
loop->moveToThread(thread); 

//loop->exec() // loop is not a member of this thread anymore and even 
       // if it was, this would block the thread from starting 
thread->start(); 
//loop->exec(); // loop is not a member of this thread anymore and even 
       // if it was, this would block this thread from continuing 

Mọi nơi tôi cố gắng bắt đầu vòng lặp đều có một số vấn đề. Nhưng ngay cả khi một cái gì đó như thế này làm việc, làm thế nào tôi sẽ gọi processEvents() trên đó QEventLoop()?

Ngoài ra, QThread cũng có một chức năng setEventDispatcher()QAbstractEventDispatcher có chức năng processEvents(), nhưng tôi dường như không thể tìm thấy bất cứ điều gì mà lớp con QAbstractEventDispatcher.

Cách thích hợp để xử lý sự kiện trong một chức năng công nhân chuyên sâu trên QThread là gì?

Trả lời

13

Theo tài liệu, hãy gọi QCoreApplication::processEvents() xử lý sự kiện cho bất kỳ chủ đề nào được gọi.

+2

Ah! Cảm ơn bạn! Tôi nghĩ rằng để sử dụng 'QCoreApplication :: processEvents()' tôi sẽ phải tạo một 'QCoreApplication' mới. Nhưng có vẻ như 'QThread' của tôi vẫn là một phần của' QCoreApplication' tồn tại từ trước. –

+0

không nhận ra đó là một phương pháp tĩnh. cảm ơn. –

-6

Tuy nhiên, nếu tôi có thể tạo một mới QThread và di chuyển người lao động làm chủ đề đó, sau đó tôi không có một QCoreApplication hoặc một QEventLoop nào đó để gọi processEvents().

Chính xác - không gọi nó. Bạn không cần nó, bạn không muốn nó.

+3

Vậy ... làm cách nào để xử lý sự kiện trên 'QThread'? –