Tôi đã lãng phí hàng giờ để cố gắng tìm ra lỗi này và tôi vẫn không biết tại sao nó lại xảy ra... vì vậy tôi nhờ bạn giúp đỡ!
Tôi di chuyển một đối tượng vào một luồng để thực hiện một số công việc và khi hoàn thành sẽ phát ra tín hiệu cho QChínhCửa sổ
chiếm lấy. Đơn giản vậy thôi, slot trong cửa sổ của tôi không chạy. Tuy nhiên, nếu tôi kết nối chính xác tín hiệu đó với qApp
, thì nó hợp lệ:
connect(objInThread_, SIGNAL(mySignal()), this, SLOT(about())); // Không có gì xảy ra
connect(objInThread_, SIGNAL(mySignal()), qApp, SLOT(aboutQt())); // Vui quá!
Lưu ý rằng tôi thực sựSao chép và dánMã cho đối tượng luồng này đến từ một luồng khác dựa trên QChủ đề
đối tượng, vì tôi có nhiều đối tượng như vậy và mọi vị trí đều được gọi... ngoại trừcái này.
Tôi có thể làm gì để gỡ lỗi nó?
Dưới đây là tuyên bố về các vị trí quan trọng:
lớp mainwin : QMainWindow công khai
{
Q_ĐỐI TƯỢNG
public:
mainwin(QWidget *parent = 0, Qt::WindowFlags flags = 0);
void setupThread()
{
// Chủ đề
objThread_ = QThread mới(cái này);
objThread_->start();
// Đối tượng trong thread
objInThread_ = myObject mới();
objInThread_->moveToThread(objThread_);
// Kết nối
connect(objInThread_, SIGNAL(mySignal()), this, SLOT(about()));
}
// ...
khe công cộng:
void tảiSettings();
vô hiệu về();
// ...
}
Về
Slot này đơn giản như sau:
void mainwin::about()
{
qCảnh báo("GIỚI THIỆU");
}
Các chức năng của đối tượng luồng như sau:
void myObject::fire()
{
qWarning("đây là luồng");
phát ra mySignal();
}
Bạn có chắc chắn EventLoop của chuỗi thực thi chức năng vị trí đang chạy không? Để xử lý các chức năng của vị trí, EventLoop tương ứng phải được chạy thông qua hàm exec(...)(- ít nhất tôi nghĩ nó được gọi là exec).
Giải thích thêm: Mỗi Q_OBJECT thuộc về một chuỗi. Điều này có thể được thay đổi thông qua hàm moveToThread(). Vòng lặp sự kiện của luồng tương ứng phải đang chạy để xử lý chức năng vị trí.
EDIT: Tôi đoán là chuỗi của bạn (chuỗi bạn đã tạo) không thực hiện vòng lặp sự kiện.
Tôi là một lập trình viên xuất sắc, rất giỏi!