C# 关于队列的应用

这篇具有很好参考价值的文章主要介绍了C# 关于队列的应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当接收到硬件设备传来的数据队列时,比如拍到的一幅幅照片,需要按顺序调用识别模块时,就需要用队列来缓存调用的方法。示例代码如下:

  bool isCanShiBie = true, isStartThread=true;
        static Queue<Action> queue = new Queue<Action>(); // 创建一个线程安全的队列
        private void button1_ClickAsync(object sender, EventArgs e)
        {
            if (isStartThread)
            {
                // 创建并启动一个消费者线程来处理队列中的任务
                Thread consumerThread = new Thread(ProcessQueue);
                consumerThread.Start();
                isStartThread = false;
            }
            // 将任务添加到队列中
            EnqueueTask(ShiBie);
            //Thread td = new Thread(ShiBie);
            //td.IsBackground = true;
            //td.Start();
            //  ShiBie();
            // 在线程中调用异步方法
         //   ThreadPool.QueueUserWorkItem( ShiBie, 1);
            //Thread thread = new Thread(() =>
            //{
            //    Task task = Task.Run(async () => await ShiBie()); // 使用Task.Run包装异步方法
            //    isCanShiBie = true;                                             // int result = task.Result; // 等待异步操作完成并获取结果
            //                                                                              //  Console.WriteLine(result); // 处理结果
            //});
            //thread.IsBackground = true;
            //thread.Start();
        }
        static void EnqueueTask(Action task)
        {
            lock (queue)
            {
                queue.Enqueue(task);
            }
        }
        bool isProcessQueue = true;
         void ProcessQueue()
        {
            while (isProcessQueue)
            {
                Action task = null;

                lock (queue)
                {
                    if (queue.Count > 0&& isCanShiBie )
                    {
                        task = queue.Dequeue();
                    }
                }

                if (task != null)
                {
                    isCanShiBie = false;
                    task();
                }

                Thread.Sleep(10);
            }
        }
        string img_id = "20230608001";
        int i = 0;
        public class ResultWithError<T>
        {
            public T Result { get; set; }
            public byte[] Error { get; set; }
        }

        public async Task<ResultWithError<int>> CallCppDllAsync(IntPtr imgId, IntPtr image, int width, int height, int step)
        {
            try
            {
                

                return await Task.Run(() =>
                {

                    byte[] error = new byte[1024 * 5];
                    int result = recogCell_mat_nopath(imgId, image, width, height, step, ref error[0]);
                    return new ResultWithError<int> { Result = result, Error = error };
                });
            }
            catch (Exception ex)
            {
                Loger loger = new Loger();
                loger.WriteLog("recogCell_mat_nopath异常");
                loger.WriteLog(ex.ToString());
                return new ResultWithError<int> { Result = -1, Error = null };
            }

        }
        private async void ShiBie()
        {
            try
            {
               // byte[] error = new byte[1024 * 5];
                int stride = 0;
                Bitmap bmp = new Bitmap("C.jpg");
                System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height);
                System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);

                System.Drawing.Imaging.PixelFormat pf = bmp.PixelFormat;
                if (pf == System.Drawing.Imaging.PixelFormat.Format32bppArgb)
                {
                    stride = bmp.Width * 4;
                }
                else
                {
                    stride = bmp.Width * 3;
                }
                i++;
                // Image<Bgra, byte> im = new Image<Bgra, byte>(bmp.Width, bmp.Height, stride, (IntPtr)bmpData.Scan0);
                img_id = img_id.Substring(0,10) + $"_{i}";

                 IntPtr ptrIn = Marshal.StringToHGlobalAnsi(img_id);
                  int result = 0;
                //  IntPtr ptrRet =(IntPtr) 0;
                this.Invoke(new Action(() =>
                {
                    //listboxInfo.
                    listboxInfo.AppendText(DateTime.Now.ToString("G")+" "+img_id + "开始--------------");
                    listboxInfo.AppendText("\r\n");
                    // 创建 Stopwatch 实例
                   

                }));
                Stopwatch stopwatch = new Stopwatch();

                // 启动计时器
                stopwatch.Start();

                isCanShiBie = false;
                var resultT = await CallCppDllAsync(ptrIn, (IntPtr)bmpData.Scan0, bmp.Width, bmp.Height, 3);
                result = resultT.Result;
                 byte[]  error = resultT.Error;
                isCanShiBie = true;
                  //  result = recogCell_mat_nopath(ptrIn, (IntPtr)bmpData.Scan0, bmp.Width, bmp.Height, 3, ref error[0]);
                    stopwatch.Stop();
                
             
               
                var s = "";
             //   DetectImage(im_ptr, size.Width, size.Height, step, ref error[0]);
                s = Encoding.UTF8.GetString(error);
                if (true||result ==0)
                {
                    dynamic model = JObject.Parse(s);
                   
                    this.Invoke(new Action(() =>
                    {
                        //listboxInfo.
                        // 获取经过的时间
                        TimeSpan elapsed = stopwatch.Elapsed;
                        listboxInfo.AppendText(DateTime.Now.ToString("G") + " " + model.img_id + $"结束---{elapsed.Seconds}s{elapsed.Milliseconds}ms-----------result:" + result);
                        listboxInfo.AppendText("\r\n");


                    }));
                    // 重置计时器以便下次使用
                  //  stopwatch.Reset();
                    return;
                    var s2 = "";
                    //  DetectImage_img(im_ptr, size.Width, size.Height, step, ref error[0]);
                    s2 = Encoding.UTF8.GetString(error);
                    bmp.UnlockBits(bmpData);
                    bmp.Dispose();
                    this.Invoke(new Action(() =>
                    {
                    //listboxInfo.
                        listboxInfo.AppendText(s2);
                        listboxInfo.AppendText("\r\n");
                        listboxInfo.AppendText("img_id=" + model.img_id);
                        listboxInfo.AppendText("\r\n");
                        foreach (var item in model.lables)
                        {
                            listboxInfo.AppendText("types=" + item.types);
                            listboxInfo.AppendText("\r\n");
                            listboxInfo.AppendText("scores=" + item.scores);
                            listboxInfo.AppendText("\r\n");
                            int i = 0;
                            string grid = string.Join(",", item.grid_corners);
                            int l = grid.Length;
                            listboxInfo.AppendText($"grid_corners=" + string.Join(",", item.grid_corners));
                            listboxInfo.AppendText("\r\n");
                            foreach (var item2 in item.grid_corners)
                            {
                                listboxInfo.AppendText($"grid_corners{i}=" + item2);
                                listboxInfo.AppendText("\r\n");
                                i++;
                            }
                        }
                        listboxInfo.AppendText("\r\n");
                    // listboxInfo.Items.Add(model.lables.grid_corners);
                    // listboxInfo.Items.Add(model.lables[0].types);
                    // listboxInfo.Items.Add(model.lables.scores);

                    }));
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

注意关闭程序时,将isProcessQueue=false,让线程自己关闭,不会出现异常。文章来源地址https://www.toymoban.com/news/detail-514711.html

到了这里,关于C# 关于队列的应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# tcp客户端字符串(图片名称)+ 图片数据打包,发送到服务端;服务端接收到数据后解析数据包

    在C#中,要将字符串和图片数据打包发送到服务端,并在服务端解析这些数据,可以按照以下步骤进行: 客户端打包数据 1、创建一个自定义的数据结构来保存字符串和图片数据。 2、将字符串转换为字节数组。 3、将图片数据转换为字节数组。 4、将字符串和图片数据的字节

    2024年01月20日
    浏览(39)
  • linux tcpdump能抓到包但是应用程序不能收到包

            在网络编程项目中会遇到各种各样的网络问题,原因往往是多种多样的,在网上不会找到一个满意的答案;因此需要自己拥有一定分析问题的能力;         其中一个问题是:linux系统;tcpdump命令能抓到过来的数据包,可是应用程序的recvfrom等套接字接收函数

    2024年02月02日
    浏览(36)
  • Java在物联网领域的应用非常广泛,涵盖了设备连接、数据处理、应用程序开发、安全性、嵌入式系统开发、消息队列和流处理、机器学习和人工智能以及跨平台和多语言集成等方面

    Java作为一种通用编程语言,在物联网(IoT)领域的应用也非常广泛。以下是一些Java在物联网中的典型应用: 开发物联网应用程序 :Java是一种高级编程语言,具有丰富的库和工具,使得开发物联网应用程序变得容易。Java可以用于开发各种物联网应用程序,如智能家居、智能

    2024年02月03日
    浏览(52)
  • 局域网的硬件设备

    目录 前言 1.网卡 2.集线器 3.网络传输介质           组成小型局域网的主要硬件设备有 网卡、 集线器 等 网络传输介质 和 交换机、 网桥、 路由器、 网关 等网络互连设备。用集线器组成的网络称为共享式网络,而用交换机组成的网络称为交换式网络。         

    2024年02月12日
    浏览(33)
  • 搞定企业视频直播:硬件设备、直播网络环境和设备连接说明

     阿酷TONY  / 2022-11-22  / 原创  /  长沙  /  目录 1.直播硬件设备 2.直播网络环境 3.直播设备连接 ├─A.双机位摄像机视频直播场景 └─B.单机位摄像机视频直播场景 4.摄像机设备/摄像机采集画面直播 ├─直播形式1:常见的拍摄画面直播 ├─直播形式2:绿幕扣图形式直播

    2023年04月09日
    浏览(40)
  • 【Android Framework (十二) 】- 智能硬件设备开发

    针对我过往工作经历,曾在一家智能科技任职Android开发工程师,简单介绍下关于任职期间接触和开发过的一些项目经历,智能多与物联网(LOT)进行联系,从对Android智能硬件一无所知到现在算是略有小成,期间踩了很多坑,也接触到了许多非Android方面的知识,现用文章的方

    2024年02月12日
    浏览(26)
  • Windows无法启动这个硬件设备(代码19)怎么办?

    在我们使用电脑的过程中,遇到“由于其配置信息(注册表中的)不完整或已损坏,Windows无法启动这个硬件设备(代码19)”的提示时该如何解决呢? 当您的某些计算机设备无法正常使用,并且设备状态显示“由于其配置信息(注册表中的)不完整或已损坏,Windows无法启动这个硬

    2024年02月04日
    浏览(33)
  • 监测服务器硬件设备运行状况的软件 - wgcloud

    WGCLOUD是一款开源免费的运维平台,具有轻量,高效,性能稳定,部署简单,上手容易等特点 WGCLOUD可以监测服务器的cpu,内存,磁盘,负载,磁盘,缓存,网络流量,系统信息,温度,硬盘健康等指标数据,这些都不要做配置,默认自动监控 WGCLOUD的版本更新非常活跃,几乎

    2024年02月02日
    浏览(50)
  • 关于手机Camera的硬件电路知识

    前阶段,小白教同事测了些Camere的基本功耗。正愁不知道写什么的小白,突然想到了素材,于是乎便趁着周末雷雨天宅家之际,写一篇关于手机Camere的硬件文章。 关于Camera,景物通过镜头生成光学图像投射到图像传感器表面上,然后光信号转换为模拟的电信号,经过A/D(模数

    2024年02月10日
    浏览(29)
  • 【Java】智慧工地云SaaS源码,AI服务器、硬件设备讲解视频

    智慧工地是指运用信息化手段,通过三维设计平台对工程项目进行精确设计和施工模拟,围绕施工过程管理,建立互联协同、智能生产、科学管理的施工项目信息化生态圈,并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析,提供过程趋势预测及专家

    2024年02月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包