本帖最后由 catcatst01 于 2010-09-17 09:59:09 编辑

解决方案 »

  1.   

    你想实现的功能是加载主界面的同时去连接GPRS,如果GPRS在主界面初始完之前连接成功则按正常流程走下去,否则是不是需要让加载主界面的过程等待GPRS连接完成?先要确定你的需求,代码并不难实现.
      

  2.   

    两个线程一个加载UI,一个负责连接GPRS
    具体看代码
            static Thread mainThread;
            static Thread gprsConnectThread;        [STAThread]
            static void Main(string[] args)
            {
                mainThread = new Thread(MainThreadProc);
                mainThread.Start();
                mainThread.Join();
                Console.WriteLine("Finished...");
                Console.Read();
            }        static void MainThreadProc()
            {
                AutoResetEvent waitEvent = new AutoResetEvent(false);            //开启连接线程
                  gprsConnectThread = new Thread(GPRSConnectThreadProc);
                gprsConnectThread.Start(waitEvent);            //开始加载UI
                //todo
                //完成UI加载            //等待连接完成
                //可以直接调用gprsConnectThread.Join();
              //或者等待Event通知,每隔100ms检测一次,这个While里可做一些状态更新
                  while (!waitEvent.WaitOne(100))
                {
                   Console.WriteLine("Waiting...");
                }
            }        static void GPRSConnectThreadProc(object status)
            {
                //消耗一下时间
                for (int i = 0; i < 10; i++)
                { 
                    Thread.Sleep(1000); 
                }            //完成通知
                  AutoResetEvent evt = status as AutoResetEvent;
                if (evt != null)
                {
                    evt.Set();
                }
            }
      

  3.   

     private void MainForm_Load(object sender, EventArgs e)
            {
               
                ThreadG g = new ThreadG();
                g.Start();
               } class ThreadG
        {
            Thread _threadGetGprs;
           // Thread _threadGetData;
            AutoResetEvent autoEvent = new AutoResetEvent(false);        void GetGprsStatus()
            {
                while (true)
                {
                        int SynchCount = 3;//同步数据失败尝试次数
                        for (int i = 1; i <= SynchCount; i++)
                        {
                            try
                            {
                                //连接Gprs
                                Device.EnableGsmModule();
                                if (Device.ConnectGprs("gprs1") == true)
                                {
                                    Console.Write("连接成功");
                                }
                            }
                            catch (Exception ex)
                            {
                                //连接gprs失败,重试
                                if (i == SynchCount)//第3次失败
                                {
                                    Console.Write(ex.Message);
                                    // Alex.Utility.AppUtility.WriteLog("连接grps失败", this.GetType(), ex);
                                } autoEvent.WaitOne();                            Console.Write(ex.Message);
                            }
                        }
                        _threadGetGprs.Abort(); _threadGetGprs = null;
                        //_threadGetGprs.Join();
                }
            }
            
            public void Start()
            {
                if (_threadGetGprs == null)
                {
                    _threadGetGprs = new Thread(new ThreadStart(GetGprsStatus));
                    _threadGetGprs.IsBackground = true;
                    _threadGetGprs.Start();
                }
              }

    后台连接gprs写好了,下一步是同步数据。
      

  4.   

    看了你的代码,同步数据这里,首先你要知道在什么地方需要同步这个数据。帮你做了些修改
    然后
    private void MainForm_Load(object sender, EventArgs e)
            {
                g.autoEvent = ae;
                g.Start();
                
               //接收同步消息接收数据
                 g.autoEvent.WaitOne()
               
               //同步后需要做的事情 
               
              } class ThreadG
        {
            Thread _threadGetGprs;
           // Thread _threadGetData;
            AutoResetEvent autoEvent = new AutoResetEvent(false);        void GetGprsStatus()
            {
                while (true)
                {
                        int SynchCount = 3;//同步数据失败尝试次数
                        for (int i = 1; i <= SynchCount; i++)
                        {
                            try
                            {
                                //连接Gprs
                                Device.EnableGsmModule();
                                if (Device.ConnectGprs("gprs1") == true)
                                {
                                    Console.Write("连接成功");                                //连接成功后应该停止连接并返回同步信息
                                         autoEvent.Set();
                                    break;
                                }
                            }
                            catch (Exception ex)
                            {
                                //连接gprs失败,重试
                                if (i == SynchCount)//第3次失败
                                {
                                    Console.Write(ex.Message);
                                    // Alex.Utility.AppUtility.WriteLog("连接grps失败", this.GetType(), ex); 
                               //连接失败也要返回同步信息
                                    autoEvent.Set();
                                } 
                              
                              
                              //autoEvent.WaitOne();  不是用在这里                             Console.Write(ex.Message);
                            }
                        }
                        
                       //_threadGetGprs.Abort(); _threadGetGprs = null;  线程执行完后会自动退出,不需要手动。
                        //_threadGetGprs.Join();
                }
            }
            
            public void Start()
            {
                if (_threadGetGprs == null)
                {
                    _threadGetGprs = new Thread(new ThreadStart(GetGprsStatus));
                    _threadGetGprs.IsBackground = true;
                    _threadGetGprs.Start();
                }
              }
      

  5.   

     void GetChannelData()
            {
                //检索未同步数据
                DataSet ds = null;
                //没有数据跳出循环
                if (ds == null || ds.Tables == null || ds.Tables.Count <= 0)
                {
                    return;
                }
                else
                {
                    //循环读取数据
                    foreach (DataRow row in ds.Tables[0].Rows)
                    {                    int SynchCount = 3;//同步数据失败尝试次数
                        for (int i = 1; i <= SynchCount; i++)
                        {
                            try
                            {
                                //同步数据
                                break;
                            }
                            catch (Exception ex)
                            {
                                //同步失败,重试
                                if (i == SynchCount)//第3次失败
                                {
                                    //Alex.Utility.AppUtility.WriteLog("同步失败,记录ID=" + row["id"].ToString(), this.GetType(), ex);
                                }
                            }
                        }
                    }
                }
            }
    这个是数据同步的方法。
      

  6.   

    这个数据同步的方法就是将本地数据库发送到以GPRS连接的服务器吧。
    数据库处理方面的东西我处理得少,帮不了你。
      

  7.   

    数据库处理撇开不管,只管线程怎么写。
    还有就是我注销登录后 也就是重新去调用ThreadG类里的start方法
    界面会变得很卡了 这个怎么处理?
      

  8.   


    void GetChannelData()
      {
      //检索未同步数据
      DataSet ds = null;
      //没有数据跳出循环
      if (ds == null || ds.Tables == null || ds.Tables.Count <= 0)
      {
      return;
      }
      else
      {
      //循环读取数据
      foreach (DataRow row in ds.Tables[0].Rows)
      {  int SynchCount = 3;//同步数据失败尝试次数
      for (int i = 1; i <= SynchCount; i++)
      {
      try
      {
      //同步数据
      break;
      }
      catch (Exception ex)
      {
      //同步失败,重试
      if (i == SynchCount)//第3次失败
      {
      //Alex.Utility.AppUtility.WriteLog("同步失败,记录ID=" + row["id"].ToString(), this.GetType(), ex);
      }
      }
      }
      }
      }
      }
    这是数据同步的方法,不管具体怎么实现同步,只管线程怎么跑通。