2010-01-27 40 views
11

Tôi có một phương pháp được gọi từ cả hai số QThreads và chuỗi chính. phương pháp này đôi khi có thể mất một thời gian dài để làm tính toán của nó trong một vòng lặp vì vậy tôi đặt QCoreApplication::processEvents() và điều này ngăn cản GUI từ đóng băng. Tại một số điểm tôi đã thay đổi QCoreApplication::processEvents() cho QApplication::processEvents() nhưng điều đó khiến GUI bị đóng băng (im khá chắc chắn thats những gì đã được fereezing nó vì kể từ khi tôi đặt QCoreApplication::processEvents() lại nó không đông lạnh một lần nữa) Tôi có quyền nghĩ rằng gọi QApplication::processEvents() từ cả hai chủ đề chính và QThreads có thể đóng băng GUI?Tôi có nên sử dụng QCoreApplication :: processEvents() hoặc QApplication :: processEvents()?

Trả lời

11

Không, processEvent() sẽ chỉ được gọi khi bạn có sự kiện đang chờ xử lý thực sự. Bạn có thể thấy điều này hữu ích: How to make Qt work when main thread is busy?

+0

Tôi sẽ thử QtConcurrent :: run. Tôi có thể thực hiện các hoạt động GUI trong đó hay tôi vẫn phát ra các tín hiệu như trường hợp của chuông báo QKet –

+1

@yan: Bạn nên phát ra tín hiệu vì nó sẽ nằm trong một luồng riêng biệt. Hoặc bạn có thể sử dụng công cụ QFuture để trợ giúp, điều này sẽ làm rất nhiều việc tạo và phát ra tín hiệu cho bạn. –

10

Bạn sẽ tốt hơn khi di chuyển quá trình chạy dài ra khỏi chuỗi chính, do đó bạn không cần phải gọi processEvents(). Trong quá trình chạy dài, bạn có thể phát ra bất kỳ tín hiệu nào bạn cần để gui có đủ thông tin để thực hiện cập nhật, v.v. processEvents, tuy nhiên, là thường là một cái nạng cho thiết kế kém.

+0

Tôi sẽ thử QtConcurrent :: run. Tôi có thể thực hiện các thao tác GUI trong đó hay tôi vẫn phát ra các tín hiệu như trường hợp của một hoạt động GuQ QThread –

+0

chỉ có thể được thực hiện trong chuỗi chính. QtConcurrent là một ý tưởng hay, đặc biệt nếu bạn có thể chia công việc của bạn để sử dụng nhiều lõi. –

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