多线程笔记

 

讲述多线程的文章,C#多线程操作方法:http://developer.51cto.com/art/200908/147771.htm

 

 

线程点滴:http://blog.youkuaiyun.com/gisfarmer/archive/2009/03/09/3973472.aspx

 

http://www.cnblogs.com/yizhu2000/archive/2008/01/03/1011958.html

 

线程池:

ThreadPool.QueueUserWorkItem(w, 1.0);
ThreadPool.QueueUserWorkItem(w, 2.0);

ThreadPool.QueueUserWorkItem(w, 3.0);
ThreadPool.QueueUserWorkItem(w, 4.0);

public static void Calculate(double Diameter)
{
return Diameter * Math.PI;

 

异步代理

 

public partial class Form1 : Form
    {
        //声明代理类型
        delegate void delegateTest(int p);
        //为代理类型创建新的实例
        private delegateTest test=null;
        //为了不影响界面响应,需要新建一个线程
        Thread th = null;
        public Form1()
        {
            InitializeComponent();
            //为线程初始化
            th = new Thread(new ThreadStart(run));
            //初始化代理实例
            test = new delegateTest(testD);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //方法通过调用线程开始
            th.Start();
        }
        /// <summary>
        /// 实际进行循环操作的函数
        /// </summary>
        void run()
        {
            for (int i = 0; i <= 100; i++)
            {
                ///每次需要长时间处理的过程
                Thread.Sleep(100);
                //调用代理的方法
                this.Invoke(test, i);
            }
        }
        /// <summary>
        /// 处理界面元素显示进度
        /// </summary>
        /// <param name="p"></param>
        void testD(int p)
        {
            //处理界面元素显示进度
            progressBar1.Value = p;
            label1.Text = p+"%";
        }

        private void stop_Click(object sender, EventArgs e)
        {
            th.Abort();
            this.Invoke(test, 0);
        }
    }

 

二:

 

class Program
  {
    private delegate void TestHandler(out int i);

    private static void Test(out int i)
    {
      Thread.Sleep(1000);
      i = 10;
    }

    private static void CallBack(IAsyncResult ar)
    {
      int i;
      (ar.AsyncState as TestHandler).EndInvoke(out i, ar);
      Console.WriteLine(i);
    }

    public static void Main()
    {
      int i;
      TestHandler t = new TestHandler(Test);

      // 1. CallBack
      //IAsyncResult ar = t.BeginInvoke(out i, new AsyncCallback(CallBack), t);

      // 2. EndInvoke
      //IAsyncResult ar = t.BeginInvoke(out i, null, null);
      //t.EndInvoke(out i, ar);
      //Console.WriteLine(i);

      // 3. WaitOne
      //IAsyncResult ar = t.BeginInvoke(out i, null, null);
      //ar.AsyncWaitHandle.WaitOne();
      //t.EndInvoke(out i, ar);
      //Console.WriteLine(i);

      // 4. for wait
      IAsyncResult ar = t.BeginInvoke(out i, null, null);
      while (!ar.IsCompleted) { Thread.Sleep(10); }
      t.EndInvoke(out i, ar);
      Console.WriteLine(i);

      Console.WriteLine("Press Enter key to exit...");
      Console.ReadLine();
    }
  }

来自 http://www.cnblogs.com/yizhu2000/archive/2008/01/03/1011958.html#b4

一)使用Thread类

ThreadStart threadStart = new  ThreadStart(Calculate); // 通过ThreadStart委托告诉子线程讲执行什么方法,这里执行一个计算圆周长的方法
Thread thread = new  Thread(threadStart);
thread.Start();  // 启动新线程

public   void  Calculate() {
double Diameter=0.5;
Console.Write("The perimeter Of Circle with a Diameter of {0} is {1}"Diameter,Diameter*Math.PI);
}

 

二)使用Delegate.BeginInvoke

delegate   double  CalculateMethod( double  Diameter);  // 申明一个委托,表明需要在子线程上执行的方法的函数签名
static  CalculateMethod calcMethod  =   new  CalculateMethod(Calculate); // 把委托和具体的方法关联起来
static   void  Main( string [] args)
{
// 此处开始异步执行,并且可以给出一个回调函数(如果不需要执行什么后续操作也可以不使用回调)
calcMethod.BeginInvoke( 5 ,  new  AsyncCallback(TaskFinished),  null );
Console.ReadLine();
}

// 线程调用的函数,给出直径作为参数,计算周长
public   static   double  Calculate( double  Diameter)
{
     return  Diameter  *  Math.PI;
}

// 线程完成之后回调的函数
public   static   void  TaskFinished(IAsyncResult result)
{
     double  re  =   0 ;
    re  =  calcMethod.EndInvoke(result);
    Console.WriteLine(re);
}

三)使用ThreadPool.QueueworkItem

WaitCallback w  =   new  WaitCallback(Calculate);
// 下面启动四个线程,计算四个直径下的圆周长
ThreadPool.QueueUserWorkItem(w,  1.0 );
ThreadPool.QueueUserWorkItem(w,  2.0 );
ThreadPool.QueueUserWorkItem(w,  3.0 );
ThreadPool.QueueUserWorkItem(w,  4.0 );
public   static   void  Calculate( double  Diameter)
{
return Diameter * Math.PI;
}

标题中提及的“BOE-B2-154-240-JD9851-Gamma2.2_190903.rar”标识了一款由京东方公司生产的液晶显示单元,属于B2产品线,物理规格为154毫米乘以240毫米,适配于JD9851型号设备,并采用Gamma2.2标准进行色彩校正,文档生成日期为2019年9月3日。该压缩文件内包含的代码资源主要涉及液晶模块的底层控制程序,采用C/C++语言编写,用于管理显示屏的基础运行功能。 液晶模块驱动作为嵌入式系统的核心软件组成部分,承担着直接操控显示硬件的任务,其关键作用在于通过寄存器读写机制来调整屏幕的各项视觉参数,包括亮度、对比度及色彩表现,同时负责屏幕的启动与关闭流程。在C/C++环境下开发此类驱动需掌握若干关键技术要素: 首先,硬件寄存器的访问依赖于输入输出操作,常借助内存映射技术实现,例如在Linux平台使用`mmap()`函数将寄存器地址映射至用户内存空间,进而通过指针进行直接操控。 其次,驱动需处理可能产生的中断信号,如帧缓冲区更新完成事件,因此需注册相应的中断服务例程以实时响应硬件事件。 第三,为确保多线程或进程环境下共享资源(如寄存器)的安全访问,必须引入互斥锁、信号量等同步机制来避免数据竞争。 第四,在基于设备树的嵌入式Linux系统中,驱动需依据设备树节点中定义的硬件配置信息完成初始化与参数设置。 第五,帧缓冲区的管理至关重要,驱动需维护该内存区域,保证图像数据准确写入并及时刷新至显示面板。 第六,为优化能耗,驱动应集成电源管理功能,通过寄存器控制实现屏幕的休眠与唤醒状态切换。 第七,针对不同显示设备支持的色彩格式差异,驱动可能需执行色彩空间转换运算以适配目标设备的色彩输出要求。 第八,驱动开发需熟悉液晶显示控制器与主处理器间的通信接口协议,如SPI、I2C或LVDS等串行或并行传输标准。 最后,完成代码编写后需进行系统化验证,包括基础显示功能测试、性能评估及异常处理能力检验,确保驱动稳定可靠。 该源代码集合为深入理解液晶显示控制原理及底层驱动开发实践提供了重要参考,通过剖析代码结构可掌握硬件驱动设计的具体方法与技术细节。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值