2011-08-26 27 views
5

Tôi sẽ giữ mã đơn giản để các bạn có thể thấy những gì tôi đang cố gắng làm;) Tôi biết tất cả các vấn đề về khóa, v.v. để tìm ra cách các tín hiệu và khe phát cùng chủ đề.Sử dụng Qt nơi chuỗi công nhân tạo các phần tử GUI mới

Trong main.cpp:

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 
    MyConsole c;  // Subclasses QThread and implements run() 
    MyReceiver r(app); // We pass app to MyReceiver for later (see below) 
    QObject::connect(&c, SIGNAL(sendit()), 
        &r, SLOT(gotit())); 
    c.start();   // Start the worker thread 
    app.exec(); 
} 

Giả sử rằng các tín hiệu và khe cắm được thiết lập đúng trong các tập tin tiêu đề (tôi đã thử nghiệm và họ). Bây giờ, đây là vấn đề:

Trong MyReceiver.cpp:

void MyReceiver::gotit() 
{ 
    QLabel *label = new QLabel(0, "Hello"); // Some GUI element, any will do 
    app.setMainWidget(*label);    // Some GUI action, any will do 
} 

Câu hỏi đặt ra là: Vì đối tượng MyReceiver đã được tạo ra trong main(), mà là trên các chủ đề chính, điều đó có nghĩa rằng các khe (ví dụ, gotit()) sẽ chạy trên thread chính và do đó an toàn để làm công cụ GUI? Ngay cả trong trường hợp tín hiệu được nâng lên từ một QThread khác (như MyConsole trong ví dụ này)?

Có cách nào tốt hơn để cho phép chuỗi công nhân tương tác với GUI (ví dụ: Obj-C/Cocoa có phương thức "gửi thư trên chuỗi chính"). "Cách Qt" của việc này là gì?

Cảm ơn trước!

+0

http://stackoverflow.com/questions/638251/how-to-emit-cross-thread-signal-in-qt có trả lời cho bạn câu hỏi không? –

Trả lời

1

Các "cách Qt" phát ra một tín hiệu từ một thread và nhận được nó trong một thread khác là sử dụng một kết nối xếp hàng đợi

connect(obj, SIGNAL(foo()), other_obj, SLOT(bar()), Qt::QueuedConnection) 

Từ các tài liệu Qt cho Qt :: QueuedConnection:

Khe cắm được gọi khi điều khiển quay trở lại vòng lặp sự kiện của luồng của người nhận. Khe được thực hiện trong luồng của người nhận.

5

Theo mặc định (Qt :: AutoConnection), các vị trí sẽ chạy trong chuỗi QObject được tạo. Vì vậy, bất kể bạn phát ra tín hiệu gì, vị trí sẽ luôn chạy trong chuỗi, QObject " cuộc sống "trong (nếu một vòng lặp sự kiện Qt đang chạy trong chủ đề đó, nếu không sự kiện không thể được gửi). Vì thread chính sẽ trở thành luồng GUI Qt, điều này sẽ hoạt động như mong đợi. Đây thực sự là cách Qt tương tác với GUI. Xem thêm: http://doc.qt.nokia.com/4.7/thread-basics.html (tìm chủ đề chuỗi).

+0

"không có vấn đề từ những gì bạn phát ra tín hiệu, khe sẽ được chạy luôn trong cùng một chủ đề" câu này là một chút ambuigous, nó âm thanh như khe sẽ luôn luôn được chạy trong cùng một chủ đề tín hiệu được phát ra từ. Tôi biết rằng bạn không có nghĩa là nó theo cách này (như phần còn lại của câu trả lời của bạn là chính xác), nhưng nó có thể gây nhầm lẫn cho người khác. –

+1

ok, đó là mơ hồ, tôi đã rephrashed đó. cảm ơn cho bình luận. – awx

+0

Cần lưu ý rằng bạn vẫn có thể gửi tín hiệu ngay cả khi không chạy vòng lặp exec. Chỉ cần gọi 'QCoreApplication :: processEvents()' định kỳ và nó sẽ cho tất cả các mục đích dự định giống như bạn có vòng chạy exec. Điều này là rất tốt cho các tình huống mà bạn không thể kiểm soát vòng lặp trở lại hệ điều hành nhưng vẫn cần đầu vào/đầu ra của các tín hiệu từ các luồng khác nhau. – g19fanatic

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