为了账号安全,请及时绑定邮箱和手机立即绑定

第二种形式无法正确加载

第二种形式无法正确加载

C#
陪伴而非守候 2021-11-21 14:56:15
我正在尝试创建一个闹钟,我想要第二个表单来显示闹钟何时开始。问题是它部分加载,当我将鼠标悬停在它上面时,我得到了加载光标。起初我认为我应该等待,但没有任何改变。应该是这样:这是调用第二种形式的函数:private void ring() {    if (System.DateTime.Now.ToString("HH:mm") == temp && songisplaying == false)     {        soundplayer.PlayLooping();        songisplaying = true;        if (WindowState == FormWindowState.Minimized)        {            this.Show();            WindowState = FormWindowState.Normal;        }        wakeupForm win = new wakeupForm();        win.Show();    }这是第二种形式的代码public partial class wakeupForm : Form{    public wakeupForm()    {        InitializeComponent();    }    private void button1_Click(object sender, EventArgs e)    {    }}这是调用ring函数的代码:public Form1(){    InitializeComponent();    num1.Maximum = 2;    num3.Maximum = 5;    num4.Maximum = 9;    var timer2 = new System.Threading.Timer(e => ring(),null,TimeSpan.Zero,TimeSpan.FromSeconds(10));    ofd.Filter = "WAV | *.wav";}
查看完整描述

2 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

System.Threading.Timerring()在线程池中的一个线程上运行。ring()反过来尝试实例化一个应该始终在主线程上完成的窗体(对 windows 窗体的所有访问都应该从主线程完成)。


请改用以下内容:


private void ring() 

{

    if (System.DateTime.Now.ToString("HH:mm") == temp && songisplaying == false) 

    {

        songisplaying = true;

        if (this.InvokeRequired) 

            this.Invoke(new MethodInvoker(()=>{ringOnMainThread()}));

        else

            ringOnMainThread();

    }

}


private void ringOnMainThread()

{

    soundplayer.PlayLooping();

    timer1.Start();


    if (WindowState == FormWindowState.Minimized)

    {

        this.Show();

        WindowState = FormWindowState.Normal;

    }


    wakeupForm win = new wakeupForm();

    win.Show();

}

请注意,我已songisplaying = true;采取行动以避免竞争条件。


查看完整回答
反对 回复 2021-11-21
?
千万里不及你

TA贡献1784条经验 获得超9个赞

我相信您应该在显示表单时停止计时器。


(检查你的计时器间隔。如果它在一分钟内滴答不止一次,它会多次击中你的 ring() 方法)。


您应该在 ring() 方法中停止您的计时器,并在您的 wakeupForm 的 FormClosing 上重新启动。


    private void ring() {


    if (System.DateTime.Now.ToString("HH:mm") == temp && songisplaying == false) {

        soundplayer.PlayLooping();




        timer1.Stop();//Stop your timer.




        songisplaying = true;


        if (WindowState == FormWindowState.Minimized)

        {

            this.Show();

            WindowState = FormWindowState.Normal;

        }


        wakeupForm win = new wakeupForm();

        win.Form_Closed += win_Closed;

        win.Show();


    }


     private void wnd_Closed(object sender, EventArgs e)

     {

        timer1.Start();

     }


查看完整回答
反对 回复 2021-11-21
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信