请问while中计时器不起作用,为什么啊??

zky0901 2017-09-18 06:57:22
public int num = 0;
Timer tt = new Timer();//输入字
public string zcname = "";
public string zcname2 = "";
private void btnHz_Click(object sender, EventArgs e)
{
if(btnHz.Text=="模式启动")
{
string sql = "select * from sword inner join suser on sword.sid=suser.sid where ctype=" + 1 + " order by stype desc,cdate desc,cid desc";
MySqlConnection conn = new MySqlConnection(connStr);
MySqlCommand cmd = new MySqlCommand(sql, conn);
conn.Open();
MySqlDataReader rd = cmd.ExecuteReader();
wbr.Visible = true;
wbr.Url = new Uri("http://www.abc.com");
while (rd.Read())
{
zcname = rd["cname"].ToString();
zcname2 = rd["cname2"].ToString();
tt.Interval = 1000;//-----------------------------这里第一次是延时的
tt.Tick += new EventHandler(tt_Tick);//----------这里间隔时没起到延时作用
tt.Start();
}
rd.Close();
conn.Close();
}
else
{
wbr.Visible = false;
}
}

public void tt_Tick(object sender, EventArgs e)
{
this.wbr.Document.GetElementById("key").Focus();
string kw = zcname;
if(num==kw.Length)
{
System.Windows.Forms.SendKeys.Send("{Enter}");
tt.Stop();
tt2.Interval = 4000;
tt2.Tick += new EventHandler(tt_Tick1b);
tt2.Start();
}
else
{
SendKeys.Send(kw[num].ToString());
num++;
}
}
程序如上,我的意图是读出所有记录,每读出一条记录就执行一下while大括号里的程序,可是我用while好像总是不正常,每次不能计时延时,请问为什么啊??如果while改成if,就一切正常,可以延时输入文字起打字效果,请问怎么处理啊???
...全文
244 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zky0901 2017-09-21
  • 打赏
  • 举报
回复
还是不明白怎么处理??是用timer还是Thread.Sleep呢??
碎碎0_o 2017-09-20
  • 打赏
  • 举报
回复
要延时可以用Thread.Sleep(1000);
xuzuning 2017-09-19
  • 打赏
  • 举报
回复
tt.Interval = 1000;//-----------------------------这里第一次是延时的 tt.Tick += new EventHandler(tt_Tick);//----------这里间隔时没起到延时作用 显然你误解了定时器的作用,定时器是在到达指定的时间间隔后去做某件事情,并没有延缓当前程序执行的功能
  • 打赏
  • 举报
回复
定时器是(类似)这样用的
                {
                    zcname = rd["cname"].ToString();
                    zcname2 = rd["cname2"].ToString();
                    var t2 = new Timer();
                    tt_list.Add(t2);
                    t2.Interval = 1000;//-----------------------------这里第一次是延时的
                    var copy1 = zcname;
                    var copy2 = zcname2;
                    t2.Tick += (s1,e1)=>
                    {
                           模拟打字操作(copy1,, copy2);
                           t2.Stop();
                    };
                    t2.Start();
                }
这里,动态产生 n 个(n==你的记录数量)定时器,每一个单独干自己的事情。windows 和 .net 从底层到应用层都可以优化定时器机制。然后每一个定时器的 Tick 事件处理方法中,要使用匿名委托方式封装 zcname 和 zcname2 的副本,而不是直接使用 zcname 和 zcname2,因为这两个变量在执行到“摸你打字操作”方法时早已经去引用其它对象了,而不是引用循环过程中正确的对象。 你要画流程图,表达清楚流程。如果只会给“代码相面”那么其实做不出什么来。我们看一个程序员,不是看他抄什么代码来,不是看这个皮毛,而是看他脑子里为代码背后所建立的“立体的”流程图到底是什么。
易2017 2017-09-18
  • 打赏
  • 举报
回复
你应该用sd.HasRows来判断结果是否有值
易2017 2017-09-18
  • 打赏
  • 举报
回复
我先格式化看一下
       public int num = 0;
        Timer tt = new Timer();//输入字
        public string zcname = "";
        public string zcname2 = "";
        private void btnHz_Click(object sender, EventArgs e)
        {
            if(btnHz.Text=="模式启动")
            {
                string sql = "select * from sword inner join suser on sword.sid=suser.sid where ctype=" + 1 + " order by stype desc,cdate desc,cid desc";
                MySqlConnection conn = new MySqlConnection(connStr);
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                conn.Open();
                MySqlDataReader rd = cmd.ExecuteReader();
                wbr.Visible = true;
                wbr.Url = new Uri("http://www.abc.com");
                while (rd.Read())
                {
                    zcname = rd["cname"].ToString();
                    zcname2 = rd["cname2"].ToString();
                    tt.Interval = 1000;//-----------------------------这里第一次是延时的
                    tt.Tick += new EventHandler(tt_Tick);//----------这里间隔时没起到延时作用
                    tt.Start();
                }
                rd.Close();
                conn.Close();
            }
            else
            {
                wbr.Visible = false;
            }
        }
        
        public void tt_Tick(object sender, EventArgs e)
        {
            this.wbr.Document.GetElementById("key").Focus();
            string kw = zcname;
            if(num==kw.Length)
            {
                System.Windows.Forms.SendKeys.Send("{Enter}");
                tt.Stop();
                tt2.Interval = 4000;
                tt2.Tick += new EventHandler(tt_Tick1b);
                tt2.Start();
            }
            else
            {
                SendKeys.Send(kw[num].ToString());
                num++;
            }
        }

110,534

社区成员

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

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

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