非常棘手的多线程问题!(100)

Q

qhide

Unregistered / Unconfirmed
GUEST, unregistred user!
非常棘手的多线程问题: 我建一窗体,分别放置按纽1和按纽2。点击按纽1则创建一线程,用于当前时间实时显示;点击按纽2则直接查询数据库数据。问题所在:当点击按纽1后时间显示正常,但跟着点击按纽2查询时,时间就停住了,一直等到查询结束后时间才显示正常。如何解决,希望高手们帮我一把。 按道理说,显示时间是一个线程,查询是用主线程,为什么不行呢?我把显示时间线程的优先级设为最高还是不行,是不是要再建一个线程用于查询?除此之外还有其它办法吗?
 
当主线程忙时,子线程会被阻塞,所以,你得再建一个子线程来查询数据
 
把button2 的查询数据库这个动作,做成另外一个线程,因为这个动作占用资源时间要远远大于你的 button1 的动作的界面的显示时间,可以放一个 timer 来显示
 
非常感谢wind_2005和delphihou两位大侠的解答!**除了再创建一个线程来执行查询之外,是否还有其它办法?
 
你的按钮1,显示当前时间,是显示在主线程上,所以如果主线程由于查询被阻塞了,那你的子线程发来的显示时间的消息就被搁置了,等查询完成,才执行所有的消息。因此,你在子线程里建一个控件用于显示时间,就没有问题了。
 
万分感激 草原骏马 提供新思路!我是个新手,望 草原骏马 能给具体的代码参考,多谢!
 
不要动不动就要 代码。。。都告诉你怎么 做面包了。。难道还要别人把面包做好,再喂给你吃。。。既然是新手 就要多查资料。。。。感觉 delphi 里面好多。。都不是 专业搞开发的。。就是 拿别人的代码 改改。。维护别人的东西。。。。没有一点专业精神。。。。。。只怪delphi 上手太容易了。。
 
恩,原理才是王道
 
令狐小侠 说得极是,我自觉惭愧!多看书才是正道理。
 
道理很简单,因为在主线程中查询。所以对程序界面的刷新也被阻塞了,根本没机会刷新。所以只有等到主线程查询结束,界面才有机会刷新。
 
草原骏马 建议“在子线程里建一个控件用于显示时间,就没有问题了。”我试过,还是无法刷新,因为在子线程里建的控件必须依附于主表单,所以无法刷新,只有等到查询结束后方能刷新。请问apiao:是不是无法解决,除非不在主线程里查询?
 
显示时间的直接用用 Timer 组件让他显示就行了。你那个显示时间的线程用来执行查询过程.
 
总的来说,你把数据查询放在子线程里就行了
 
在单核的CPU中即使你使用了多线程,也不能够实现真正的多线程
 
总之,你的主线程不消息阻塞就行了。
 
顶部