private void Form2_Load(object sender, EventArgs e) { YUVio imgReader = null; try { imgReader = new YUVio(fpath, width, height, colorFormat); } catch (Exception e2) { //エラーメッセージ取得後終了 receiveText = e2.Message; this.Close(); return; } if (!frameLock) { Bitmaps = new Bitmap[imgReader.MaxFrameCount]; imgReadTask = YUVReadTask(imgReader, Bitmaps); timer.Interval = (int)(1000 / fps); timer.Elapsed += new ElapsedEventHandler(timer_Tick); timer.AutoReset = true; timer.Start(); } else { Mat matImages = new Mat(); matImages = YUV2Mat.YUV2MatBGR(imgReader.ReadImage(), 1, 0); pictureBox1.Image = matImages.ToBitmap(); } }
/// <summary> /// YUV動画をMat配列に格納するためのTask /// </summary> /// <param name="imgReader">Mat配列に格納したいYUVioインスタンス</param> /// <param name="matImgs">変換された結果を入れる配列</param> /// <returns></returns> private async Task YUVReadTask(YUVio imgReader, Bitmap[] Bitmaps) { if (_tokenSource == null) { _tokenSource = new CancellationTokenSource(); } var token = _tokenSource.Token; // ワーカースレッドが生成される Task task = Task.Factory.StartNew(() => { Object locker = new Object(); Parallel.For(0, imgReader.MaxFrameCount, i => { int procIndex; YUV img; Mat mat; lock (locker) { //排他制御をかけて、YUVをファイルから読み出す img = imgReader.ReadImage(); procIndex = imgReader.ReadFrameCount; } //変換を行い配列に格納 mat = YUV2Mat.YUV2MatBGR(img, 1, 1); Bitmaps[procIndex] = mat.ToBitmap(); }); }, token).ContinueWith(t => { // TODO:あとしまつ _tokenSource.Dispose(); _tokenSource = null; if (t.IsCanceled) { throw new TaskCanceledException(); } }); // 処理が完了するのを非同期的に待機 await task; }