C# 数组内多线程线程号和数组索引不匹配问题
今天做项目的时候需要从视频中切图,为了后续方便处理视频帧,需要把图片按秒为单位创建单独文件夹存储,于是我想到了用多线程的方法处理,每秒建立一个线程处理视频帧。代码如下:
private void getBatchPic_Threads(string videoPath, string outpicPath, int start, int end, int num)
{
// ...
for (int j = start; j < end; j++)
{
CancellationTokenSource cts = new CancellationTokenSource();
Thread t = new Thread(() =>
{
MessageBox.Show(string.Format("{0},{1}", j, Thread.CurrentThread.Name));
if (Directory.Exists(childCachePath))
{
cts.Cancel();
}
if (cts.Token.IsCancellationRequested)
{
return;
}
for (int i = 0; i < curFrameRate; i++)
{
// do
}
});
t.Name = j.ToString();
t.IsBackground = true;
t.Start();
};
}
运行过程中发现处理的文件夹不对,后续输出发现线程号和索引并不匹配。于是想到了可能是线程可能没有立即启动,改成如下代码后果然成功。
private void getBatchPic_Threads(string videoPath, string outpicPath, int start, int end, int num)
{
\\ ...
for (int j = start; j < end; j++)
{
getBatchPics_thread(outpicPath,j);
};
}
private void getBatchPics_thread(string outpicPath,int j)
{
CancellationTokenSource cts = new CancellationTokenSource();
Thread t = new Thread(() =>
{
MessageBox.Show(string.Format("{0},{1}", j, Thread.CurrentThread.Name));
if (Directory.Exists(childCachePath))
{
cts.Cancel();
// return;
}
if (cts.Token.IsCancellationRequested)
{
return;
}
for (int i = 0; i < curFrameRate; i++)
{
//
}
});
t.Name = j.ToString();
t.IsBackground = true;
t.Start();
}
线程调度是比较复杂的,而且线程间调度占用一定时间和空间开销,所以它不实时。