public static void CompressionThread()
        {
            while ( !Core.Closing )
            {
                m_Sync.WaitOne();

                while ( m_SendQueue.Count > 0 )
                {
                    SendQueueEntry sqe = (SendQueueEntry)m_SendQueue.Dequeue();

                    try
                    {
                        Packet p = null;

                        lock ( sqe.m_Root )
                            p = sqe.m_Root.PacketCache;

                        if ( p == null )
                        {
                            p = new DesignStateDetailed( sqe.m_Serial, sqe.m_Revision, sqe.m_xMin, sqe.m_yMin, sqe.m_xMax, sqe.m_yMax, sqe.m_Tiles );

                            lock ( sqe.m_Root )
                            {
                                if ( sqe.m_Revision == sqe.m_Root.Revision )
                                    sqe.m_Root.PacketCache = p;
                            }
                        }

                        Timer.DelayCall( TimeSpan.Zero, new TimerStateCallback( SendPacket_Sandbox ), new object[]{ sqe.m_NetState, p } );
                    }
                    catch ( Exception e )
                    {
                        log.Error( e );

                        try
                        {
                            using ( StreamWriter op = new StreamWriter( "dsd_exceptions.txt", true ) )
                                op.WriteLine( e );
                        }
                        catch
                        {
                        }
                    }

                    //sqe.m_NetState.Send( new DesignStateDetailed( sqe.m_Serial, sqe.m_Revision, sqe.m_xMin, sqe.m_yMin, sqe.m_xMax, sqe.m_yMax, sqe.m_Tiles ) );
                }
            }
        }
		public static void CompressionThread()
		{
			while( !Core.Closing )
			{
				m_Sync.WaitOne();

				int count;

				lock ( m_SendQueueSyncRoot )
					count = m_SendQueue.Count;

				while( count > 0 )
				{
					SendQueueEntry sqe = null;

					lock ( m_SendQueueSyncRoot )
						sqe = m_SendQueue.Dequeue();

					try
					{
						Packet p = null;

						lock( sqe.m_Root )
							p = sqe.m_Root.PacketCache;

						if( p == null )
						{
							p = new DesignStateDetailed( sqe.m_Serial, sqe.m_Revision, sqe.m_xMin, sqe.m_yMin, sqe.m_xMax, sqe.m_yMax, sqe.m_Tiles );
							p.SetStatic();

							lock( sqe.m_Root )
							{
								if( sqe.m_Revision == sqe.m_Root.Revision )
									sqe.m_Root.PacketCache = p;
							}
						}

						sqe.m_NetState.Send(p);
					}
					catch( Exception e )
					{
						Console.WriteLine( e );

						try
						{
							using( StreamWriter op = new StreamWriter( "dsd_exceptions.txt", true ) )
								op.WriteLine( e );
						}
						catch
						{
						}
					}
					finally
					{
						lock ( m_SendQueueSyncRoot )
							count = m_SendQueue.Count;
					}

					//sqe.m_NetState.Send( new DesignStateDetailed( sqe.m_Serial, sqe.m_Revision, sqe.m_xMin, sqe.m_yMin, sqe.m_xMax, sqe.m_yMax, sqe.m_Tiles ) );
				}
			}
		}