多线程更新UI

sj490790083 2017-07-14 05:19:25
需求是这样的,每次触发消息接收事件会弹出一个气泡窗体,在窗体加载的时候用循环去改变透明度,达到淡入淡出的效果。
但是有一个问题,当有一个气泡窗体透明度正在改变过程中,如果新弹出一个就会阻塞之前的,
改变透明度部分代码如下:

for(double d=0.01;d<1;d+=0.01)
{
Thread.Sleep(1);
this.Opacity=d;
Application.DoEvents();
}

我的理解是,这些窗体都属于UI主线程,所以会相互阻塞。有没有什么办法解决?
...全文
823 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jingqunhu 2017-07-28
  • 打赏
  • 举报
回复
引用 14 楼 powerat123 的回复:
不要每次都new一个新的,做单例,共用一个,每次都只是把visible设置为false,而不是关闭,当第二个信息来时,做判断,如果窗口是显示的,那么做相应的操作,比如透明度还原再重新显示新的消息,或者进入队列,等这个消息消失完毕后,在显示新的消息, 如果窗体没显示,那就显示出来,
有一定道理,楼主可以参考,多线程用不好就是个灾难。
powerat123 2017-07-28
  • 打赏
  • 举报
回复
不要每次都new一个新的,做单例,共用一个,每次都只是把visible设置为false,而不是关闭,当第二个信息来时,做判断,如果窗口是显示的,那么做相应的操作,比如透明度还原再重新显示新的消息,或者进入队列,等这个消息消失完毕后,在显示新的消息, 如果窗体没显示,那就显示出来,
绿领巾童鞋 2017-07-17
  • 打赏
  • 举报
回复
this.Opacity=d; 这句 用委托 执行
苍狼传说 2017-07-17
  • 打赏
  • 举报
回复
chenandczh 的方法是正解。
班门弄武 2017-07-17
  • 打赏
  • 举报
回复

尝试自己写了个.....

namespace WindowsFormsApplication
{
public partial class Form5 : Form
{
public Form5()
{
InitializeComponent();
}
List<Form> forms = new List<Form>();

private void button1_Click(object sender, EventArgs e)
{
AddForm();
}

public void AddForm()
{
AlertFrm frm = new AlertFrm();
frm.FormClosed += new FormClosedEventHandler(frm_FormClosed);
forms.Add(frm);
frm.Show();
frm.TopMost = true;
for (int a = 0; a < forms.Count; a++)
{
forms[a].Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - 300, Screen.PrimaryScreen.WorkingArea.Height - 100 * a);
}
}

void frm_FormClosed(object sender, FormClosedEventArgs e)
{
forms.Remove((Form)sender);
}
}

public class AlertFrm : Form
{
Timer timer = new Timer();
public AlertFrm()
{
this.Text = DateTime.Now.ToString("mmss");
Width = 300;
Height = 100;
this.ShowInTaskbar = false;
timer.Interval = 500;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}

void timer_Tick(object sender, EventArgs e)
{
if (this.Opacity - 0.1 < 0)
{
this.Close();
this.Dispose();
}
this.Opacity = this.Opacity - 0.1;
}
}
}


引用 10 楼 langziqiushui 的回复:
每次最不想看到的回答就是“sp1234” 每次回答不是解决问题,而是批评别人,觉得自己很牛逼的样子,切~~~~

我感觉自己回答的问题或提出的问题都很肤浅。。。
Hobo丶 2017-07-17
  • 打赏
  • 举报
回复
引用 10 楼 langziqiushui 的回复:
每次最不想看到的回答就是“sp1234” 每次回答不是解决问题,而是批评别人,觉得自己很牛逼的样子,切~~~~
哈哈 厉害是厉害。 有点鄙视新手的感觉, 语气很怪。看着不舒服。
及时雨送浆 2017-07-17
  • 打赏
  • 举报
回复 1
每次最不想看到的回答就是“sp1234” 每次回答不是解决问题,而是批评别人,觉得自己很牛逼的样子,切~~~~
那城 2017-07-16
  • 打赏
  • 举报
回复
用异步的方式
  • 打赏
  • 举报
回复
当你说什么“多线程”并且跟“更新UI”相关时,一定要搞明白,这实际上就是要给其它UI刷新工作让路。 在此而言,多线程肯定是故意放慢了速度,为了给其它 UI 刷新动作让出时间片,所以才用多线程啊!谁说多线程就能加快速度?
sj490790083 2017-07-14
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:
ShowDialog 了么,用Show
是用的Show,每次有消息来都New了一个气泡窗体,似乎每次只有最新实例化的会优先改变透明度,不知道为啥
  • 打赏
  • 举报
回复
UI要不要追求所谓的一点点“酷”,到底那种过分地甚至都卡了系统的第三方UI组建值得不值得忽悠,这都要技术人员和用户反复沟通。不要滥用第三方UI组件。自己开发和应用的基本的组件,新技术,在创意上多做考虑,抛弃过时的臃肿的UI控件,更好。
  • 打赏
  • 举报
回复
没有什么“多线程更新UI”那一说。windows桌面程序之所以被认为比人家的连点稍微像样的界面都没有的程序慢十倍,就是因为有大量UI操作。
winkoohuang 2017-07-14
  • 打赏
  • 举报
回复
把接收到的消息放到队列里面,单独的线程循环处理。
exception92 2017-07-14
  • 打赏
  • 举报
回复
ShowDialog 了么,用Show
Haou2020 2017-07-14
  • 打赏
  • 举报
回复
新建一个线程委托他去做

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧