关于多线程中涉及UI操作,导致UI线程阻塞问题

     最近正在做个项目,为了提高Form加载速度,将一些耗时较长的操作挪至一个新线程中执行;但是发现当子线程中通过Control.Invoke()方式操作Form控件,同时UI主线程在 Thread.Join()等待子线程执行完毕,这种方式实际上会导致UI主线程及子线程都处于阻塞等待状态,程序假死无法继续执行。

    通过网上找资料发现,Invoke是一种UI层面同步操作方式;正式这种方式会导致2个线程死锁,具体原因如下:

    1)    假设A为UI主线程,B为子线程

    2)    A 开启B线程后,A/B各自同步执行;

    3)   当A到达Join()时,由于B尚未执行完成,A处于等待,线程处于阻塞状态;

    4)   B继续执行,当B执行到了Invoke操作时,它必须提交消息给UI主线程A,由它去执行实际操作;而此时由于A处于阻塞状态它无法 

          接收到消息或者接收到消息也无法去执行;而由于Invoke是一种同步执行机制,亦即在Invoke操作在未执行完成前,B不能继续往下

          走,也就是B也将进入阻塞状态;于是死锁就出现了,整个程序无法运行。

 

 

    要解决这个问题,关键就是把UI同步操作方式Invoke改为异步操作方式BeginInvoke就可以了;这样B在启动BeginInvoke后并不需要等待A执行完成就可以继续执行直至完毕。当B结束后,A的Join操作将被唤醒,在A执行完后再执行BeginInvoke操(此时的执行顺序很值得注意)

 

    大家可以参考如下转载文章:http://www.cnblogs.com/Rustle/articles/11301.aspx

http://www.cnblogs.com/c2303191/articles/826571.html

 

(一)Control的Invoke和BeginInvoke
我们要基于以下认识:
(1)Control的Invoke和BeginInvoke与Delega

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python的UI多线程是指在使用Python编写界面程序时,可以利用多线程机制来提高程序的响应速度和用户体验。 在Python,可以使用多种库来实现UI界面,如Tkinter、PyQt、wxPython等。这些库本身就支持多线程,在用户界面线程运行的任务不应该是耗时的任务,因为这样导致界面卡顿,用户无法正常操作。 要在Python的UI程序使用多线程,可以使用Python内置的`threading`模块来创建线程。首先需要导入`threading`模块,然后定义一个函数作为线程的执行体。在函数可以实现需要在后台执行的任务,如数据的加载、网络请求等。 接下来,可以使用`threading.Thread`类来创建一个线程对象,将前面定义的函数作为参数传入。然后调用线程对象的`start()`方法,即可启动线程。 在UI界面,可以通过按钮、菜单或其他控件触发线程的启动,这样用户点击按钮后,程序在后台启动一个线程来执行任务,并且不阻塞用户界面的其他操作。 当线程执行完毕后,可以通过回调函数或其他方式将结果传递给UI界面,进一步更新界面的内容。 需要注意的是,在多线程程序,需要合理地管理线程的生命周期,避免出现资源竞争、死锁等问题。可以使用互斥锁、条件变量等同步机制来确保线程的正确执行。 总结来说,Python的UI多线程是一种提高程序响应速度和用户体验的方法,通过在后台启动线程来执行耗时任务,避免阻塞用户界面。需要合理管理线程的生命周期,确保程序的正确执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值