当我使用 emit 更新 GUI 上的状态时,我的应用程序冻结了。
我想知道原因或如何避免这种冻结。感谢您的评论。
我的测试环境
- 视窗 7 x64
- railsinstaller-3.0.0.exe(MD5:26889DE0029C01A45AD2AED873708057)
- qtbindings (4.8.5.2 x86-mingw32)
- qtbindings-qt (4.8.5 x86-mingw32)
演示应用程序如下所示。
#!/usr/bin/env ruby
# encoding: UTF-8
#
require 'Qt'
class App < Qt::MainWindow
signals 'test()'
slots 'on_test()'
def initialize
super
@label = Qt::Label.new
self.centralWidget = @label
self.show
connect self, SIGNAL('test()'), SLOT('on_test()')
start_count
end
def start_count
Thread.new do
loop {
emit test()
}
end
end
def on_test()
@label.text = @label.text.to_i + 1
end
end
app = Qt::Application.new(ARGV)
App.new
app.exec
@hyde 谢谢你的回答。
qtbindings 的解决方案 2 似乎没有帮助。
connect self, SIGNAL('test()'), SLOT('on_test()')
=>
connect self, SIGNAL('test()'), SLOT('on_test()'), Qt::BlockingQueuedConnection
解决方案1经过测试,应用程序运行流畅。
解决方案1的代码:
#!/usr/bin/env ruby
# encoding: UTF-8
#
require 'Qt'
class App < Qt::MainWindow
slots 'on_test()'
def initialize
super
@label = Qt::Label.new
self.centralWidget = @label
self.show
@c = Qt::AtomicInt.new
start_count
start_timer
end
def start_count
Thread.new do
loop {
@c.fetchAndAddRelaxed(1)
}
end
end
def start_timer
t = Qt::Timer.new(self)
t.start(16)
connect t, SIGNAL('timeout()'), SLOT('on_test()')
end
def on_test()
@label.text = @c.fetchAndAddRelaxed(0) + 1
end
end
app = Qt::Application.new(ARGV)
App.new
app.exec