1,WPF应用程序为单线程模型(STAThread),所有UI控件都是主线程创建的,只有主线程能操作UI元素的显示。

2,其他工作线程要维护UI控件的显示,需调用主线程的Dispather,执行Invoke(同步)或BeginInvoke(异步)方法。

3,UI线程如时行耗时的操作,将使UI假死,用户体验较差。应使用后台线程进行耗时操作,并异步更新UI。

4,BackgroundWorker是WPF的一个后台工作类,代码说明一切:

前台:

    <StackPanel>
        <ProgressBar Name="progressBar" Height="20" Width="200" Margin="10"></ProgressBar>
        <Button Name="btnProcess" Width="100" Click="btnProcess_Click" Margin="5">开始后台任务</Button>
        <Button Name="btnCancel" Width="100" Click="btnCancel_Click" Margin="5">取消后台任务</Button>
    </StackPanel>

后台:

 public partial class MainWindow : Window
    {
        BackgroundWorker bgWorker = new BackgroundWorker();
        public MainWindow()
        {
            InitializeComponent();

            bgWorker.WorkerReportsProgress = true;
            bgWorker.WorkerSupportsCancellation = true;
            bgWorker.DoWork += DoWork_Handler;
            bgWorker.ProgressChanged += ProgressChanged_Handler;
            bgWorker.RunWorkerCompleted += RunWorkerCompleted_Handler;
        }

        private void btnProcess_Click(object sender, RoutedEventArgs e)
        {
            if (!bgWorker.IsBusy)
            {
                bgWorker.RunWorkerAsync();
            }
        }

        private void ProgressChanged_Handler(object sender, ProgressChangedEventArgs args)
        {
               progressBar.Value = args.ProgressPercentage;
           
        }

        //后台线程运行的程序
        private void DoWork_Handler(object sender, DoWorkEventArgs args)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            for (int i = 1; i <= 100; i++)
            {
                if (worker.CancellationPending)
                {
                    args.Cancel = true;
                    break;
                }
                else
                {
                    worker.ReportProgress(i);

                    //因为这在后台线程,要想直接修改UI控件,需用Invoke或BeginInvoke方法
                    //this.Dispatcher.Invoke(new Action(() =>
                    //{
                    //    progressBar.Value = i;
                    //}));

                    Thread.Sleep(100);  //因为频繁调用UI线程,为了给UI线程反应时间,这里让后台线程稍顿一下
                }
            }

        }

        private void RunWorkerCompleted_Handler(object sender, RunWorkerCompletedEventArgs args)
        {
            progressBar.Value = 0;
            if (args.Cancelled)
            {
                MessageBox.Show("后台任务已经被取消。", "消息");
            }
            else
            {
                MessageBox.Show("后台任务正常结束。", "消息");
            }
        }
        private void btnCancel_Click(object sender, RoutedEventArgs e)
        {
            bgWorker.CancelAsync();
        }
    }

 

posted @ 2017-03-14 10:21 sekon 阅读(1421) 评论(0) 推荐(0) 编辑
摘要: 1,引用mshtml.dll 2,获取元素属性值 3,取表单控件 4,填写表单控件 5,点击按钮 6,执行js脚本 方法1: 方法2: 7,屏蔽alert、confirm等,通过重定义实现 8,接收js消息 阅读全文
posted @ 2017-03-07 23:45 sekon 阅读(8926) 评论(0) 推荐(1) 编辑
摘要: HTTPS协议握手过程: 1,客户端明文请求,把自己支持的非对称加密算法(用于使用CA证书公钥加密计算生成协商密钥的随机数per_master)、对称加密算法(用于以后使用协商密钥加密传输内容)、验证数据完整性的HASH算法、随机数Random_C发给服务器。 2,服务器发回客端的明文信息,包含选择 阅读全文
posted @ 2017-03-03 23:28 sekon 阅读(719) 评论(0) 推荐(0) 编辑
摘要: https加密通信原理: 公钥私钥成对,公钥公之于众,私钥只有自己知道。 用公钥加密的信息只能由与之相对应的私钥解密。 甲给乙发送数据时,甲先用乙的公钥加密这段数据,再用自己的私钥对这段数据的特征数据(数字指纹,通过HASH函数生成)进行RSA运算形成签名。乙接到数据后,先用自己的私钥解密数据,并用 阅读全文
posted @ 2017-03-03 17:57 sekon 阅读(488) 评论(0) 推荐(0) 编辑
摘要: 硬件组成: REGBANK是LCD控制寄存器组,含17个寄存器及一块256*16的调色板,用来设置参数。 LCDCDMA中有两个FIFO,当FIFO空或数据减少到阈值,自动发起DMA传输,从内存获取图像数据,不需CPU干涉。 VIDPRCS将LCDCDMA中的数据组成特定格式,从VD[23:0]发送 阅读全文
posted @ 2017-03-02 09:52 sekon 阅读(694) 评论(0) 推荐(0) 编辑
摘要: s3c2440包含三个通用异步收发器,可工作于中断模式或DMA模式。每个UART包含两个64字节的FIFOs用于接收和发送数据。可编程设置波特率、1或2个停止位,5/6/7/8个数据位和奇偶校验状态。 串口线一般是3条,TxD,RxD,Gnd,即发送线,接收线和地线。 数据传送之前,UART之间约定 阅读全文
posted @ 2017-02-27 00:12 sekon 阅读(772) 评论(0) 推荐(0) 编辑
摘要: s3c2440有60个中断源(其中15个为子中断源)。 31个32位的通用寄存器,6个程序状态寄存器。有6种工作模式(系统/用户模式,快中断模式,管理模式,数据访问中止模式,中断模式,未定指令中止模式)。每种模式都有16个通用寄存器和1(或2)个程序状态寄存器。 R15(pc)是程序计数器,R14( 阅读全文
posted @ 2017-02-26 23:11 sekon 阅读(933) 评论(0) 推荐(0) 编辑
摘要: s3c2440 CPU内置NAND FLASH控制器。相关寄存大器起始地址为0x4e000000。 通过设置NFCONF寄存器,设置NAND FLASH 时序。 通过设置NFCONT寄存器,使能NAND FLASH、初始化ECC等。 代码: #define GSTATUS1 (*(volatile 阅读全文
posted @ 2017-02-26 00:30 sekon 阅读(945) 评论(0) 推荐(0) 编辑
摘要: s3c2440可使用地址空间为1GB(0x00000000到0x40000000)。 1G空间分为8个BANK,每个BANK为128MB。 设27条地址线,和8个片选引脚(nGCS0-nGCS7)。 内存控制器根据地址所在的BANK,自动决定要使用的片选引脚,以使能相应的BANK所连接的设备。 32 阅读全文
posted @ 2017-02-25 23:34 sekon 阅读(508) 评论(0) 推荐(0) 编辑
摘要: 内存管理分别页表机制和内存分配机制两块。 页表机制就是管理设备真实物理地址与虚拟地址的动态或静态的映射,基于cpu内部的mmu(内存管理单元)进行。 CP15(协处理器)的C0(缓存)是一级页表,含4096个索引(每索引4字节,共16K)。 每个索引项代表1MB地址空间,4096*1MB=4GB=3 阅读全文
posted @ 2017-02-25 15:53 sekon 阅读(369) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示