第二种形式无法正确加载

我正在尝试创建一个闹钟,我想要第二个表单来显示闹钟何时开始。

问题是它部分加载,当我将鼠标悬停在它上面时,我得到了加载光标。起初我认为我应该等待,但没有任何改变。

http://img4.mukewang.com/6199eda60001391606090515.jpg

应该是这样:


http://img.mukewang.com/6199edb200018a9802970202.jpg

这是调用第二种形式的函数:


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";

}


陪伴而非守候
浏览 152回答 2
2回答

倚天杖

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;采取行动以避免竞争条件。

千万里不及你

我相信您应该在显示表单时停止计时器。(检查你的计时器间隔。如果它在一分钟内滴答不止一次,它会多次击中你的 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();     }
打开App,查看更多内容
随时随地看视频慕课网APP