全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1356
推到 Plurk!
推到 Facebook!

大量資料寫入過慢

缺席
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-29 16:46:09 IP:61.222.xxx.xxx 未訂閱
請問各位, 我寫了一個window service程式,用socket收到data存到buffer(vector),然後用thread寫到db中. 但大量資料(約10000筆)時,CPU使用率逹60%以上,寫入動作緩慢,但不會使程式死掉. 請各位指導,解決CPU使用率過高 和 資料處理緩慢 問題    以下為我片斷程式.  
主程式 --- 收data
void __fastcall TService1::ServiceExecute(TService *Sender)
{
  ClientSocket1->Active = true;
  try
  {
    ADOConnection1->ConnectionString = ConnectStr;
    ADOConnection1->Connected = true;
    GTable->Active = true;
    BTable->Active = true;
    GRecallTable->Active = true;
    BRecallTable->Active = true;
  }
  catch(...)
  {
    ConnectTimer->Enabled = true;
    MsgWriteFile("Database open error.");
  }      while(!Terminated)
  {
    ServiceThread->ProcessRequests(true);
    Sleep(10);
  }
}
//---------------------------------------------------------------------------
void __fastcall TService1::ClientSocket1Error(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
   //.......
   GBuffer.push_back(GS);
   BBuffer.push_back(BS);
}
//---------------------------------------------------------------------------
void __fastcall TService1::GTableAfterPost(TDataSet *DataSet)
{
  GTable->Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TService1::BTableAfterPost(TDataSet *DataSet)
{
  BTable->Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TService1::GRecallTableAfterPost(TDataSet *DataSet)
{
  GRecallTable->Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TService1::BRecallTableAfterPost(TDataSet *DataSet)
{
  BRecallTable->Refresh();
}
//---------------------------------------------------------------------------
Thread --- data寫到db
void __fastcall DBthread::Execute()
{
  //---- Place thread code here ----
  while(!Terminated)
  {
    Synchronize(WriteDB);
    Sleep(10);
  }
}
//---------------------------------------------------------------------------
void __fastcall DBthread::WriteDB()
{
  if(!ADOConnection1->Connected) return;
  
  if(GBuffer.size() > 0)
  {
    TGType Ptr;
    vector::iterator Ptrs = GBuffer.begin();
    memmove(&Ptr,Ptrs,sizeof(TGType));
    GBuffer.erase(Ptrs);        try
    {
      GPSTable->Insert();
      //***data寫到各field
      GPSTable->Post();
    }
    catch(...)
    {
      if(GTable->State == dsInsert) GTable->Cancel();
    }
  }      if(BBuffer.size() > 0)
  {
    TBType Ptr;
    vector::iterator Ptrs = BBuffer.begin();
    memmove(&Ptr,Ptrs,sizeof(TBType));
    BBuffer.erase(Ptrs);        try
    {
      BarTable->Insert();
      //***data填到field
      BarTable->Post();
    }
    catch(...)
    {
      if(BarTable->State == dsInsert) BarTable->Cancel();
    }
  }
}
//---------------------------------------------------------------------------
 
系統時間:2024-04-27 1:26:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!