2010-01-28 36 views
16

Tôi dường như không thể liên kết QtConcurrent::run() với phương thức (thành viên chức năng của một lớp) chỉ với một hàm đơn giản. Tôi có thể làm cái này như thế nào?là có thể sử dụng QtConcurrent :: run() với một thành viên chức năng của một lớp

Với chức năng thông thường, tôi không thể phát ra tín hiệu và kéo nó. Tại sao bất cứ ai sẽ tìm thấy một lựa chọn tốt hơn để QThread là ngoài tôi và muốn một số đầu vào.

+0

Lưu ý rằng trong khi bạn có thể phát ra một tín hiệu trong một chủ đề, sử dụng một trong hai phương pháp, nó có thể không tạo ra các widget. Chỉ chủ đề GUI chính mới có thể. Ngoài ra, thread GUI chính có thể sẽ cần xử lý tín hiệu. – CodeLurker

Trả lời

19

Có, điều này là có thể (và khá dễ dàng).

Dưới đây là một ví dụ (từ tài liệu Qt):

// call 'QStringList QString::split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const' in a separate thread 
QString string = ...; 
QFuture<QStringList> future = QtConcurrent::run(string, &QString::split, QString(", "), QString::KeepEmptyParts, Qt::CaseSensitive); 
... 
QStringList result = future.result(); 

Về cơ bản, tất cả các bạn phải làm là vượt qua một con trỏ đến đối tượng như là đối số đầu tiên và địa chỉ của phương pháp này như là đối số thứ hai (theo sau bởi bất kỳ đối số nào khác).

Xem: https://doc.qt.io/qt-5/qtconcurrentrun.html

+1

One điều mà chi phí cho tôi một số thời gian là QtConcurrent không giống như các chức năng quá tải: D – hakermania

+0

'vượt qua một con trỏ' - lưu ý, rằng' chuỗi' trong ví dụ của bạn không (nhưng nên, tôi đoán);) – mlvljr

5

Vấn đề là khi bạn sử dụng con trỏ đến hàm thành viên, bạn cần phải cung cấp tham số this cũng như (tức là đối tượng cần gọi hàm thành viên).

Cú pháp cho điều này là khá khó khăn nếu bạn chưa từng sử dụng nó trước đây. Nó có thể là tốt để đọc http://www.parashift.com/c++-faq-lite/pointers-to-members.html.

Giả sử bạn có một lớp học Dog và một hàm Dog::walkTheDog(int howlong_minutes). Sau đó, bạn nên để có thể sử dụng std::bind1ststd::mem_fun để làm cho nó phù hợp cho QtConcurrent::run:

Dog dog; 
// Walk this dog for 30 minutes 
QtConcurrent::run(std::bind1st(std::mem_fun(&Dog::walkTheDog), &dog), 30); 

std::bind1st(std::mem_fun(&Dog::walkTheDog), &dog) trả về một đối tượng chức năng giống như đã bị ràng buộc chức năng thành viên để một con chó đặc biệt. Từ thời điểm đó bạn có thể sử dụng nó giống như bạn có thể sử dụng một chức năng độc lập.

+0

bạn có thể xem câu hỏi này không, tôi đã gặp phải vấn đề như vậy, https: //stackoverflow.com/questions/47792153/invalid-use-of-non-static-member-function-qtconcurrent? Noredirect = 1 # comment82546866_47792153 –

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