diff --git a/ISCamRecorder/MainForm.cs b/ISCamRecorder/MainForm.cs index 6e74095..60c601c 100644 --- a/ISCamRecorder/MainForm.cs +++ b/ISCamRecorder/MainForm.cs @@ -33,6 +33,7 @@ Task _TriggerThread; // トリガースレッド Task _SerialThread; // シリアル通信スレッド Task _CvCameraThread; // opencvカメラスレッド + Task _RecodingThread; // 録画スレッド float _TriggerFrameRate = 30.0F; // トリガーフレームレート private ulong _availablePhysicalMemory; //合計物理メモリ DateTime _LastUpdate; // 前回のUI更新時間 @@ -248,56 +249,79 @@ /// /// private void BtnRecodeMovie_Click(object sender, EventArgs e) { - if (BtnRecodeMovie.Text.Equals("中断")) { - // 中断は機能せず - _Cameras.ForEach(c => c.StopRecoding()); + if (_RecodingThread != null) { + // 中断 + //_Cameras.ForEach(c => c.StopRecoding()); + Debug.WriteLine("recoding"); } else { BtnRecodeMovie.Enabled = false; BtnSetProperty.Enabled = false; BtnRecodeMovie.Text = "撮影中"; var originalColor = BtnRecodeMovie.BackColor; BtnRecodeMovie.BackColor = Color.Orange; - // 録画モードへ変更 + + _RecodingThread = Task.Run(RecodingThread); + } + } + + /// + /// 録画スレッド + /// + private void RecodingThread() + { + string recodingDulationTxt = ""; + string movieRateTxt = ""; + string imageTypeTxt = ""; + // 録画モードへ変更 + this.Invoke((MethodInvoker)delegate { _Cameras.ForEach(c => c.ChangeSink(true)); - // 録画条件設定 - var frameRate = _Cameras.Select(c => c.FrameRate).Average(); - var framesToCapture = (int)(float.Parse(TxtRecodingDulation.Text) - * frameRate + 1.0F); - var movieRate = int.Parse(TxtMovieRate.Text); - var recTime = DateTime.Now.ToString("yyyyMMdd_HHmmss"); - var outputDir = Path.Combine(TxtOutputDir.Text, $"rec{recTime}"); - Directory.CreateDirectory(outputDir); - var imageType = CboImageType.Text; - var sensorFile = Path.Combine(outputDir, $"Sensor_{recTime}.csv"); - _Sensor.StartRecoding(sensorFile); - _CvCamera.StartRecoding(); - // 録画 - Task[] tasks = new Task[4]; - for (var i = 0; i < _Cameras.Count; i++) { - var cam = _Cameras[i]; - tasks[i] = Task.Run(() => cam.RecordToMemory(framesToCapture)); - } - Task.WaitAll(tasks); - _Sensor.StopRecoding(); - _CvCamera.StopRecoding(); - // 保存 + + recodingDulationTxt = TxtRecodingDulation.Text; + movieRateTxt = TxtMovieRate.Text; + imageTypeTxt = CboImageType.Text; + }); + // 録画条件設定 + var frameRate = _Cameras.Select(c => c.FrameRate).Average(); + var framesToCapture = (int)(float.Parse(recodingDulationTxt) * frameRate + 1.0F); + var movieRate = int.Parse(movieRateTxt); + var recTime = DateTime.Now.ToString("yyyyMMdd_HHmmss"); + var outputDir = Path.Combine(TxtOutputDir.Text, $"rec{recTime}"); + Directory.CreateDirectory(outputDir); + var imageType = imageTypeTxt; + var sensorFile = Path.Combine(outputDir, $"Sensor_{recTime}.csv"); + _Sensor.StartRecoding(sensorFile); + _CvCamera.StartRecoding(); + // 録画 + Task[] tasks = new Task[4]; + for (var i = 0; i < _Cameras.Count; i++) { + var cam = _Cameras[i]; + tasks[i] = Task.Run(() => cam.RecordToMemory(framesToCapture)); + } + Task.WaitAll(tasks); + _Sensor.StopRecoding(); + _CvCamera.StopRecoding(); + // 保存 + this.Invoke((MethodInvoker)delegate { BtnRecodeMovie.Text = "保存中"; BtnRecodeMovie.BackColor = Color.Aqua; - for (var i = 0; i < _Cameras.Count; i++) { - var cam = _Cameras[i]; - tasks[i] = Task.Run(() => cam.SaveToFile( - outputDir, frameRate, movieRate, imageType, recTime)); - } - Task.WaitAll(tasks); - _CvCamera.SaveToFile(outputDir, imageType, recTime); + }); + for (var i = 0; i < _Cameras.Count; i++) + { + var cam = _Cameras[i]; + tasks[i] = Task.Run(() => cam.SaveToFile( + outputDir, frameRate, movieRate, imageType, recTime)); + } + Task.WaitAll(tasks); + _CvCamera.SaveToFile(outputDir, imageType, recTime); - // プレビューモードへ変更 + // プレビューモードへ変更 + this.Invoke((MethodInvoker)delegate { _Cameras.ForEach(c => c.ChangeSink(false)); BtnRecodeMovie.Text = "動画撮影"; - BtnRecodeMovie.BackColor = originalColor; + BtnRecodeMovie.BackColor = Color.Gray; BtnRecodeMovie.Enabled = true; BtnSetProperty.Enabled = true; - } + }); } ///