我正在尝试创建一个闹钟,我想在闹钟启动时显示第二个表格。
问题在于它会部分加载,当我将鼠标悬停在其上时会得到加载光标。起初,我虽然应该等待,但是什么都没有改变。
这应该是这样的:
这是调用第二种形式的函数:
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";
}
答案 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();
}