C#求解timer控件知识

笨山猴 2013-02-17 11:45:44
大家好,,经过一晚上的奋斗,和,start()和stop()的方法好奇怪,我stop后,再也启动不了,最后参照msdn上timer的用法,我也终于解决了下我自己贴子的问题,
http://bbs.csdn.net/topics/390368476
我的解决方法是::
       
public void hexing_name_select()
{
hexing_line hexing = new hexing_line();
for (int i = 0; i < hexing.hexing_name.Count(); i++)
{
hexing_date.Rows.Add();
hexing_date.Rows[i].Cells[0].Value = hexing.hexing_name[i];
hexing_date.Rows[i].Cells[1].Value = hexing.hexing_ip[i];
}
}

public void hexing_ping(object obj)
{
int i = Convert.ToInt32(obj);
Ping pp = new Ping();
PingReply ppResult = pp.Send(Convert.ToString(hexing_date.Rows[i].Cells[1].Value), 10);
hexing_date.Rows[i].Cells[2].Value = ppResult.RoundtripTime.ToString();
hexing_date.Rows[i].Cells[3].Value = ppResult.Status.ToString();
hexing_date.Rows[i].Cells[4].Value = z;
}
static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
public void hexing_click_select(object source, EventArgs e)
{
//myTimer.Stop();我尝试了下,这个stop不stop都不会影响到ping的时候会卡界面的情况。
z+=1;
if (z < 10)
{
hexing_thread();
myTimer.Enabled = true;////是不是这一句起到了作用?求解
}
else
{
myTimer.Enabled = false;
}
}
public void hexing_thread()
{
int line_count = hexing_date.RowCount;
Thread[] line_PING = new Thread[line_count];
for (int a = 0; a < line_count; a++)
{
line_PING[a] = new Thread(new ParameterizedThreadStart(hexing_ping));
line_PING[a].Start(a);
}
}
private void hexing_check_Click(object sender, EventArgs e)
{
hexing_date.Rows.Clear();
hexing_name_select();
myTimer.Tick += new EventHandler(hexing_click_select);
myTimer.Interval = 1000;
myTimer.Start();

}


现在我测试出来的就不会出现界面卡现象,,我有两个问题我想不明白,想问问大家,
①:我这种方法可行么?因为我觉得这个timer也好像是没隔1s就创建了很多线程一样,myTimer.Stop();这句代码没有效果,个人感觉:我现在这个代码的流程和我以前做的那个流程差不多。但是为啥效果会不一样。。
②我测试了下,好像就是这句代码给的效果static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();但是我不懂,这句代码和我从控件界面直接拉下来的timer控件有什么不同的么。。。
...全文
270 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
oDengDaiShuaXin1 2013-02-19
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
myTimer.Enabled = false; 就等于调用了 myTimer.Stop()。两个语句有一个就够了,可惜你保留了一个不恰当的语句,注释掉一个恰当的语句。 同样地,设置 myTimerEnable = true 就等于调用了 myTimer.Start()。 你执行了10次异步注册线程,然后就调用Stop。就算你不让“重复任务垃圾”堆积这么多次……
.
笨山猴 2013-02-19
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
所有的 hexing_ping 异步调用均完毕(最后一个之行结束)时 --> 所有的 hexing_ping 异步调用均完毕(最后一个 hexing_ping 方法调用执行结束)时

        System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
        private void hexing_check_Click(object sender, EventArgs e)
        {
            hexing_date.Rows.Clear();
            hexing_name_select();
            z = 0;
            hexing_check.Enabled = false;
            myTimer.Tick += new EventHandler(hexing_click_select);
            myTimer.Interval = 1000;          
            myTimer.Start();

        }
        private void hexing_stop_Click(object sender, EventArgs e)
        {
            z = 0;
            myTimer.Stop();
            hexing_check.Enabled = true;
        }

        public void hexing_click_select(object source, EventArgs e)
        {
            myTimer.Stop();
            z += 1;
            if (z < 10)
            {
                hexing_thread();
            }
            else
            {
                int click_all = z - 1;
                z = 0;
                click_all = 0;
                myTimer.Enabled = false;
            }


        }

        public void hexing_thread()
        {
            int line_count = hexing_date.RowCount;
            Thread[] line_PING = new Thread[line_count];
            for (int a = 0; a < line_count; a++)
            {
                line_PING[a] = new Thread(new ParameterizedThreadStart(hexing_ping));
                line_PING[a].Start(a);
                
            }
              myTimer.Start();
        }

        public void hexing_ping(object obj)
        {

            int i = Convert.ToInt32(obj);
            Ping pp = new Ping();
            PingReply ppResult = pp.Send(Convert.ToString(hexing_date.Rows[i].Cells[1].Value), 10);

            hexing_date.Rows[i].Cells[2].Value = ppResult.RoundtripTime.ToString();
            hexing_date.Rows[i].Cells[3].Value = ppResult.Status.ToString();
            hexing_date.Rows[i].Cells[4].Value = z;

            
        }

大神,你看看我现在改的对么,,我把 myTimer.Start()放在hexing_thread(),,,我这边测试了下,一切正常,,,但是我有个疑问就是我点击 暂停 按钮后,然后重新点击开始,那个z会变成从2开始每次递增2,然后再暂停开始,又变成从3开始数,每次递增3,为啥z不会变为0(z这里是用来统计我ping了多少次IP,)
笨山猴 2013-02-19
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
myTimer.Enabled = false; 就等于调用了 myTimer.Stop()。两个语句有一个就够了,可惜你保留了一个不恰当的语句,注释掉一个恰当的语句。 同样地,设置 myTimerEnable = true 就等于调用了 myTimer.Start()。 你执行了10次异步注册线程,然后就调用Stop。就算你不让“重复任务垃圾”堆积这么多次……
  public void hexing_ping(object obj)
        {

            int i = Convert.ToInt32(obj);
            Ping pp = new Ping();
            PingReply ppResult = pp.Send(Convert.ToString(hexing_date.Rows[i].Cells[1].Value), 10);

            hexing_date.Rows[i].Cells[2].Value = ppResult.RoundtripTime.ToString();
            hexing_date.Rows[i].Cells[3].Value = ppResult.Status.ToString();
            hexing_date.Rows[i].Cells[4].Value = z;

           // myTimer.Enabled = true;
            myTimer.Start();
        }


        public void hexing_click_select(object source, EventArgs e)
        {
            myTimer.Stop();
            //myTimer.Enabled = false;
            z+=1;
            if (z < 10)
            {
               hexing_thread();
               myTimer.Enabled = true;
            }
            else
            {                 
                int click_all = z - 1;
                z = 0;
                click_all = 0;
                myTimer.Enabled = false;
            }


        }
我按照你的方法,我试了下,,就是不管我用start还是enable=true都无法再暂停后启动。。。 现在我就是卡在这里,,,想又想不懂,,然后百度上查了下,,又没有具体的解决方案,
Johnny_Bao 2013-02-19
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
myTimer.Enabled = false; 就等于调用了 myTimer.Stop()。两个语句有一个就够了,可惜你保留了一个不恰当的语句,注释掉一个恰当的语句。 同样地,设置 myTimerEnable = true 就等于调用了 myTimer.Start()。 你执行了10次异步注册线程,然后就调用Stop。就算你不让“重复任务垃圾”堆积这么多次,又何必让它堆积2~9次呢……
+1
devmiao 2013-02-18
  • 打赏
  • 举报
回复
static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer(); 最好不要加上static,这样所有窗体实例共享一个timer。 去掉static,这代码和你从设计器拖动过来的是一样的。
  • 打赏
  • 举报
回复
所有的 hexing_ping 异步调用均完毕(最后一个之行结束)时 --> 所有的 hexing_ping 异步调用均完毕(最后一个 hexing_ping 方法调用执行结束)时
  • 打赏
  • 举报
回复
myTimer.Enabled = false; 就等于调用了 myTimer.Stop()。两个语句有一个就够了,可惜你保留了一个不恰当的语句,注释掉一个恰当的语句。 同样地,设置 myTimerEnable = true 就等于调用了 myTimer.Start()。 你执行了10次异步注册线程,然后就调用Stop。就算你不让“重复任务垃圾”堆积这么多次,又何必让它堆积2~9次呢?打个比方,你每隔7个小时就给国务院写一封内容相同的建议书,明知道人家处理流程需要3天,你却仍然坚持每隔几个小时就寄出去一封,干什么? 最后,为什么10次以后就再也不ping了?难道你要放一个人去不断地用手指点击 hexing_check 按钮?因此这就是业务逻辑错误了,你保留了一个不恰当的语句,原因是你的业务逻辑都改成错误的了! 你应该在一进入hexing_click_select时立刻关闭定时器,然后当所有的 hexing_ping 异步调用均完毕(最后一个之行结束)时才将定时器启动。
catchdream 2013-02-18
  • 打赏
  • 举报
回复
http://blog.csdn.net/catchdream/article/details/8524182 有些关于timer的分析,希望对你有用
supegg 2013-02-18
  • 打赏
  • 举报
回复
参考 http://blog.csdn.net/supegg/article/details/6460649
enaking 2013-02-18
  • 打赏
  • 举报
回复
1楼正解....

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧