10月 28

Person.cs

public class Person
    {
        private static ManualResetEvent eventwait = new ManualResetEvent(false);
        private static ManualResetEvent eventover = new ManualResetEvent(false);
        private int num1;
        private int num2;
        private int num3;

        public void DianCai()
        {
            int numm = 1 + 2;
            num1 = numm;
            Console.WriteLine("1+2={0}", num1);
            //这里添加睡眠的原因是别的线程可以在没有收到此线程的信号之前做别的事情
            //这里我设置为1000,那么goto #2:这里每获取500就可以做其他事情了
            Thread.Sleep(1000);
            //Set方法我把它理解为和Monitor.Wait方法差不多
            //它告诉其他线程我的事情已经做好,你们可以做事情了
            eventwait.Set();
            while (true)
            {
                if (eventover.WaitOne(500, false))
                {
                    num3 = num2 / 3;
                    Console.WriteLine("{0}/3={1}", num2, num3);
                    break;
                }
            }
        }

        public void Chifan()
        {
            while (true)
            {
                //eventwait.WaitOne在收到Set传来的信号后它就会返回true,这时可以同步做事情了
                if (eventwait.WaitOne(500, false))
                {
                    num2 = num1 * 4;
                    Console.WriteLine("{0}*4={1}", num1, num2);
                    Thread.Sleep(1000);
                    //Reset代表线程已经结束
                    eventwait.Reset();
                    //这里同时发信号给其他线程,而自己则休眠
                    eventover.Set();
                    break;
                }
                /*              
                else
                {
                    goto #2:当此线程为收到信号之前这里可以做别的事情
                }
                */
            }
        }
    }

static void Main(string[] args)
        {

            Person pp = new Person();
            Thread t1 = new Thread(pp.DianCai);
            Thread t2 = new Thread(pp.Chifan);
            t1.Start();
            t2.Start();
            Console.Read();

        }

执行结果

转:http://www.cnblogs.com/xuting/archive/2010/02/01/1660843.html

written by ocean

10月 28

代码一

    //用Monitor同步线程来演示妈妈做菜,孩子在旁边偷吃第几盘菜
        //obj并非必须要用Static关键字,只是因为这是在main控制台里
        private static object obj = new object();
        static void Main(string[] args)
        {
            Thread tt = new Thread(delegate()
            {
                for (int i = 1; i < 10; i++)
                {
                    //Enter方法的意思为获取独占琐,或琐正在被占用,则自己等待
                    //Monitor还有TryEnter()方法,可以设置等待时间,防止死琐;
                    Monitor.Enter(obj);
                    Console.WriteLine("妈妈已经做好第{0}道菜了", i);
                    //Pulse方法就像是闹钟一样,提示别的进程可以访问独占琐了。
                    Monitor.Pulse(obj);
                    //当唤醒其余的线程之后,则自己在琐旁边打盹,知道被闹钟叫醒为止
                    Monitor.Wait(obj);
                    Monitor.Exit(obj);
                }
            });
            Thread bb = new Thread(delegate()
            {
                for (int i = 1; i < 10; i++)
                {
                    //Enter方法的意思为获取独占琐,或琐正在被占用,则自己等待
                    //Monitor还有TryEnter()方法,可以设置等待时间,防止死琐;
                    Monitor.Enter(obj);
                    Console.WriteLine("我正在偷吃第{0}道菜了", i);
                    //Pulse方法就像是闹钟一样,提示别的进程可以访问独占琐了。
                    Monitor.Pulse(obj);
                    //当唤醒其余的线程之后,则自己在琐旁边打盹,知道被闹钟叫醒为止
                    Monitor.Wait(obj);
                    Monitor.Exit(obj);
                }
            });
            tt.Start();
            bb.Start();
            Console.Read();
        }

代码二

    //用Interlocked同步线程来演示妈妈做菜,孩子在旁边偷吃第几盘菜
        private long num;
 
        static void Main(string[] args)
        {
            Program p = new Program();
            p.Main();
            Console.Read();
        }
        public void Main()
        {
            Thread tt = new Thread(delegate()
            {
                for (int i = 1; i < 10; i++)
                {
                    //判断变量是否等于1,如果等于1,则线程将会阻塞
                    //也就是说会执行其他的线程
                    while (Interlocked.Read(ref num) == 1)
                    {
                        Thread.Sleep(10);
                    }
                    Console.WriteLine("妈妈已经做好第{0}道菜了", i);
                    Interlocked.Increment(ref num);// 以原子操作的形式递增指定变量的值并存储结果。
                }
            });
 
            Thread bb = new Thread(delegate()
            {
                for (int i = 1; i < 10; i++)
                {
                    while (Interlocked.Read(ref num) == 0)
                    {
                        Thread.Sleep(10);
                    }
                    Console.WriteLine("我正在偷吃第{0}道菜", i);
                    Interlocked.Decrement(ref num);
                }
            });
            tt.Start();
            bb.Start();
        }

两者效果一样

written by ocean

10月 28

Join主要用来阻塞

指在一线程里面调用另一线程join方法时,表示将本线程阻塞直至另一线程终止时再执行

直接上代码

    static void Main(string[] args)
{
    Thread threadA = new Thread(delegate()
    {
        for (int index = 0; index < 10; index++)
        {
            Thread.Sleep(500);
            Console.Write("1");
        }
    });
    Thread threadB = new Thread(delegate()
    {
        for (int index = 0; index < 5; index++)
        {
            Thread.Sleep(500);
            Console.Write("2");
        }
        threadA.Join();
        for (int index = 0; index < 10; index++)
        {
            Console.Write("3");
        }
    });
    threadA.Start();
    threadB.Start();
    Console.Read();
}

执行结果

如果注释掉threadA.Join();

执行结果

written by ocean

10月 27

Node接口定义的节点类型都包含的特性和方法
特性和方法后面的 “冒号:” 紧跟的单词是“返回值类型 ”

Node
属性
遍历节点(短途旅行):
parentNode : Node
firstChild : Node
lastChild : Node
nextSibling : Node
previousSibling : Node
childNodes : NodeList
节点信息:
nodeName :String
nodeType :number
nodeValue :String
返回一个节点的根元素(文档对象):
ownerDocument : Document
包含了代表一个元素的特性的Attr对象;仅用于Element节点:
attributes : NamedNodeMap
获取对象层次中的父对象:
parentElement [IE] :Node
方法
修改文档树:
appendChild(Node newChild) : Node
insertBefore(Node newChild, Node refChild) : Node
removeChild(Node oldChild): Node
replaceChild(Node newChild, Node refChild) : Node
克隆一个节点:
cloneNode(boolean deep) : Node
删除一个子节点:
removeNode(boolean removeChildren) : Node
判断childNodes包含是否包含节点:
hasChildNodes() : boolean

Node

Document
属性
自己的:
documentElement : Element
继承 Node :
attributes, childNodes, firstChild, lastChild, nextSibling, nodeName, nodeType, nodeValue, ownerDocument, parentElement, parentNode, previousSibling
方法
自己的:
创建元素:
createElement(String tagName) : Element
createTextNode(String data) : Text
查找元素:
getElementById(String elementId) : Element
getElementsByTagName(String tagname) : NodeList
继承 Node :
appendChild, cloneNode, hasChildNodes, insertBefore, removeChild, removeNode, replaceChild

Element
属性
自己的:
tagName: String
继承 Node :
attributes, childNodes, firstChild, lastChild, nextSibling, nodeName, nodeType, nodeValue, ownerDocument, parentElement, parentNode, previousSibling
方法
自己的:
属性的读写:
getAttribute(String name) : String
setAttribute(String name, String value) : void
其它:
getElementsByTagName(String name) Stub : NodeList
normalize() Stub : void
removeAttribute(String name) : void
继承 Node :
appendChild, cloneNode, hasChildNodes, insertBefore, removeChild, removeNode, replaceChild

written by ocean

10月 27

Timer.Start() 了但只执行了一次Elapsed事件就停止不执行了,原因是您在设置Timer控件属性的时候没有设置AutoResettrue

如果将 Enabled 设置为 true 并将 AutoReset 设置为 false,则 Timer 在第一次达到间隔时仅引发一次 Elapsed 事件。当 Enabledtrue 并且 AutoResettrue 时,Timer 继续按指定的间隔引发 Elapsed 事件。

written by ocean

10月 26

检测地址

http://xui.ptlogin2.qq.com/cgi-bin/qlogin

得到ClientKey

document.write(( q_aUinList[2][‘key’]));

登陆地址

http://ptlogin2.qq.com/undefined?clientuin=1323370687&clientkey=00014cc64ac600582d97423f5b8740480af33eec0affbf9b022bd057ce80755e28e14763e9ef16c154409a04090b75a7588b6e0095011a825921eefe9f4593eecf85b7dc357f24cd98f795177329c3706ea047322746c451d8e2c4ba8d700313&keyindex=9

written by ocean

10月 24

        /// <summary>
        /// 生成随机因子
        /// </summary>
        /// <returns></returns>
        private static int GetRandomSeed()
        {
            byte[] bytes = new byte[4];
            System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
            rng.GetBytes(bytes);
            return BitConverter.ToInt32(bytes, 0);
        }

       /// <summary>
        /// 返回Random实例
        /// </summary>
        /// <returns></returns>
        public static Random GetRandom()
        {          

            int seed = GetRandomSeed();
            Random rand = new Random(seed);
            return rand;
        }

written by ocean

10月 22

        protected void Page_Load(object sender, EventArgs e)
        {

          MemoryStream m=  SaveFile();

          Response.ClearContent();
          Response.ContentType = "application/octet-stream";
          Response.AppendHeader("Content-Disposition", "filename=222.pdf");

          Response.BinaryWrite(m.GetBuffer());
        }

        private static MemoryStream SaveFile()
        {
            string url = "http://www.jielongdaquan.com/HT2010S0011.pdf";
            BinaryFormatter serializer = new BinaryFormatter();
            using (System.IO.MemoryStream memStream = new System.IO.MemoryStream())
            {
                WebClient webClient = new WebClient();
                var obj = webClient.DownloadData(url);
                serializer.Serialize(memStream, obj);
                return memStream;              
            }
        }

written by ocean

10月 20

又是最弱的数据库脚本

记录一下,以防遗忘

CREATE TABLE DP_DcashTrans_Day
  
SELECT
DATE_FORMAT(t.AddDate,'%Y-%m-%d') AS tim,
COUNT(*) AS amount,
SUM(t.Dcash) AS gather,
SUM(CASE WHEN t.Dcash>0 THEN t.Dcash ELSE 0 END) AS addition,
SUM(CASE WHEN t.Dcash>0 THEN 1 ELSE 0 END) AS additionAmount,
SUM(CASE WHEN t.Dcash<0 THEN t.Dcash ELSE 0 END) AS substruction,
SUM(CASE WHEN t.Dcash<0 THEN 1 ELSE 0 END) AS substructionAmount
FROM
DP_DcashTrans t 
  
GROUP BY tim

很弱的if语句

written by ocean

10月 14

javascript中的replace只会替换第一个匹配

如果要全部替换的话只能重写方法实现replaceAll

记录一下

String.prototype.replaceAll = function (s1, s2) {
    return this.replace(new RegExp(s1,"gm"),s2);
}

written by ocean