【发布时间】:2013-07-06 18:21:21
【问题描述】:
我目前正在使用秒表作为全局计时器。我有主线程正在运行,另一个线程和一个事件方法。 主线程启动另一个线程,事件方法由事件触发。这两种方法都会调用秒表并获取它的时间。问题是,时代不一致: 从主线程: 在 9282 开始录音 在 19290 停止记录
来自另一个线程: 音频 1 音频 304 音频 354 音频 404 音频 444 音频 494 音频 544 音频594
来自事件方法: 视频 4 视频 5 视频 29 视频 61 视频 97 视频 129 视频 161
我不明白为什么如果我在 9282 开始我的记录,那么调用秒表的其他两个函数的计时器将从零开始?这是与线程相关的问题吗?我怎样才能解决这个问题?谢谢
更新:*********
当我保存我的帧时,我更改为: long a = 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();
}
【问题讨论】:
-
首先,
Stopwatch不是线程安全的。其次,不查看代码就无法诊断您的问题。 -
如果要在 Stopwatch 中的错误或使用它的代码中做出选择,责怪代码非常简单。我知道秒表可以工作,我看不到你的代码。
-
已编辑以包含代码
-
同一个类,我只在mainWindow上启动一次秒表。事件仅在调用 Start_Recording_Click 时开始(从按钮)。然后 write_stream.enableRecording();启用录制,所有类开始抓取音频和视频帧。所以这就是为什么我没有得到那些时间
标签: c# multithreading stopwatch