注目のプログラム例
C#+WPF マルチスレッド ビデオ カメラ プレーヤーの監視
動作環境のインストールやリモート デバッグが必要な場合は、記事の下部にある個人用QQ名刺を参照してください。専門および技術担当者がリモートでサポートします。
序文
このブログは、<<C#+WPF マルチスレッド ビデオ カメラ プレーヤー監視>> のコードを作成しています。コードはきちんとしていて、規則的で、読みやすいです。学習およびアプリケーションの推奨の最初の選択肢。
なぜマルチスレッドを使用する必要があるのですか? マルチスレッドは、フリーズ、黒い画面、ブルー スクリーン、ぼやけた画面の問題を防ぐための、リモート ビデオのキャプチャと再生の主要なアルゴリズム機能です。キャプチャして再生するという方法を採用する必要があります。
記事ディレクトリ
1. 必要なツールソフトウェア
2. ステップを使用する
1.ライブラリをインポートする
2. コードの実装
3. 走行結果
3. オンラインサポート
1. 必要なツールソフトウェア
1.VS、WPF
2.OpenCV
2. ステップを使用する
1.ライブラリをインポートする
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Windows.Threading;
using System.Timers;
using System.ComponentModel;
2. コードの実装
コードは以下のように表示されます。
public class Thread1Class : System.Windows.Window
{
// 第一个线程要执行的代码
//多线程1
//opencv变量1
public Mat frameMatT1;
private volatile bool stopFlag = false;
private ManualResetEvent pauseSignal = new ManualResetEvent(true);
public void Thread1Function()
{
try
{
// 在这里编写第一个线程要执行的代码
Console.WriteLine("capture0");
// 在这里编写要在UI线程上执行的操作
VideoCapture capture1 = new VideoCapture();
capture1.Open("aa.mp4", VideoCaptureAPIs.ANY);
Console.WriteLine("capture00");
if (capture1.IsOpened())
{
Console.WriteLine("capture1");
// 循环读取视频帧并在图像控件中显示
while (!stopFlag)
{
Mat frameMat1 = capture1.RetrieveMat();
if (!frameMat1.Empty())
{
//Console.WriteLine("hello111222");
}
frameMatT1 = new Mat();
frameMat1.CopyTo(frameMatT1);
// 暂停线程
pauseSignal.WaitOne();
}
// 释放资源
capture1.Release();
}
}
catch (ThreadAbortException ex)
{
// 线程已被终止
}
}
}
public class Thread2Class : System.Windows.Window
{
// 第二个线程要执行的代码
public void Thread2Function()
{
// 在这里编写第二个线程要执行的代码
Console.WriteLine("Thread2Function");
}
}
namespace WpfApp1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
///
public partial class MainWindow : System.Windows.Window
{
private Thread1Class thread1Object; //线程1定义
private Thread2Class thread2Object; //线程2定义
private DispatcherTimer _timer11; //计时器定义
private int _count = 0; // 计时器已经运行的秒数
private bool _isPaused = false; // 标识计时器是否处于暂停状态
public MainWindow()
{
InitializeComponent();
timer11Init11();
}
private void timer11Init11()
{
// 创建一个新的计时器对象
_timer11 = new DispatcherTimer();
// 设置计时器间隔时间为1秒
_timer11.Interval = TimeSpan.FromSeconds(0.2);
// 订阅Tick事件,并将其处理程序设置为我们想要自动执行的函数
_timer11.Tick += new EventHandler(video_display11);
}
private void timerStart11(object sender, RoutedEventArgs e)
{
try
{
string buttonText = userPC.Content.ToString();
if (buttonText == "开始")
{
// 启动计时器
_timer11.Start();
Console.WriteLine("_timerStart");
userPC.Content = "暂停";
}
if (buttonText == "暂停")
{
// 如果计时器正在运行,则暂停计时器
if (_timer11.IsEnabled)
{
_timer11.Stop();
_isPaused = true;
}
userPC.Content = "恢复";
}
if (buttonText == "恢复")
{
// 如果计时器处于暂停状态,则恢复计时器
if (_isPaused)
{
_timer11.Start();
_isPaused = false;
}
userPC.Content = "暂停";
}
}
catch (ThreadAbortException ex)
{
// 线程已被终止
}
}
private void myPauseButton_Click(object sender, RoutedEventArgs e)
{
// 如果计时器正在运行,则暂停计时器
if (_timer11.IsEnabled)
{
_timer11.Stop();
_isPaused = true;
}
}
private void myResumeButton_Click(object sender, RoutedEventArgs e)
{
// 如果计时器处于暂停状态,则恢复计时器
if (_isPaused)
{
_timer11.Start();
_isPaused = false;
}
}
private void myStopButton_Click(object sender, RoutedEventArgs e)
{
// 停止计时器并重置计时器已运行的秒数
_timer11.Stop();
_count = 0;
timerLabel11.Content = "0";
}
//链接计时器
private void video_display11(object sender, EventArgs e)
{
try
{
Console.WriteLine("video_display");
if (thread1Object != null)
{
if (thread1Object.frameMatT1 != null)
{
Console.WriteLine("video_display0");
if (value != null && value.Rows > 0 && value.Cols > 0)
{
}
else
{
Console.WriteLine("video_close ");
}
}
}
_count++;
timerLabel11.Content = _count.ToString();
}
catch (ThreadAbortException ex)
{
// 线程已被终止
}
}
private void videoModel_init11(object sender, RoutedEventArgs e)
{
try
{
string buttonText = model_init11.Content.ToString();
if (buttonText == "模型初始化")
{
thread1Object = new Thread1Class();
thread1Object.RunThread();
Console.WriteLine("RunThread");
model_init11.Content = "暂停模型";
}
if (buttonText == "暂停模型")
{
model_init11.Content = "恢复模型";
thread1Object.PauseThread();
}
if (buttonText == "恢复模型")
{
model_init11.Content = "暂停模型";
thread1Object.ResumeThread();
}
}
catch (ThreadAbortException ex)
{
// 线程已被终止
}
}
private void videoModel_Stop11(object sender, RoutedEventArgs e)
{
try
{
thread1Object.StopThread();
}
catch (ThreadAbortException ex)
{
// 线程已被终止
}
}
} //class类结束
} //namespace结束
3. 走行結果
3. オンラインサポート:
動作環境のインストールやリモート デバッグが必要な場合は、 記事の下部にある個人用 QQ名刺を参照してください。専門および技術担当者がリモートでサポートします。 1) リモートインストールおよび操作環境、コードデバッグ2) Qt、C++、Python エントリーガイド3) インターフェース美化4) ソフトウェア制作
ブロガーおすすめ記事: Python 顔認識統計 QT フォーム - CSDN ブログ
ブロガーおすすめ記事: Python Yolov5 炎煙認識ソースコード共有 - CSDN ブログ
Python OpenCV は歩行者用入口に出入りする人の数を認識します - Python は人の数を認識します - CSDN ブログ
個人ブログ ホームページ: alicema1111 の blog_CSDN ブログ - Python、C++、Web ページ分野のブロガー
すべてのブロガーの記事はここをクリックしてください: alicema1111 の blog_CSDN ブログ - Python、C++、Web ページ分野のブロガー