Member 12990959 Ответов: 3

Как автоматически остановить таймер в C# ..?


Всем привет,

Я написал программу для отправки текстовых файлов через последовательный порт на c# и добавил таймер для расчета времени.
Когда я начинаю отправлять файл, таймер включен. Но он не остановится, когда передача будет завершена, может ли кто-нибудь сказать мне, как остановить / приостановить таймер, когда передача файлов будет завершена

private void butSendFileEle_Click(object sender, EventArgs e)
       {
           if (serialPort1.IsOpen == false)
           {
               try
               {
                   this.serialPort1.Open();
               }
               catch
               {
               }
           }
           timer1.Start();
           serialPort1.Write(System.IO.File.ReadAllText(this.txtfilePo.Text));

       }


private void timer1_Tick(object sender, EventArgs e)
       {
           label2.Text = min + ":" + sec + ":" + ms + ":" + us.ToString();
           ms++;
           if (us > 10)
           {
               ms++;
               us = 0;
           }
           else
           {
               us++;
           }
           if (ms > 100)
           {
               sec++;
               ms = 0;
           }

       }


Это мой код

Что я уже пробовал:

Это правильный путь ?? если нет, то может ли кто-нибудь подсказать мне правильный способ расчета продолжительности времени

Заранее спасибо

Dave Kreskowiak

Имейте в виду, что нет такой вещи, как что-то происходит "автоматически" для вас. Вы должны написать код, чтобы все это произошло.

Member 12990959

да, я знаю, что ничего подобного не происходит автоматически для меня, и я знаю, что должен писать там код, вот что я спрашиваю, Как писать, и любые предложения от экспертов ..

Спасибо

Philippe Mori

Этот код не имеет большого смысла. Таймер предназначен не для хронометража, а для того, чтобы вызвать событие по истечении некоторого времени. Кроме того, таймер не очень точен. Если система занята, события будут опаздывать, и Ваше вычисленное время будет короче, чем ожидалось. Возможно, было бы неплохо прочитать документацию перед написанием кода.

3 Ответов

Рейтинг:
1

Ralf Meier

Еще одна (очень простая) возможность :
- bevor вы записываете свои данные в Serialport, который Вы читаете сейчас, в переменную (тип Date)
- когда вы закончите Serialport. write, вы построите разницу (как timeSpan) между вашей переменной и Now - это покажет вам также прошедшее время (в секундах или миллисекундах-как вы хотите)

Это может выглядеть так :

System.DateTime myStart = System.DateTime.Now;

serialPort1.Write(System.IO.File.ReadAllText(this.txtfilePo.Text));

System.TimeSpan myTimespan = System.DateTime.Now.Subtract(myStart);
Int myElapsedTime = myTimespan.Seconds * 1000 + myTimespan.Milliseconds;


Member 12990959

спасибо за ответ

частная butSendFile_Click недействительным(объект отправителя, EventArgs в электронной)
{
if (serialPort1.Isopen значение == ложь)
{
это.serialPort1.Открыть();
}
Система.DateTime myStart = сейчас;

serialPort1.Писать(Системы.ИО.Файл.ReadAllText(this. txtfile2. Text));
TimeSpan myTimespan = сейчас.Вычитание(myStart);
Int myElapsedTime = myTimespan.Секунды * 1000 + myTimespan.Миллисекунды;

}

если я напишу такой код, то получу 3 ошибки в
1) "сейчас" не выходит в текущем контексте
2) "int" не удалось найти

что я должен сделать, чтобы удалить эти ошибки

Ralf Meier

Извините... это происходит при написании кода вслепую ...
Теперь выходит из пространства имен System - вы должны либо использовать его (используя System ;), либо написать его до этой инструкции (я изменил свое решение)

Member 12990959

И снова он показывает те же ошибки, сэр.
теперь и целое число
Даже я использовать (используя.Система;)

Ralf Meier

Еще раз прошу прощения,
в своем коде я спонтанно использую эти части ...
Это должна быть " система.значение datetime.Теперь" - и INT должен быть прав-смотрите мой код-изменения

Member 12990959

Он не работает на этот раз без ошибок, но порт не открывается, если я вставляю свой код и связь не обрабатывается

Ralf Meier

ОК... код соответствует тому, что немного выше, с моими модификациями ...?
Если да , то что говорит отладчик ?
Но: возможно, вам следует снова показать свой код ...

Member 12990959

частная butSetFile_Click недействительным(объект отправителя, EventArgs в электронной)
{
это. openFileDialog1.Метод showdialog();

это.txtfile2.Text = this. openFileDialog1.имя файла;

// выбор файла из проводника

}

частная butSendFile_Click недействительным(объект отправителя, EventArgs в электронной)
{
попробуйте / / отправить файлы через последовательный порт
{

if (serialPort1.Isopen значение == ложь)
{
это.serialPort1.Открыть();
}

Система.Системы ваши личные данные типа datetime=.Датавремя.Сейчас;
serialPort1.Писать(Системы.ИО.Файл.ReadAllText(this. txtfile2. Text));


Система.TimeSpan myTimespan = система.Датавремя.Сейчас.Вычитание(с mystart);
int myElapsedTime = myTimespan.Секунды * 1000 + myTimespan.Миллисекунды;
}
ловить
{
}
}


Это мой код... хотите полный код ...???

Ralf Meier

Нет... это нормально реализовано так, как должно ...
А как насчет моих вопросов ?
- Что говорит отладчик ?
- Это шаг через код или есть какой-то обман ? Если да, то в какой точке кода появляется исключение?

Member 12990959

в коде, который я использую, есть исключение try and catch, но таймер даже не запускается

Ralf Meier

Так... установите точку останова перед каждой кодовой линией и посмотрите, насколько хорошо работает ваш код и в какой кодовой линии возникает ошибка.
Разве вы не работали с отладчиком до сих пор ?

Ralf Meier

пожалуйста, обратите внимание :
Я не сижу перед твоим компьютером и не вижу того, что видишь ты.
Если вам нужна моя помощь, вы должны помочь мне помочь вам ...

Рейтинг:
0

Deepak Geriani

Секундомер намного лучше любого таймера для этого
вот пример, который может помочь понять, когда и как вызывать секундомер, остановить его и вывести время.

using System.Threading;
 public class Program
    {
        public static void Main(string[] args)
        {
               
            var stopwatch = new System.Diagnostics.Stopwatch();
                stopwatch.Start();
                Thread.Sleep(100);
            Console.WriteLine("Hello, world!");
            // Your code here.
                int cnt=0;
                for(int i=1; i<=100000;i++)
                {
                    cnt+=1;
                }
            stopwatch.Stop();
            TimeSpan ts = stopwatch.Elapsed;
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
            Console.WriteLine("RunTime " + elapsedTime);
            
        }            
            
        }


Member 12990959

Спасибо за ответ Здесь я посылаю текстовый файл а не прямые сообщения как я должен попробовать этот код и его приложение windows а не консольное приложение

Ralf Meier

Я вас не понимаю-образец тихий хороший.
Все между секундомером.Старт и секундомер.Стоп-это пример, чтобы показать, как это работает. В этом месте вы должны ввести свой метод передачи данных или его содержимое ...

Deepak Geriani

Именно то, что я пытался объяснить, - это написать вам логический код между запуском и остановкой секундомера, а также прокомментировать, что напишите "ваш код здесь", Если вы можете видеть его правильно

Member 12990959

да..


частная butSendFile_Click недействительным(объект отправителя, EventArgs в электронной)
{
if (serialPort1.Isopen значение == ложь)
{
это.serialPort1.Открыть();
}
таймера1.Начать();
serialPort1.Писать(Системы.ИО.Файл.ReadAllText(this. txtfile2. Text));
таймера1.Стоп();
}

если мы используем секундомер start и stop в одном цикле, он даже не запускается

Рейтинг:
0

OriginalGriff

Вызов:

timer1.Stop();
Когда передача завершена - то есть у вас закончились данные для отправки. Регистрация Последовательный порт.Собственность BytesToWrite (Системы.ИО.Порты)[^] и это даст вам оценку - еще не все байты поступят в деситинацию, потому что драйвер порта также будет иметь свой собственный буфер, и аппаратные чипы порта обычно также имеют небольшой (8 байт или около того) буфер, но вы не можете запросить их напрямую, чтобы получить точную индикацию.


Member 12990959

да, я пишу timer1. stop (); после 1-го кода таймер даже не работает

OriginalGriff

:вздыхать:
Вот почему я упомянул BytesToWrite-данные последовательного порта буферизуются три раза (четыре, если включить сам битовый излучатель) - так что если вы не проверите, сколько осталось записать, вы не узнаете...