为什么我同时跑5个线程,整个windows就象死去了一样?
__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




