CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

为什么我同时跑5个线程,整个windows就象死去了一样?

楼主yuyipj(yuyi)2003-08-03 13:38:57 在 C++ Builder / 基础类 提问

__fastcall   TDRecv1::TDRecv1(bool   CreateSuspended)  
                  :   TThread(CreateSuspended)  
  {  
            FreeOnTerminate=true;  
          //   this->Priority=tpLower;  
  }  
  //---------------------------------------------------------------------------  
  void   __fastcall   TDRecv1::Execute()  
  {  
   
                switch(Fflag)  
                {  
                  case   0:  
                                  Synchronize(connstate);  
                                  break;  
                  case   1:  
                                  Synchronize(FWLogs);  
                                  break;  
                  case   2:  
                                  Synchronize(idslogs);  
                                  break;  
                  case   3:  
                                  Synchronize(proxylogs);  
                                  break;  
                  case   4:  
                                  Synchronize(seriallogs);  
                }  
  }  
   
  以上线程方法都有循环的实现;  
  我在没有使用同步方法的时候,windows   就象死机了一样.  
   
  我在使用了同步方法后,问题有所改进,但是window还是有点忙不过来的味道 问题点数:20、回复次数:6Top

1 楼matq2008(叶子.net)回复于 2003-08-03 14:08:12 得分 5

把Application->ProcessMessages()加在你的循环里试试Top

2 楼yuyipj(yuyi)回复于 2003-08-03 15:10:05 得分 0

加上后,还可以.但有时主窗体还是有点不能反映过来的味道,我贴出我的处理函数的原码,以求指正  
  void   __fastcall   TDRecv1::FWLogs()  
  //接收防火墙日志  
  {  
          //NetInface->TCP2->Host=;  
          FWLOG_SND_t   tmplog;  
          log_info_t   loginfo;  
          AnsiString   sql;  
          unsigned   long   ntime=5000*4;  
          TDateTime   *dt=new   TDateTime;  
          TList   *pls=new   TList();  
          memset(&loginfo,0,sizeof(loginfo));  
          loginfo.rt_old=2;  
          loginfo.logty=1;  
   
  Again:  
          try{  
              NetInface->TCP2->Connect();  
          }  
          catch(...){  
              //Application->MessageBoxA("防火墙日志连接失败","提示",MB_OK|MB_ICONINFORMATION);  
              FrmLogs->Memo1->Lines->Add(TimeToStr(dt->CurrentTime())+"防火墙日志连接失败");  
              delete   dt;  
              delete   pls;  
              return;  
          }  
   
          if   (!(NetInface->TCP2->Connected()))  
          {  
              //Application->MessageBoxA("防火墙日志连接失败","提示",MB_OK|MB_ICONINFORMATION);  
              FrmLogs->Memo1->Lines->Add(TimeToStr(dt->CurrentTime())+"防火墙日志连接失败");  
              delete   dt;  
              delete   pls;  
              return;  
          };  
          NetInface->TCP2->WriteBuffer(&loginfo,sizeof(loginfo));  
          int   n=0;  
          int   echo=1;  
          while(!this->Terminated){  
                FWLOG_SND_t   fwlog;  
                //memset(&fwlog,0,sizeof(fwlog));  
                //ShowMessage(IntToStr(sizeof(fwlog)));  
                NetInface->TCP2->ReadBuffer(&fwlog,sizeof(fwlog));  
   
                switch(fwlog.flag){  
                      case   0:  
                                      n++;  
                                      FrmLogs->lb_FWlogs->Caption=IntToStr(n);  
                                      NetInface->TCP2->WriteBuffer(&echo,sizeof(echo));  
                                      Application->ProcessMessages();  
                                      pls->Add(&fwlog);  
                                      break;  
                      case   1:  
                                      NetInface->TCP2->Disconnect();  
                                      //NetInface->setexit(1);  
                                    //   Application->MessageBoxA("防火墙日志接收完毕","提示",MB_OK|MB_ICONINFORMATION);  
                                    FrmLogs->Memo1->Lines->Add(TimeToStr(dt->CurrentTime())+"防火墙日志接收完毕");  
                                      goto   log;  
                }  
          }  
   
   
  log:         for(int   i=0;i<pls->Count;i++)  
                  {  
                        memcpy(&tmplog,pls->Items[i],sizeof(tmplog));  
                        sql="insert   into     FireWallLogs   values('"+  
                                  (AnsiString)tmplog.log.id+"',"+  
                                  IntToStr(tmplog.log.action)+","+  
                                  IntToStr(tmplog.log.table)+",'"+  
                                  (AnsiString)tmplog.log.timestamp+"','"+  
                                  (AnsiString)tmplog.log.mac+"','"+  
                                  (AnsiString)tmplog.log.proto+"','"+  
                                  (AnsiString)tmplog.log.src+"',"+  
                                  IntToStr(tmplog.log.srcport)+",'"+  
                                  (AnsiString)tmplog.log.dest+"',"+  
                                  IntToStr(tmplog.log.destport)+","+  
                                  IntToStr(tmplog.flag)+")";  
                        NetInface->QurFwLogs->Close();  
                        NetInface->QurFwLogs->SQL->Clear();  
                        NetInface->QurFwLogs->SQL->Add(sql);  
                        NetInface->QurFwLogs->ExecSQL();  
                        Application->ProcessMessages();  
                  }  
                  pls->Clear();  
                  if(this->Terminated)  
                  {  
                    //FrmLogs->Memo1->Lines->Add(TimeToStr(dt->CurrentTime())+"防火墙日志接收成功停止");  
                      NetInface->TCP2->Disconnect();  
                        return;  
                  }  
   
                  Sleep(ntime);  
                  if(this->Terminated)  
                  {  
                    //FrmLogs->Memo1->Lines->Add(TimeToStr(dt->CurrentTime())+"防火墙日志接收成功停止");  
                    NetInface->TCP2->Disconnect();  
                        return;  
                  }  
   
                  goto   Again;  
  }  
  Top

3 楼invalid(空心菜(Python是个好东东,大家多用用!))回复于 2003-08-03 15:59:15 得分 5

在线程里面调用同步方法,跟没有用线程是一个效果Top

4 楼kingfish(工作很忙,很少来csdn...)回复于 2003-08-03 16:40:33 得分 5

全部都同步就和楼上说的一样  
   
  尽量减少需要同步的代码   ,涉及到线程安全的才需要同步Top

5 楼yesry(噎死你)回复于 2003-08-03 17:15:08 得分 5

你的程序实时性很强,免不了。  
  可以在Application->ProcessMessages();后::Sleep(1);减轻负担。Top

6 楼mme(dog)回复于 2003-08-03 18:48:59 得分 0

对啊,建议用Sleep来使得系统处理其他事务Top

相关问题

  • 关于windows线程优先级
  • 如何创建一个有消息队列的线程,就象进程的主线程一样,可以向它发消息.
  • 线程
  • 不使用windows的线程池函数,用纯C实现一个线程池。请高手大侠们帮忙。
  • 如何在Windows中的禁止我的线程不被发现
  • 多线程之间传递windows对象的问题
  • 如何在Windows Console Application下创建多个线程?
  • 有关Windows 进程,线程的一些问题
  • 请教Windows线程ID和HANDLE的相互转换
  • 当线程,进程,app运行时,windows注销时的问题.

关键词

  • 线程
  • 防火墙
  • sleep
  • 连接
  • tcp
  • application
  • tmplog
  • netinface
  • qurfwlogs
  • 防火墙日志

得分解答快速导航

  • 帖主:yuyipj
  • matq2008
  • invalid
  • kingfish
  • yesry

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo