В настоящее время я использую секундомер в качестве глобального таймера. У меня есть основной поток, другой поток и метод события. Основной поток запускает другой поток, и метод события запускается событиями. Оба метода будут вызывать секундомер и получать свое время. Дело в том, что времена не соответствуют: от основного потока: START REC AT 9282 STOP REC АТ 19290секундомер C# ведут себя по-разному в разных потоках?
из другого потока: аудио 1 аудио 304 аудио 354 аудио 404 аудио 444 аудио 494 аудио 544 аудио 594
от метода событий: видео 4 видео 5 видео 29 видео 61 видео 97 видео 129 видео 161
Я не понимаю, почему, если я начинаю свой ЗАП в 9282, две другие функции, которые требуют секундомера будут иметь таймеры, которые начинаются с нуля? Это проблема, связанная с потоком? Как я могу это исправить? Благодаря
UPDATE: * ** * ** * **
, когда я сохранить свои кадры я изменил: долго = relogio.EllapseMilliseconds я распечатать это значение и это нормально, как и ожидалось. но когда я печатаю значение, хранящееся в списках, они начинаются с начала. странно, да? ИЗБЕГАЙТЕ ДЛЯ ВСЕХ НЕИСПРАВНОСТЕЙ, Я ПЕЧАТАТЬ БЕЗ ЗАПУСКА, ПОЧЕМУ, ЧТО ОНИ ВСЕ СКАЗАЛИ НАЧАТЬ ИЗ НУЛЯ! МНОГИЕ СПАСИБО И ИЗБЕГАЙТЕ!
основной поток
private void Start_Recording_Click(object sender, RoutedEventArgs e)
{
rec_starting_time = relogio.ElapsedMilliseconds;
Console.WriteLine("START REC AT " + rec_starting_time);
write_stream.enableRecording();
Thread a = new Thread(scheduleAudioVideoFramePicks);
a.Start();
scheduleAudioVideoFramePicks - это нить просто отсчитывает время, так что я знаю, когда остановиться
//while....
if (rec_starting_time + time_Actual > rec_starting_time+recording_time * 1000)//1000 - 1s = 1000ms
{
totalRecordingTimeElapsed = true;
write_stream.disableRecording();
Console.WriteLine("STOp REC AT " + relogio.ElapsedMilliseconds);
}
//end while
lock (list_audio)
{
int b = 0;
//print time of frames gathered
foreach(AudioFrame item in list_audio){
Console.WriteLine("audio " + (item.getTime() - rec_starting_time));
}
lock (list_video)
{
}
foreach (VideoFrame item in list_video)
{
Console.WriteLine("video " + (item.getTime() - rec_starting_time));
}
}
другой поток, где я получаю время
if (write_stream.isRecording())
{
list_audio.Enqueue(new AudioFrame(relogio.ElapsedMilliseconds, audioBuffer));
}
метод события
if (write_stream.isRecording())
{
list_video.Add(new VideoFrame(relogio.ElapsedMilliseconds, this.colorPixels));
}~
я не знаю, если это уместно, но я начинаю свой секундомер как этот
public MainWindow()
{
InitializeComponent();
//some code
this.relogio = new Stopwatch();
relogio.Start();
}
Во-первых, «Секундомер» не является потокобезопасным. Во-вторых, невозможно диагностировать проблему без просмотра кода. – Lee
Учитывая выбор между ошибкой в секундомере или в коде, который его использует, очень просто обвинить код. Я знаю, что Секундомер работает, я не вижу ваш код. –
отредактирован, чтобы включить код – virgula24