VS+C#+WPF多线程视频摄像头播放器监控

简介: VS+C#+WPF多线程视频摄像头播放器监控
程序示例精选
VS+C#+WPF多线程视频摄像头播放器监控
如需安装运行环境或远程调试,可点击
博主头像进入个人主页查看博主联系方式,由专业技术人员远程协助!

前言

这篇博客针对《VS+C#+WPF多线程视频摄像头播放器监控》编写代码,代码整洁,规则,易读。 学习与应用推荐首选。

运行结果

文章目录

一、所需工具软件
二、使用步骤
1. 主要代码
2. 运行结果

三、在线协助

一、所需工具软件

1. VS2019, C++
2. WPF

二、使用步骤

代码如下(示例):

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结束

运行结果

三、在线协助:

如需安装运行环境或远程调试,可点击博主头像,进入个人主页查看博主联系方式,由专业技术人员远程协助!

1)远程安装运行环境,代码调试
2)Visual Studio, Qt, C++, Python编程语言入门指导
3)界面美化
4)软件制作

博主个人主页:https://developer.aliyun.com/profile/expert/rfnzgp3sk3ahc
博主所有文章点这里:https://developer.aliyun.com/profile/expert/rfnzgp3sk3ahc
博主联系方式点这里:https://developer.aliyun.com/profile/expert/rfnzgp3sk3ahc
相关文章
|
4月前
|
编解码 数据安全/隐私保护 计算机视觉
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
如何使用OpenCV进行同步和异步操作来打开海康摄像头,并提供了相关的代码示例。
180 1
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
|
2月前
|
安全 Java 程序员
ArrayList vs Vector:一场线程安全与性能优化的世纪之争!
在 Java 面试中,ArrayList 和 Vector 是高频考点,但很多人容易混淆。本文通过10分钟深入解析它们的区别,帮助你快速掌握性能、线程安全性、扩容机制等核心知识,让你轻松应对面试题目,提升自信!
65 18
|
3月前
|
Prometheus 监控 Cloud Native
JAVA线程池监控以及动态调整线程池
【10月更文挑战第22天】在 Java 中,线程池的监控和动态调整是非常重要的,它可以帮助我们更好地管理系统资源,提高应用的性能和稳定性。
265 64
|
2月前
|
存储 监控 算法
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
|
2月前
|
存储 缓存 Oracle
Java线程池,白话文vs八股文,原来是这么回事!
本文介绍了Java线程池的原理、实现方式及相关参数。首先,通过类比公司员工的方式解释了线程池的核心概念,如核心线程、最大线程数、任务队列和拒绝策略。接着,详细描述了线程池的任务处理流程,并提供了使用`ThreadPoolExecutor`和`Executors`创建线程池的代码示例,强调了`ThreadPoolExecutor`的灵活性和`Executors`的局限性。最后,总结了线程池的相关参数及不同类型的线程池实现,并附带常见面试题及其解答,帮助读者全面理解线程池的应用场景和优化方法。
56 4
|
3月前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
135 38
|
3月前
|
Prometheus 监控 Cloud Native
在 Java 中,如何使用线程池监控以及动态调整线程池?
【10月更文挑战第22天】线程池的监控和动态调整是一项重要的任务,需要我们结合具体的应用场景和需求,选择合适的方法和策略,以确保线程池始终处于最优状态,提高系统的性能和稳定性。
572 2
|
4月前
|
监控 数据可视化 Java
如何使用JDK自带的监控工具JConsole来监控线程池的内存使用情况?
如何使用JDK自带的监控工具JConsole来监控线程池的内存使用情况?
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
本文介绍了在C# WPF应用程序中引入外部iconfont图标时可能遇到的显示问题及其解决方法:1) 检查资源路径和引入格式是否正确,确保字体文件引用格式为“#xxxx”,并正确指向字体文件位置;2) 确保图标资源被包含在程序集中,通过设置字体文件的生成操作为Resource(资源)来实现。
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
|
5月前
|
编解码 C# 数据库
C# + WPF 音频播放器 界面优雅,体验良好
【9月更文挑战第18天】这是一个用 C# 和 WPF 实现的音频播放器示例,界面简洁美观,功能丰富。设计包括播放/暂停按钮、进度条、音量控制滑块、歌曲列表和专辑封面显示。功能实现涵盖音频播放、进度条控制、音量调节及歌曲列表管理。通过响应式设计、动画效果、快捷键支持和错误处理,提升用户体验。可根据需求扩展更多功能。
189 3