zoukankan      html  css  js  c++  java
  • c#信号量手动多线程

    代码

        private void CreatThread(int type)
            {
    
                List<int> indexs = new List<int>();
                this.Invoke(new MethodInvoker(delegate
                {
                    开始ToolStripMenuItem.Enabled = false;
                    从选中执行ToolStripMenuItem.Enabled = false;
                    只执行选中ToolStripMenuItem.Enabled = false;
                    buttonItem_Start.Enabled = false;
                    SysVar.VcodeType = comboBoxEx_vcodeType.SelectedIndex;
                    switch (type)
                    {
                        case 0:
                            for (int i = 0; i < dataGridViewX1.Rows.Count; i++)
                            {
                                indexs.Add(i);
                            }
                            break;
                        case 1:
                            int selectNow = dataGridViewX1.CurrentCell.RowIndex;
                            for (int i = 0; i < dataGridViewX1.Rows.Count - selectNow; i++)
                            {
                                indexs.Add(i + selectNow);
                            }
                            break;
                        case 2:
                            for (int i = 0; i < dataGridViewX1.SelectedRows.Count; i++)
                            {
                                indexs.Add(dataGridViewX1.SelectedRows[i].Index);
                            }
                            break;
                        default:
                            break;
                    }
                }));
                //等待变量
                int stopNum = 0;
                int adslNum = 0;
    
                List<Thread> ths = new List<Thread>();
                j_semaphore = new Semaphore(Convert.ToInt32(integerInput_ThreadNum.Value), Convert.ToInt32(integerInput_ThreadNum.Value), "MySemaphore");
                for (int i = 0; i < indexs.Count; i++)
                {
    
                    if (SysVar.manualResetEvent.WaitOne(0) == true)
                    {
                        break;
                    }
                    j_semaphore.WaitOne();
                    int j = indexs[i];
                    Thread th = new Thread(new ThreadStart(delegate
                    {
                        WorkSemaphore(j);
                    }));
                    th.IsBackground = true;
                    th.Start();
                    ths.Add(th);
                    if (Convert.ToInt32(integerInput_AdslNum.Value) > 0)
                    {
                        adslNum += 1;
                        if (adslNum >= Convert.ToInt32(integerInput_AdslNum.Value))
                        {
                            WaitAll(ref ths);
                            AdslDB();
                            adslNum = 0;
                        }
    
                    }
                    if (Convert.ToInt32(integerInput_StopNum.Value) > 0)
                    {
                        stopNum += 1;
                        if (stopNum >= Convert.ToInt32(integerInput_StopNum.Value))
                        {
                            WaitAll(ref ths);
                            for (int n = 0; n < Convert.ToInt32(integerInput_StopTime.Value); n++)
                            {
                                Thread t = new Thread(o => Thread.Sleep(1000));
                                t.Start(this);
                                while (t.IsAlive)
                                {
                                    Application.DoEvents();
                                }
                            }
                            stopNum = 0;
                        }
    
                    }
                }
                WaitAll(ref ths);
                j_semaphore.Close();
                this.Invoke(new EventHandler(delegate
                {
                    开始ToolStripMenuItem.Enabled = true;
                    从选中执行ToolStripMenuItem.Enabled = true;
                    只执行选中ToolStripMenuItem.Enabled = true;
                    buttonItem_Start.Enabled = true;
                }));
    
            }
            private void WaitAll(ref List<Thread> ths)
            {
                //投递完毕,等待线程完成!
                for (int i = 0; i < ths.Count; i++)
                {
                    while (ths[i].ThreadState != System.Threading.ThreadState.Stopped)
                    {
                        Application.DoEvents();
                    }
                }
                ths.Clear();
            }
  • 相关阅读:
    Ext4文件系统架构分析(二)
    Ext4文件系统架构分析(一)
    STL容器与拷贝构造函数
    左值、右值与右值引用
    C++ 11右值引用
    读书笔记_Effective_C++_条款二十五: 考虑写出一个不抛出异常的swap函数
    《Effective C++》item25:考虑写出一个不抛异常的swap函数
    CC++ vector 构造函数 & 析构函数
    复制构造函数 与 赋值函数 的区别
    a++与++a
  • 原文地址:https://www.cnblogs.com/wangyinlon/p/11543436.html
Copyright © 2011-2022 走看看