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()
và 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ì?
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. –
không nhận ra đó là một phương pháp tĩnh. cảm ơn. –