wxpython 界面启动时需大量运算,界面假死,怎么办

时间:2022-11-21 07:13:24
将运算放在一个函数里
用thread.start_new_thread(self.Init,())
这样反而更糟,好像发生死锁一样 界面无休止假死下去

如果顺序执行self.Init(),只看到进度条(我将运算放在dll中,在dll中发送主窗口进度条消息),有些地方是白的

我的self.Init()是放在在主窗口的__init__() 中,self.Show(True)之后

感觉是主窗口尚未显示完 运算就开始了,结果导致界面瘫痪

18 个解决方案

#1


用线程是对的,你应该把精力放在解决资源保护上。

#2


怎么保护呢?

#3


肯定需要多线程,lz不妨把代码贴出来看看

#4


代码太多了
现在最低要求,希望能在窗口完全显示后才开始进行运算

#5


哦,有可能是我的dll种用了SendMessage()
这是同步的
改了之后再试试看

#6


别用wxpython,一个一个模块装

#7


感觉还是像死机一样,已经用多线程了啊

#8


那应该是计算量太大了

每计算一段时间让计算线程sleep一下,看看会不会好一些

#9


http://blog.donews.com/limodou/archive/2005/08/15/509966.aspx
看见这上面说的,子线程不能更新UI,应当交给主线程

但我dll中是PostMessage,应该是在主线程中更新的吧

#10


如果我在start_new_thread中不调用dll,而只是sleep(),不会假死
但如果调用dll,就会死掉

#11


而且我现在把dll中与主界面交互的注释掉了
就是一个普通的创建大文件的程序

#12


那在dll中sleep呢?

#13


我记得在demo中有个例子是callafter的,我做过,不是加载dll,也比较耗时3-4分钟(多线程).但没有lz那么夸张的要假死.
这个demo就是先生成图形再加载内容100X17个textctrl,同时我也在编辑textctrl的内容,比较卡而已。所以等加载完毕就流畅了.

#14


可能会误解,demo是先生成图形再加载内容.
我做的是加载100x17个的内容填充.

#15


我用ctype的dll就没事
但用Boost的dll就会假死,不知道怎么回事

#16


建议楼主看看代理模式,会对你有帮助的

#17


启动画面怎么实现啊?

#18


在wxPython中使用pyHook也遇到楼主一样的情况。。程序莫名其妙的假死!!

#1


用线程是对的,你应该把精力放在解决资源保护上。

#2


怎么保护呢?

#3


肯定需要多线程,lz不妨把代码贴出来看看

#4


代码太多了
现在最低要求,希望能在窗口完全显示后才开始进行运算

#5


哦,有可能是我的dll种用了SendMessage()
这是同步的
改了之后再试试看

#6


别用wxpython,一个一个模块装

#7


感觉还是像死机一样,已经用多线程了啊

#8


那应该是计算量太大了

每计算一段时间让计算线程sleep一下,看看会不会好一些

#9


http://blog.donews.com/limodou/archive/2005/08/15/509966.aspx
看见这上面说的,子线程不能更新UI,应当交给主线程

但我dll中是PostMessage,应该是在主线程中更新的吧

#10


如果我在start_new_thread中不调用dll,而只是sleep(),不会假死
但如果调用dll,就会死掉

#11


而且我现在把dll中与主界面交互的注释掉了
就是一个普通的创建大文件的程序

#12


那在dll中sleep呢?

#13


我记得在demo中有个例子是callafter的,我做过,不是加载dll,也比较耗时3-4分钟(多线程).但没有lz那么夸张的要假死.
这个demo就是先生成图形再加载内容100X17个textctrl,同时我也在编辑textctrl的内容,比较卡而已。所以等加载完毕就流畅了.

#14


可能会误解,demo是先生成图形再加载内容.
我做的是加载100x17个的内容填充.

#15


我用ctype的dll就没事
但用Boost的dll就会假死,不知道怎么回事

#16


建议楼主看看代理模式,会对你有帮助的

#17


启动画面怎么实现啊?

#18


在wxPython中使用pyHook也遇到楼主一样的情况。。程序莫名其妙的假死!!