2016-03-28 15 views
0

Uygulamamda çalışan bir iş parçacığım var, bu da zaman zaman QML UI'de hızla görüntülenecek bilgileri alıyor. Böyle bir bilgi bölümüne sahip olduğumda, UI iş parçacığı üzerinde yaşayan nesnenin aldığı sinyali yayarım.Qt sinyalleri fark edilebilir gecikme ile UI iş parçacığına ulaşıyor

Bu işlemin çok duyarlı olmasını istiyorum, böylece değişiklikler mümkün olduğunca hızlı bir şekilde QML UI'de görüntülenir (bu, çalışan iş parçacığının harici denetleyiciyi işlemesi nedeniyle önemlidir ve denetleyici ile kullanıcı etkileşimi arasındaki en kısa "kritik yolu" istiyorum) UI değişikliği). Bununla birlikte, emit signal() arasındaki zaman farkının ve UI dizisinde çağrılan aralığın her zaman 20-40 milisaniye olduğunu keşfettim. Neden öyle?

Bunu hızlandırmak için ne yapabilirim? Sinyal gönderildikten sonra çalışan iş parçacığına QCoreApplication::processEvents() numaralı telefonu aramayı denedim, ancak bu durum hiçbir şeyi değiştirmiyor.

Bazı düşünceler:

  • Ben processEvents ama nedense UI iş parçacığı için arayabilir miyim?
  • Olayı, sinyal yerine yüksek öncelikli olarak kullanın. Yardımcı olacak mı?

OS: Win8.1, Qt 5.5

+0

QCoreApplication :: processEvents, UI iş parçacığı olay döngüsü içindir. Sinyal bağlantısı, yuva işleyici, UI çalışma döngüsü hakkında daha fazla kod gönderin. – hiitiger

+0

QML, ekranın yenileme hızında yenilenir göz önüne alındığında, yine de 60Hz yenileme hızında * 16.6ms gecikme * olacak. 20 ms gecikme normaldir ve 40 ms gecikme de yanlış değildir. Kullanıcınız yine de anlatamıyor, sorun ne? Ne yapmaya çalışıyorsun? BTW, 'processEvents', neredeyse hiç uygun yazılı bir kod gerekmemektedir. Kesinlikle * ihtiyacın yok. –

cevap

0

Eğer UI iş parçacığı için bir iş parçacığı bir sinyal yayarlar, bu UI olay kuyruğuna konur ve olay kuyruk pompalanır zaman teslim edilir ve o mesaja ulaşır. Çalışan iş parçacığınız, kullanıcı arabiriminizden daha yüksek bir önceliğe sahipse, kullanıcı iş parçacığı iş parçacığı iş parçacığı kadar bekleyin. Çalışan iş parçacığı aynı önceliğe sahipse, 20ms olabilir, bu zaman quanta tamamlar. Sinyalinizi Kuyruktan ziyade Doğrudan bağlayabilirsiniz, daha sonra iplik güvenliğini kendiniz halletmeniz gerekecektir.

+0

"UI iş parçacığı, çalışan iş parçacığı blokları kadar beklemek zorunda kalacak" - bu bilgi nereden geliyor? Konular paralel olarak yürütülür –

+0

Çalışan iş parçacığınız, kullanıcı arabiriminizden daha yüksek bir öncelikse, kullanıcı iş parçacığı iş parçacığı iş parçacığı kadar beklemek zorunda kalır. – dgsomerton

+0

@Alexey Andronov: "Paragraflar paralel olarak yürütülür. Tek çekirdekli bir sistemde değil, hatta çok çekirdekli sinyal/yuva iletimi de senkronizasyon gerektirir. –

İlgili konular