VS+C#+WPF マルチスレッドビデオカメラプレーヤーモニタリング

注目のプログラム例

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 ページ分野のブロガー

おすすめ

転載: blog.csdn.net/alicema1111/article/details/131227768
おすすめ