当前位置: 首页 > 知识库问答 >
问题:

在windows窗体应用程序C中使用计时器运行特定时间的循环#

葛胡媚
2023-03-14

我试图在特定的时间内重复进行一些计算(时间是可变的,由用户提供)

我尝试使用visual studio中windows窗体应用程序工具箱中可用的计时器,但似乎存在问题。当我启动计时器并将时间变量与while循环关联时,程序卡住了;在计时器的每个滴答事件中,时间变量都在递减,只要时间大于0,我就需要运行while循环。

private void timer1_Tick(object sender, EventArgs e)
    {
        if (time == 0)
            timer1.Stop();

        else
        {
            time--;
            textBoxTime.Text = time.ToString();
        }

    }

这是阻塞程序的time循环

while (time>0)
{
   computations();
}

共有3个答案

何峰
2023-03-14

你可以用秒表

此外,最好将睡眠置于循环中,以避免占用您的所有机器资源

 var sw = new Stopwatch();
 sw.Start();
 while(sw.Elapsed.TotalSeconds < 100 /*Time in second*/)
 {
    /// TODO
    Thread.Sleep(100 /*Time in millisecond*/);
 }
 sw.Stop();
葛胜泫
2023-03-14

可以使用计时器类进行此操作。简单示例如下:

Clock=new Timer();
Clock.Interval=time;
Clock.Start();
Clock.Tick+=new EventHandler(OnTimer_Tick);

其中OnTimer\u Tick是一个执行某些工作的函数

public void OnTimer_Tick(object sender,EventArgs eArgs)
{
//do computations here
}

这里有一个相关的SO帖子

编辑:您的while循环运行速度比tick快,因此您正在运行许多循环。我更新了计时器,将时间变量用作其间隔值,并去掉while循环,对每个刻度进行计算。

吕钧
2023-03-14

我试图在特定的时间内重复进行一些计算,时间是可变的,由用户提供。

我建议您在循环开始时记下它本身,检查每个循环迭代的当前时间,并查看它是否运行了足够长的时间,而不是使用计时器来倒数计时。

这是阻塞程序的time循环

假设您正在UI线程上执行计算。这将阻止处理任何UI消息,包括计时器滴答声,从而使应用程序没有响应。

启动一个单独的线程来执行实际的计算。尽管有很多方法,但Background Worker是从WinForms执行此操作的常用方法。

 类似资料:
  • 我发现围绕这个主题有很多问题,但没有一个回答我的问题。我有一个聊天应用程序,要求我在收到消息但尚未看到时更改任务栏中的应用程序图标,并在看到所有消息时再次更改它。 在从VS2013开始运行应用程序时,我成功地做到了这一点,使用显示的表单中的以下代码:

  • 问题内容: 我需要帮助在特定时间(如下午2点)在服务器上运行Java程序(以索引新文件)。 有人告诉我Java有一些叫做Job的东西,但我不知道该如何使用。我尝试了这个: 但是有了这个程序仍在运行。 如何在指定时间运行程序? 问题答案: 有一个名为Quartz的API ,您的程序可以在其中调度“作业”,并在该时刻运行它。 在给出示例之前,请尝试使用此链接。 编辑:首先,您必须创建一个实现org.q

  • 问题内容: 我有一个包含Java应用程序的JAR文件。如何使它从Windows开始而不需要用户交互? 问题答案: 创建一个.bat文件,并将其放入其中: 然后将.bat文件放入Windows启动文件夹。 还有一件事:使用java和javaw之间是有区别的。虽然在调试应用程序时使用Java更好,但应用程序会打印文本或类似内容,而在不需要时,javaw则更好。为什么?因为java使用控制台显示所有应用

  • 我有一个包含Java应用程序的JAR文件。如何在不需要用户交互的情况下从Windows开始?

  • 问题内容: 我收到应用程序异常 每次当我尝试单击DataGridView时。 我收到错误消息 {“索引-1没有值。”}(SystemIndexOutOfaRange异常)。 在行上 而且我无法调试它。请帮助我找出导致此问题的原因以及如何对其进行调试? 问题答案: 我猜想您已经将一个最初为空的List(或其他不生成列表已更改事件的集合)绑定到了您的,然后将项目添加到了此List中。 您添加的项目将正

  • 我有一个应用程序,有两个定时器开始他们的按钮点击。 当它们开始时,计时器倒计时显示在文本视图中,因此用户可以看到倒计时(10,9,8,7等) 一个计数器是45秒计时器,另一个是30秒计时器。我注意到,当计时器启动时,它们会以两种方式之一运行:计时器倒计时显示从正确的时间开始的秒数(然后跳过一个)45、43、42、41等,或者其他时间不显示开始值,直接跳到(44、43、42、41等),并且不会跳过任