第二种形式无法正确加载

时间:2018-08-09 08:31:51

标签: c# winforms

我正在尝试创建一个闹钟,我想在闹钟启动时显示第二个表格。

问题在于它会部分加载,当我将鼠标悬停在其上时会得到加载光标。起初,我虽然应该等待,但是什么都没有改变。

enter image description here

这应该是这样的:

enter image description here

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

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 个答案:

答案 0 :(得分:2)

System.Threading.Timer在线程池中的线程上运行ring()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;以避免出现比赛情况。

答案 1 :(得分:0)

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

(检查您的计时器间隔。如果它在一分钟内滴答一声以上,则将多次敲响ring()方法。)

您应该在ring()方法中停止计时器,并在唤醒表的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();
     }