public Form1()
        {
            InitializeComponent();

            semaphore = new Semaphore();
            buffer = new Buffer();

            p1 = new ButtonPanelThread(new Point(40, 10),
                                 120, true, pnl1,
                                 Color.Blue,
                                 semaphore,
                                 buffer,
                                 btn1);

            p2 = new WaitPanelThread(new Point(40, 10),
                                 100, true, pnl2,
                                 Color.White,
                                 semaphore,
                                 buffer);

            p3 = new ButtonPanelThread(new Point(40, 10),
                                 250, true, pnl3,
                                 Color.Red,
                                 semaphore,
                                 buffer,
                                 btn3);

            semThread = new Thread(new ThreadStart(semaphore.Start));
            buffThread = new Thread(new ThreadStart(buffer.Start));
            thread1 = new Thread(new ThreadStart(p1.Start));
            thread2 = new Thread(new ThreadStart(p2.Start));
            thread3 = new Thread(new ThreadStart(p3.Start));

            this.Closing += new CancelEventHandler(this.Form1_Closing);

            semThread.Start();
            buffThread.Start();
            thread1.Start();
            thread2.Start();
            thread3.Start();
        }
        public Form1()
        {
            InitializeComponent();
            planes = new Plane[4];

            planes[0] = new Plane(new Point(0, 0), Color.Red, 0);
            planes[1] = new Plane(new Point(0, 0), Color.Blue, 0);
            planes[2] = new Plane(new Point(0, 0), Color.Green, 0);
            planes[3] = new Plane(new Point(0, 0), Color.Magenta, 1);

            semaphoreTerminal1 = new Semaphore();
            semaphoreTerminal2 = new Semaphore();
            semaphoreTerminal3 = new Semaphore();
            semaphoreArrivals1 = new Semaphore();
            semaphoreTaxiBetween1and2 = new Semaphore();
            semaphoreTaxiBetween2and3 = new Semaphore();
            semaphoreTaxiBetween3andToRunway = new Semaphore();
            semaphoreTaxiToRunway = new Semaphore();
            semaphoreRunway = new Semaphore();
            semaphoreTaxiFromRunway = new Semaphore();
            bufferTerminal1 = new Buffer();
            bufferTerminal2 = new Buffer();
            bufferTerminal3 = new Buffer();
            bufferArrivals1 = new Buffer();
            bufferTaxiBetween1and2 = new Buffer();
            bufferTaxiBetween2and3 = new Buffer();
            bufferTaxiBetween3andToRunway = new Buffer();
            bufferTaxiToRunway = new Buffer();
            bufferRunway = new Buffer();
            bufferTaxiFromRunway = new Buffer();

            terminal1 = new ButtonPanelThread(new Point(10, 40), planes[0], 150, true, false, false, pnlTerminal1, semaphoreTerminal1, semaphoreTaxiBetween1and2, bufferTerminal1, bufferTaxiBetween1and2, btnTerminal1, null, null, null, null, 11);
            terminal2 = new ButtonPanelThread(new Point(10, 40), planes[1], 150, true, false, false, pnlTerminal2, semaphoreTerminal2, semaphoreTaxiBetween2and3, bufferTerminal2, bufferTaxiBetween2and3, btnTerminal2, null, null, null, null, 11);
            terminal3 = new ButtonPanelThread(new Point(10, 40), planes[2], 150, true, false, false, pnlTerminal3, semaphoreTerminal3, semaphoreTaxiBetween3andToRunway, bufferTerminal3, bufferTaxiBetween3andToRunway, btnTerminal3, null, null, null, null, 11);
            arrivals1 = new ButtonPanelThread(new Point(30, 10), planes[3], 150, false, true, true, pnlArrivals1, semaphoreArrivals1, semaphoreRunway, null, bufferRunway, btnArrivals1, btnSendTo0, btnSendTo1, btnSendTo2, btnSendTo3, 4);

            taxiBetween1and2 = new WaitPanelThread(new Point(0, 10), 100, true, true, pnlTaxiBetween1and2, null, semaphoreTaxiBetween1and2, semaphoreTaxiBetween2and3, semaphoreTerminal2, bufferTaxiBetween1and2, bufferTaxiBetween2and3, bufferTerminal2, 13, 2);
            taxiBetween2and3 = new WaitPanelThread(new Point(0, 10), 100, true, true, pnlTaxiBetween2and3, null, semaphoreTaxiBetween2and3, semaphoreTaxiBetween3andToRunway, semaphoreTerminal3, bufferTaxiBetween2and3, bufferTaxiBetween3andToRunway, bufferTerminal3, 13, 3);
            taxiBetween3andToRunway = new WaitPanelThread(new Point(0, 10), 100, true, true, pnlTaxiBetween3andToRunway, null, semaphoreTaxiBetween3andToRunway, semaphoreTaxiToRunway, null, bufferTaxiBetween3andToRunway, bufferTaxiToRunway, null, 13, 4);
            taxiToRunway = new WaitPanelThread(new Point(10, 0), 100, true, false, pnlTaxiToRunway, null, semaphoreTaxiToRunway, semaphoreRunway, null, bufferTaxiToRunway, bufferRunway, null, 16, 4);
            runway = new WaitPanelThread(new Point(530, 10), 100, false, true, pnlRunway, null, semaphoreRunway, semaphoreTaxiFromRunway, null, bufferRunway, bufferTaxiFromRunway, null, 43, 0);
            taxiFromRunway = new WaitPanelThread(new Point(10, 150), 100, false, false, pnlTaxiFromRunway, null, semaphoreTaxiFromRunway, semaphoreTaxiBetween1and2, semaphoreTerminal1, bufferTaxiFromRunway, bufferTaxiBetween1and2, bufferTerminal1, 15, 1);

            semaphoreThreadTerminal1 = new Thread(new ThreadStart(semaphoreTerminal1.Start));
            semaphoreThreadTerminal2 = new Thread(new ThreadStart(semaphoreTerminal2.Start));
            semaphoreThreadTerminal3 = new Thread(new ThreadStart(semaphoreTerminal3.Start));
            semaphoreThreadArrivals1 = new Thread(new ThreadStart(semaphoreArrivals1.Start));
            semaphoreThreadTaxiBetween1and2 = new Thread(new ThreadStart(semaphoreTaxiBetween1and2.Start));
            semaphoreThreadTaxiBetween2and3 = new Thread(new ThreadStart(semaphoreTaxiBetween2and3.Start));
            semaphoreThreadTaxiBetween3andToRunway = new Thread(new ThreadStart(semaphoreTaxiBetween3andToRunway.Start));
            semaphoreThreadTaxiToRunway = new Thread(new ThreadStart(semaphoreTaxiToRunway.Start));
            semaphoreThreadRunway = new Thread(new ThreadStart(semaphoreRunway.Start));
            semaphoreThreadTaxiFromRunway = new Thread(new ThreadStart(semaphoreTaxiFromRunway.Start));
            bufferThreadTerminal1 = new Thread(new ThreadStart(bufferTerminal1.Start));
            bufferThreadTerminal2 = new Thread(new ThreadStart(bufferTerminal2.Start));
            bufferThreadTerminal3 = new Thread(new ThreadStart(bufferTerminal3.Start));
            bufferThreadArrivals1 = new Thread(new ThreadStart(bufferArrivals1.Start));
            bufferThreadTaxiBetween1and2 = new Thread(new ThreadStart(bufferTaxiBetween1and2.Start));
            bufferThreadTaxiBetween2and3 = new Thread(new ThreadStart(bufferTaxiBetween2and3.Start));
            bufferThreadTaxiBetween3andToRunway = new Thread(new ThreadStart(bufferTaxiBetween3andToRunway.Start));
            bufferThreadTaxiToRunway = new Thread(new ThreadStart(bufferTaxiToRunway.Start));
            bufferThreadRunway = new Thread(new ThreadStart(bufferRunway.Start));
            bufferThreadTaxiFromRunway = new Thread(new ThreadStart(bufferTaxiFromRunway.Start));

            thread1 = new Thread(new ThreadStart(terminal1.Start));
            thread2 = new Thread(new ThreadStart(terminal2.Start));
            thread3 = new Thread(new ThreadStart(terminal3.Start));
            thread4 = new Thread(new ThreadStart(arrivals1.Start));
            threadBetween1and2 = new Thread(new ThreadStart(taxiBetween1and2.Start));
            threadBetween2and3 = new Thread(new ThreadStart(taxiBetween2and3.Start));
            threadBetween3andToRunway = new Thread(new ThreadStart(taxiBetween3andToRunway.Start));
            threadTaxiToRunway = new Thread(new ThreadStart(taxiToRunway.Start));
            threadRunway = new Thread(new ThreadStart(runway.Start));
            threadTaxiFromRunway = new Thread(new ThreadStart(taxiFromRunway.Start));

            this.Closing += new CancelEventHandler(this.Form1_Closing);

            semaphoreThreadTerminal1.Start();
            semaphoreThreadTerminal2.Start();
            semaphoreThreadTerminal3.Start();
            semaphoreThreadArrivals1.Start();
            semaphoreThreadTaxiBetween1and2.Start();
            semaphoreThreadTaxiBetween2and3.Start();
            semaphoreThreadTaxiBetween3andToRunway.Start();
            semaphoreThreadTaxiToRunway.Start();
            semaphoreThreadRunway.Start();
            semaphoreThreadTaxiFromRunway.Start();
            bufferThreadTerminal1.Start();
            bufferThreadTerminal2.Start();
            bufferThreadTerminal3.Start();
            bufferThreadArrivals1.Start();
            bufferThreadTaxiBetween1and2.Start();
            bufferThreadTaxiBetween2and3.Start();
            bufferThreadTaxiBetween3andToRunway.Start();
            bufferThreadTaxiToRunway.Start();
            bufferThreadRunway.Start();
            bufferThreadTaxiFromRunway.Start();
            thread1.Start();
            thread2.Start();
            thread3.Start();
            thread4.Start();
            threadBetween1and2.Start();
            threadBetween2and3.Start();
            threadBetween3andToRunway.Start();
            threadTaxiToRunway.Start();
            threadRunway.Start();
            threadTaxiFromRunway.Start();
        }