我的C#morse转换器需要定时器吗

我的C#morse转换器需要定时器吗,c#,timer,C#,Timer,我正试图开发一个应用程序,将文本转换成莫尔斯电码,反之亦然。我刚刚完成了第一阶段,这意味着当你输入一个字符时,你会看到该字符的编码类型。 但在第二阶段,我遇到了一些问题: 这是我的代码:(提示:sw=first stopwatch,flagsw=second stopwatch,datas=dataset,dbc=databaseconverter,listofcode=string of'.'和'-')) private void txtletters\u KeyDown(对象发送方,KeyE

我正试图开发一个应用程序,将文本转换成莫尔斯电码,反之亦然。我刚刚完成了第一阶段,这意味着当你输入一个字符时,你会看到该字符的编码类型。 但在第二阶段,我遇到了一些问题: 这是我的代码:(提示:sw=first stopwatch,flagsw=second stopwatch,datas=dataset,dbc=databaseconverter,listofcode=string of'.'和'-'))

private void txtletters\u KeyDown(对象发送方,KeyEventArgs e)
{
txtletters.BackColor=颜色.黄色;
sw.Start();
如果(flagsw.ElapsedMilliseconds>400)
{
datas=dbc.srchfortext(listofcode);
lbltext.DataBindings.Clear();
添加(“文本”,数据,“t字母”);
txtletters.Text+=lbltext.Text;
listofcode=“”;
}
flagsw.Reset();
}
私有void txtletters\u KeyUp(对象发送方,KeyEventArgs e)
{
txtletters.BackColor=颜色.白色;
sw.Stop();
如果(sw.ElapsedMilliseconds<250)
listofcode+=”;
其他的
listofcode+=“-”;
sw.Reset();
flagsw.Start();
}
我只是设法完成了这项工作,但正如代码所示: 当您按下任何键时,第一个计时器将启动,第一个计时器将确定是否启动。或- 当您释放它时,第二个计时器将启动(使用该计时器,我想知道是否应该关闭“.”、“-”字符串并发送到数据库以返回指定的字符……这里的问题是,除非我再次执行向下键,否则应用程序不会结束计时器并返回字符,这意味着除非我按另一个键,否则我不会看到我键入的字符(只是不要告诉我,这是因为第二个计时器处于按下键状态,我不得不这样做,因为我没有其他选择……但至少我知道这个想法,但不知道如何实施……我只需要有人帮助我实施……)
我需要第二个计时器在后台工作,当发生按键按下时,它将重置,当发生按键上升时(意味着按键释放),它将再次启动比那时候更大,它会完成任务,并为下一次使用清理字符串。

首先,我要感谢克里斯…通过你的回答,我得到了想法并找到了方法。。。 它现在已经完全实现了,如果有人想使用我的代码…(这只是莫尔斯项目的解码器部分)

名称空间莫尔斯电码
{
公共部分类frmdecdotmode:表单
{
布尔标志_isdown=false;
秒表sw=新秒表();
定时器莫尔斯定时器=新定时器();
字符串列表代码;
数据集数据=新数据集();
DataBaseController dbc=新的DataBaseController();
公共frmdecdotmode()
{
初始化组件();
}
私有void frmdecdotmode_FormClosing(对象发送方,FormClosingEventArgs e)
{
主菜单mm=新的主菜单();
mm.Show();
this.Hide();
}
私有void txtletters\u KeyDown(对象发送方,KeyEventArgs e)
{
flag_isdown=true;
txtletters.BackColor=颜色.黄色;
sw.Start();
莫尔斯计时器。停止();
}
私有void txtletters\u KeyUp(对象发送方,KeyEventArgs e)
{
flag_isdown=false;
txtletters.BackColor=颜色.白色;
sw.Stop();
如果(sw.ElapsedMilliseconds<250)
listofcode+=”;
其他的
listofcode+=“-”;
sw.Reset();
morse_定时器。开始();
}
私有void frmdecdotmode_加载(对象发送方,事件参数e)
{
莫尔斯定时器间隔=1000;
morse_timer.Enabled=真;
morse_timer.Tick+=morse_timer_Tick;
}
私有无效莫尔斯定时器勾号(对象发送方,事件参数)
{
if(flag_isdown==false&&listofcode!=null)
{
datas=dbc.srchfortext(listofcode);
lbltext.DataBindings.Clear();
添加(“文本”,数据,“t字母”);
txtletters.Text+=lbltext.Text;
listofcode=“”;
}
}
}
}
感谢所有帮助我做到这一点的人。。。
Ya Ali(a.s)

你可能想看看计时器(例如)。他们会在一段时间后触发一些代码,听起来可能就是你想要的。因此,你可以设置一个2秒钟的计时器,每次你得到一个点或破折号时重置计时器,在没有重置的2秒钟后,它会假设你已经完成并运行任何需要检查点和破折号转换为什么的代码。你可以只有当你同时测量按键的时间长度时,才能正确解码莫尔斯电码。并检测到该时间长度足以结束一个符号,只有这样,你才能将dah DIT转换为字符。你第一次和最后一次按键时都有角盒。第一次按下按键不会给你暂停时间,处理这个问题使用bool。最后一个keyup不会给您一个事件来结束暂停时间测量,请使用工具箱中的计时器来处理。@Chris,非常感谢Chris…根据您的想法,我刚刚实现了一个比前一个计时器更好的东西…现在我的代码使用了一个全局计时器…还有一件事…计时器将每2秒消失一次有一个小问题,如果它是0秒,我键入的东西,它将正常工作,但如果它是开的,例如1.5秒,它将分别解码我的点破折号…任何解决方案??
private void txtletters_KeyDown(object sender, KeyEventArgs e)
{
    txtletters.BackColor = Color.Yellow;
    sw.Start();
    if (flagsw.ElapsedMilliseconds > 400)
    {
        datas = dbc.srchfortext(listofcode);
        lbltext.DataBindings.Clear();
        lbltext.DataBindings.Add("text", datas, "t.letter");
        txtletters.Text += lbltext.Text;
        listofcode = "";
    }
    flagsw.Reset();
}

private void txtletters_KeyUp(object sender, KeyEventArgs e)
{
    txtletters.BackColor = Color.White;
    sw.Stop();
    if (sw.ElapsedMilliseconds < 250)
        listofcode += ".";
    else
        listofcode += "-";
    sw.Reset();
    flagsw.Start();
}
namespace Morse_Code
{
    public partial class frmdecdotmode : Form
    {
        Boolean flag_isdown = false;
        Stopwatch sw = new Stopwatch();
        Timer morse_timer = new Timer();
        string listofcode;
        DataSet datas = new DataSet();
        DataBaseController dbc = new DataBaseController();
        public frmdecdotmode()
        {
            InitializeComponent();
        }

        private void frmdecdotmode_FormClosing(object sender, FormClosingEventArgs e)
        {
            MainMenu mm = new MainMenu();
            mm.Show();
            this.Hide();
        }

        private void txtletters_KeyDown(object sender, KeyEventArgs e)
        {
            flag_isdown = true;
            txtletters.BackColor = Color.Yellow;
            sw.Start();
            morse_timer.Stop();
        }

        private void txtletters_KeyUp(object sender, KeyEventArgs e)
        {
            flag_isdown = false;
            txtletters.BackColor = Color.White;
            sw.Stop();
            if (sw.ElapsedMilliseconds < 250)
                listofcode += ".";
            else
                listofcode += "-";
            sw.Reset();
            morse_timer.Start();
        }

        private void frmdecdotmode_Load(object sender, EventArgs e)
        {
            morse_timer.Interval = 1000;
            morse_timer.Enabled = true;
            morse_timer.Tick += morse_timer_Tick;
        }
        private void morse_timer_Tick(object sender, EventArgs e)
        {
            if (flag_isdown == false && listofcode != null)
            {
                datas = dbc.srchfortext(listofcode);
                lbltext.DataBindings.Clear();
                lbltext.DataBindings.Add("text", datas, "t.letter");
                txtletters.Text += lbltext.Text;
                listofcode = "";
            }
        }
    }
}