zoukankan      html  css  js  c++  java
  • 不错的线程使用示例

    /// <copyright from='1997' to='2001' company='Microsoft Corporation'>
    ///    Copyright (c) Microsoft Corporation. All Rights Reserved.
    ///
    ///    This source code is intended only as a supplement to Microsoft
    ///    Development Tools and/or on-line documentation.  See these other
    ///    materials for detailed information regarding Microsoft code samples.
    ///
    /// </copyright>
    //------------------------------------------------------------------------------
    namespace Microsoft.Samples.Windows.Forms.Cs.ProgressBarCtl {
        using System;
        using System.Collections;
        using System.ComponentModel;
        using System.Drawing;
        using System.Windows.Forms;
        using System.Threading;

        // <doc>
        // <desc>
        //     This class demonstrates the ProgressBar control.
        //     The ProgressBar is updated periodically via another thread based on the
        //     settings in this control
        // </desc>
        // </doc>
        //
        public class ProgressBarCtl : System.Windows.Forms.Form {

            private System.ComponentModel.Container components;
            protected internal System.Windows.Forms.Label label3;
            protected internal System.Windows.Forms.Label lblCompleted;
            protected internal System.Windows.Forms.TrackBar sldrSpeed;
            protected internal System.Windows.Forms.ProgressBar progbar;
            protected internal System.Windows.Forms.Label label5;
            protected internal System.Windows.Forms.GroupBox grpBehavior;
            protected internal System.Windows.Forms.Label label4;
            protected internal System.Windows.Forms.Label label6;
            protected internal System.Windows.Forms.Label lblValue;
            protected internal System.Windows.Forms.ComboBox cmbStep;

            private int     iSleepTime ;
            private Thread  timedProgress ;

            public ProgressBarCtl() : base() {
                //
                // Required for Win Form Designer support
                //
                InitializeComponent();

                //
                // TODO: Add any constructor code after InitializeComponent call
                //
                iSleepTime = 100 ;
                cmbStep.SelectedIndex = 0 ;
                progbar.Step = 1 ;

            }

            protected override void OnLoad(EventArgs e) {
                // Spin off a new thread to update the ProgressBar control
                timedProgress = new Thread(new ThreadStart(TimedProgressProc));
                timedProgress.IsBackground = true;
                timedProgress.Start();
            }

            // <doc>
            // <desc>
            //     This code executes on the Windows.Forms thread.
            // </desc>
            // </doc>
            //
            private void UpdateProgress() {
                int min ;
                double numerator, denominator, completed ;

                //Reset to start if required
                if (progbar.Value == progbar.Maximum) {
                    progbar.Value = progbar.Minimum ;
                }
                else {
                    
                    progbar.PerformStep();
                }

                lblValue.Text = progbar.Value.ToString();

                min         = progbar.Minimum ;
                numerator   = progbar.Value - min ;
                denominator = progbar.Maximum - min ;
                completed   = (numerator / denominator) * 100.0 ;

                lblCompleted.Text = Math.Round(completed).ToString() + "%" ;
            }

            // <doc>
            // <desc>
            //     This function runs in the timedProgress thread and updates the
            //     ProgressBar on the form.
            // </desc>
            // </doc>
            //
            private void TimedProgressProc() {
                try {
                    MethodInvoker mi = new MethodInvoker(UpdateProgress);
                    while (true) {
                        Invoke(mi);
                        int iSleepTime = this.SleepTime;
                        Thread.Sleep(iSleepTime) ;
                    }
                }
                //Thrown when the thread is interupted by the main thread - exiting the loop
                catch (ThreadInterruptedException e) {
                    if (e != null) {}
                }
                catch (Exception we) {
                    if (we != null) {
                        MessageBox.Show(we.ToString());
                    }
                }
            }

            // <doc>
            // <desc>
            //     Property controlling the progress of the progress bar - used by the background thread
            // </desc>
            // </doc>
            //
            private int SleepTime {
                get {
                    lock(this) {
                        return iSleepTime ;
                    }
                }
                set {
                    lock(this) {
                        iSleepTime = value ;
                    }
                }
            }

            /// <summary>
            ///    Clean up any resources being used
            /// </summary>
            public override void Dispose() {
                /*
                 * We have to make sure that our thread doesn't attempt
                 * to access our controls after we dispose them.
                 */
                if (timedProgress != null) {
                    timedProgress.Interrupt();
                    timedProgress = null;
                }

                base.Dispose();
                components.Dispose();
            }

            protected void sldrSpeed_Scroll(object sender, EventArgs e) {
                TrackBar tb = (TrackBar) sender ;
                int time = 110 - tb.Value ;
                this.SleepTime = time ;
            }

            protected void cmbStep_SelectedIndexChanged(object sender, EventArgs e) {
                try {
                    progbar.Step = Int32.Parse((string)cmbStep.SelectedItem);
                }
                catch (Exception ex) {
                    // thrown if Int32.Parse can't convert
                    if (ex !=null) {}
                }
            }


            /// <summary>
            ///    Required method for Designer support - do not modify
            ///    the contents of this method with the code editor
            /// </summary>
            private void InitializeComponent() {
                this.lblValue = new System.Windows.Forms.Label();
                this.label4 = new System.Windows.Forms.Label();
                this.label5 = new System.Windows.Forms.Label();
                this.progbar = new System.Windows.Forms.ProgressBar();
                this.grpBehavior = new System.Windows.Forms.GroupBox();
                this.cmbStep = new System.Windows.Forms.ComboBox();
                this.label3 = new System.Windows.Forms.Label();
                this.sldrSpeed = new System.Windows.Forms.TrackBar();
                this.label6 = new System.Windows.Forms.Label();
                this.lblCompleted = new System.Windows.Forms.Label();
                this.grpBehavior.SuspendLayout();
                ((System.ComponentModel.ISupportInitialize)(this.sldrSpeed)).BeginInit();
                this.SuspendLayout();
                //
                // lblValue
                //
                this.lblValue.Location = new System.Drawing.Point(164, 93);
                this.lblValue.Name = "lblValue";
                this.lblValue.Size = new System.Drawing.Size(72, 18);
                this.lblValue.TabIndex = 4;
                //
                // label4
                //
                this.label4.Location = new System.Drawing.Point(20, 93);
                this.label4.Name = "label4";
                this.label4.Size = new System.Drawing.Size(288, 18);
                this.label4.TabIndex = 0;
                this.label4.Text = "Completion Speed:";
                //
                // label5
                //
                this.label5.Location = new System.Drawing.Point(31, 65);
                this.label5.Name = "label5";
                this.label5.Size = new System.Drawing.Size(143, 28);
                this.label5.TabIndex = 1;
                this.label5.Text = "Percent Completed:";
                //
                // progbar
                //
                this.progbar.BackColor = System.Drawing.SystemColors.Control;
                this.progbar.Location = new System.Drawing.Point(31, 28);
                this.progbar.Name = "progbar";
                this.progbar.Size = new System.Drawing.Size(245, 18);
                this.progbar.Step = 1;
                this.progbar.TabIndex = 0;
                this.progbar.Text = "progbar";
                //
                // grpBehavior
                //
                this.grpBehavior.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                                          this.cmbStep,
                                                                                          this.label3,
                                                                                          this.sldrSpeed,
                                                                                          this.label4});
                this.grpBehavior.Location = new System.Drawing.Point(317, 19);
                this.grpBehavior.Name = "grpBehavior";
                this.grpBehavior.Size = new System.Drawing.Size(318, 175);
                this.grpBehavior.TabIndex = 5;
                this.grpBehavior.TabStop = false;
                this.grpBehavior.Text = "ProgressBar";
                //
                // cmbStep
                //
                this.cmbStep.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
                this.cmbStep.DropDownWidth = 123;
                this.cmbStep.Items.AddRange(new object[] {
                                                             "1",
                                                             "5",
                                                             "10",
                                                             "20"});
                this.cmbStep.Location = new System.Drawing.Point(174, 28);
                this.cmbStep.Name = "cmbStep";
                this.cmbStep.Size = new System.Drawing.Size(123, 20);
                this.cmbStep.TabIndex = 7;
                this.cmbStep.SelectedIndexChanged += new System.EventHandler(this.cmbStep_SelectedIndexChanged);
                //
                // label3
                //
                this.label3.Location = new System.Drawing.Point(20, 28);
                this.label3.Name = "label3";
                this.label3.Size = new System.Drawing.Size(62, 18);
                this.label3.TabIndex = 6;
                this.label3.Text = "Step:";
                //
                // sldrSpeed
                //
                this.sldrSpeed.BackColor = System.Drawing.SystemColors.Control;
                this.sldrSpeed.Location = new System.Drawing.Point(20, 111);
                this.sldrSpeed.Maximum = 100;
                this.sldrSpeed.Minimum = 10;
                this.sldrSpeed.Name = "sldrSpeed";
                this.sldrSpeed.Size = new System.Drawing.Size(277, 42);
                this.sldrSpeed.TabIndex = 1;
                this.sldrSpeed.TabStop = false;
                this.sldrSpeed.Text = "trackBar1";
                this.sldrSpeed.TickFrequency = 10;
                this.sldrSpeed.Value = 10;
                this.sldrSpeed.Scroll += new System.EventHandler(this.sldrSpeed_Scroll);
                //
                // label6
                //
                this.label6.Location = new System.Drawing.Point(31, 93);
                this.label6.Name = "label6";
                this.label6.Size = new System.Drawing.Size(128, 18);
                this.label6.TabIndex = 3;
                this.label6.Text = "Value:";
                //
                // lblCompleted
                //
                this.lblCompleted.Location = new System.Drawing.Point(164, 65);
                this.lblCompleted.Name = "lblCompleted";
                this.lblCompleted.Size = new System.Drawing.Size(72, 18);
                this.lblCompleted.TabIndex = 2;
                //
                // ProgressBarCtl
                //
                this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
                this.ClientSize = new System.Drawing.Size(647, 202);
                this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                              this.grpBehavior,
                                                                              this.lblValue,
                                                                              this.label6,
                                                                              this.lblCompleted,
                                                                              this.label5,
                                                                              this.progbar});
                this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
                this.MaximizeBox = false;
                this.MinimizeBox = false;
                this.Name = "ProgressBarCtl";
                this.Text = "ProgressBar";
                this.Load += new System.EventHandler(this.ProgressBarCtl_Load);
                this.grpBehavior.ResumeLayout(false);
                ((System.ComponentModel.ISupportInitialize)(this.sldrSpeed)).EndInit();
                this.ResumeLayout(false);

            }


            // The main entry point for the application.
            [STAThread]
            public static void Main(string[] args) {
                Application.Run(new ProgressBarCtl());
            }

            private void ProgressBarCtl_Load(object sender, System.EventArgs e)
            {

            }

        }

    }
  • 相关阅读:
    BoundsChecker使用
    完成端口(Completion Port)详解
    VC内存泄露检查工具:VisualLeakDetector
    AcceptEx函数与完成端口的结合使用例子
    IOCP之accept、AcceptEx、WSAAccept的区别
    Visual C++ 6.0安装
    eclipse中在线安装FindBugs
    几种开源SIP协议栈对比
    全情投入是做好工作的基础——Leo鉴书39
    CheckStyle检查项目分布图
  • 原文地址:https://www.cnblogs.com/zhuor/p/308979.html
Copyright © 2011-2022 走看看