線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2204
推到 Plurk!
推到 Facebook!

請問程式的執行問題

尚未結案
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-12 19:26:13 IP:211.74.xxx.xxx 未訂閱
各位高手好,小弟最近實作遇到一個很棘手的問題,程式執行速率很慢(我的執行方式是由一個執行檔A呼叫另一個已經編譯好的B執行檔),A與B的傳值方式是使用TCP/IP傳(TServerSocket),大致上的執行的流程如下    A先開啟,等到別的程式傳資料給A之後,A再根據所傳的資料使用Socket(127.0.0.1)傳給B執行(B為已編譯好的執行檔(Form)),B執行後再用Socket(127.0.0.1)傳結果回A.    但我發現問題如下    當A收到別的程式傳過來的資料之後,A並沒有馬上呼叫B執行,或是有呼叫B執行,但當B執行完畢傳結果回A時(此時Windows的Focus在B),會發現,A並沒有繼續往下執行下去,而整個程式會Idle在那邊,而我要解除Idle則要把滑鼠移到A的範圍,或是離開B的範圍,此時程式才會繼續執行下去,但小弟使用TaskInfo並沒有看到CPU overload的狀態(我有使用Thread監看目錄),請問各位高手,這是什麼原因讓程式整個Idle,要動滑鼠才能讓程式繼續執行下去??實在找半天都找不問題出在哪,想請問各位高手,這問題並非
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-13 00:02:08 IP:61.221.xxx.xxx 未訂閱
引言: 各位高手好,小弟最近實作遇到一個很棘手的問題,程式執行速率很慢(我的執行方式是由一個執行檔A呼叫另一個已經編譯好的B執行檔),A與B的傳值方式是使用TCP/IP傳(TServerSocket),大致上的執行的流程如下 A先開啟,等到別的程式傳資料給A之後,A再根據所傳的資料使用Socket(127.0.0.1)傳給B執行(B為已編譯好的執行檔(Form)),B執行後再用Socket(127.0.0.1)傳結果回A. 但我發現問題如下 當A收到別的程式傳過來的資料之後,A並沒有馬上呼叫B執行,或是有呼叫B執行,但當B執行完畢傳結果回A時(此時Windows的Focus在B),會發現,A並沒有繼續往下執行下去,而整個程式會Idle在那邊,而我要解除Idle則要把滑鼠移到A的範圍,或是離開B的範圍,此時程式才會繼續執行下去,但小弟使用TaskInfo並沒有看到CPU overload的狀態(我有使用Thread監看目錄),請問各位高手,這是什麼原因讓程式整個Idle,要動滑鼠才能讓程式繼續執行下去??實在找半天都找不問題出在哪,想請問各位高手,這問題並非>< face="Verdana, Arial, Helvetica">
willchen 你好:
(1)你的程式碼呢?? 如果方便、又不是很多的話,可以貼上來嗎??
(2)如果所有的程式都在同一台電腦上執行,應該可以不用 Socket 吧??< > 參
   考看看其他的做法< >
   http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27080
-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-13 00:34:28 IP:211.74.xxx.xxx 未訂閱
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "LbCipher"
#pragma link "LbClass"
#pragma link "LbAsym"
#pragma link "LbRSA"
#pragma resource "*.dfm"
TSearchRec FileRec;
int Attr=faAnyFile;
TForm1 *Form1;
AnsiString CurrentDir,Inputpath,Outputpath,Temppath;
AnsiString Serverletpath;
AnsiString agentname;
TKey128 Key128;
HANDLE InputPathHandle,OutputPathHandle;
AnsiString CS_argument,encrypted_result;
AnsiString CS,PS;
AnsiString NextIP;    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 DS_Client->Host="127.0.0.1";//先假定內部傳輸,應該為140.116.39.126
 DS_Client->Port=6666;     MMServer_Receiver->Port=7777;
 MM2S_Server->Port=8888;
 S2MM_Server->Port=5555;     CurrentDir=GetCurrentDir();
 Serverletpath=CurrentDir "\\..\\Serverlet\\";
 Inputpath=CurrentDir "\\Input\\";
 Outputpath=CurrentDir "\\Output\\";
 Temppath=CurrentDir "\\Temp\\";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 InputPathHandle=FindFirstChangeNotification(Inputpath.c_str(),false,FILE_NOTIFY_CHANGE_LAST_WRITE);
 OutputPathHandle=FindFirstChangeNotification(Outputpath.c_str(),false,FILE_NOTIFY_CHANGE_LAST_WRITE);     //啟動InputDirectoryCheck Thread
 TThreadCheckInput *ThreadCheckInput=new TThreadCheckInput(true);
 ThreadCheckInput->Resume();
 //End     //啟動OutputDirectoryCheck Thread
 TThreadCheckOutput *ThreadCheckOutput=new TThreadCheckOutput(true);
 ThreadCheckOutput->Resume();
 //End     MMDES->SetKey(Key128);
 MMDES->GenerateKey("TIWGODIE");
 MMDES->GetKey(Key128);     DS_Client->Open();
 S2MM_Server->Open();
 MMServer_Receiver->Open();
 MM2S_Server->Open();    }
//---------------------------------------------------------------------------
//傳送Serverlet列表到Directory Service
void __fastcall TForm1::DS_ClientWrite(TObject *Sender,
      TCustomWinSocket *Socket)
{
 int FileFound=FindFirst(Serverletpath "*.exe",Attr,FileRec);
 while (FileFound==0)
 {
  Socket->SendText(FileRec.Name);
  ServerletList->Items->Add(FileRec.Name);
  Sleep(2);
  FileFound=FindNext(FileRec);
 }
}
//---------------------------------------------------------------------------
//接收由Directory Service傳來的資料
void __fastcall TForm1::MMServer_ReceiverClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
     Form1->Show();
     TMemoryStream *receive=new TMemoryStream();
     int buf_len=Socket->ReceiveLength();
     char *pData = new char[buf_len];
     memset(pData, 0, buf_len);
     Socket->ReceiveBuf(pData,buf_len);
     //Sleep(2);
     receive->Write(pData,buf_len);
     receive->SaveToFile(CurrentDir "\\Input\\MACE140116039126.tmp");
     MMDES->DecryptFileA(CurrentDir "\\Input\\MACE140116039126.tmp",CurrentDir "\\Input\\MACE140116039126.agn");
     //Sleep(2);
     DeleteFile(CurrentDir "\\Input\\MACE140116039126.tmp");
     delete [] pData;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::InputDirectoryChange()        //監看Input子目錄下的資料
{
 DWORD result;     result=MsgWaitForMultipleObjects(1,&InputPathHandle,false,INFINITE,QS_ALLINPUT);
 if(result==WAIT_OBJECT_0)
  {
   Agentparser();
   FindNextChangeNotification(InputPathHandle);
   Application->ProcessMessages();
  }
 else
  {
   Application->ProcessMessages();
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OutputDirectoryChange()
{
 DWORD result;     result=MsgWaitForMultipleObjects(1,&OutputPathHandle,false,INFINITE,QS_ALLINPUT);
 if(result==WAIT_OBJECT_0)
  {
   Launcher();
   FindNextChangeNotification(OutputPathHandle);
   Application->ProcessMessages();
  }
 else
  {
   Application->ProcessMessages();
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Launcher()
{
 TSearchRec Output_sr;     int FileFound=FindFirst(Outputpath "*.agn",faAnyFile,Output_sr);
   while(FileFound==0)
   {
    //讀取在Outputpath下的Agent檔案
    TMemoryStream *sendstream=new TMemoryStream();
    sendstream->LoadFromFile(Outputpath Output_sr.Name);
    //End
    //連上下一個MM Server傳輸
    MM_Launcher_Client->Port=7777;
    MM_Launcher_Client->Address=IPConverter(NextIP);
    MM_Launcher_Client->Open();        MM_Launcher_Client->Socket->SendStream(sendstream);        MM_Launcher_Client->Close();        //End
    DeleteFile(Outputpath Output_sr.Name);
    FileFound=FindNext(Output_sr);
   }
 FindClose(Output_sr);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Agentparser()
{
 TSearchRec Input_sr;     //Serverlet執行參數設定
 STARTUPINFO si;
 PROCESS_INFORMATION pi;     ZeroMemory(&si, sizeof(si));
 si.cb=sizeof(si);
 ZeroMemory(&pi, sizeof(pi));
 //END     AnsiString AgentID;
 AnsiString CS_Item,PS_Item;
 AnsiString CS_IP,PS_IP;
 AnsiString CS_name,PS_name;
 AnsiString PS_argument;
 int FileFound=FindFirst(Inputpath "*.agn",faAnyFile,Input_sr);
  while(FileFound==0)
  {
   AnsiString agenttext="";
   TMemoryStream *filestream=new TMemoryStream();
   filestream->LoadFromFile(Inputpath Input_sr.Name);
   //設一個AnsiString 紀錄Input子目錄下的行動代理者名稱
   agentname=Input_sr.Name;
   //End
   MoveFile((Inputpath Input_sr.Name).c_str(),(Temppath Input_sr.Name).c_str());
   char *pData = new char[filestream->Size 1];
   memset(pData,0,filestream->Size 1);
   memcpy(pData,filestream->Memory,filestream->Size);
   //Edit1->Text=pData;
   agenttext=pData;
   Memo1->Text=agenttext;       //Debug
   DeleteFile(Inputpath Input_sr.Name);
   delete [] pData;       //處理行動代理者內容
   AgentID=agenttext.SubString(agenttext.Pos("") 4,agenttext.Pos("")-(agenttext.Pos("") 4));       CS=agenttext.SubString(agenttext.Pos("") 4,agenttext.Pos("")-(agenttext.Pos("") 4));
   PS=agenttext.SubString(agenttext.Pos("") 4,agenttext.Pos("
")-(agenttext.Pos("") 4));       int left,right;
   left=agenttext.Pos("") 5 CS.Length() 1;
   right=agenttext.Pos("")-(agenttext.Pos("") 5 CS.Length() 1);       CS_Item=agenttext.SubString(left,right);       left=agenttext.Pos("") 5 PS.Length() 1;
   right=agenttext.Pos("")-(agenttext.Pos("") 5 PS.Length() 1);       PS_Item=agenttext.SubString(left,right);       CS_IP=CS_Item.SubString(CS_Item.Pos("") 4,CS_Item.Pos("")-(CS_Item.Pos("") 4));
   PS_IP=PS_Item.SubString(PS_Item.Pos("") 4,PS_Item.Pos("")-(PS_Item.Pos("") 4));       CS_name=CS_Item.SubString(CS_Item.Pos("") 13,CS_Item.Pos("")-(CS_Item.Pos("") 13));
   PS_name=PS_Item.SubString(PS_Item.Pos("") 13,PS_Item.Pos("")-(PS_Item.Pos("") 13));       CS_argument=CS_Item.SubString(CS_Item.Pos("") 10,CS_Item.Pos("")-(CS_Item.Pos("") 10));
   PS_argument=PS_Item.SubString(PS_Item.Pos("") 10,PS_Item.Pos("")-(PS_Item.Pos("") 10));       //LbRSA1->PrivateKey->LoadFromFile(ExtractFilePath(Application->ExeName) "privatekey");      //DEBUG
   //Edit1->Text=LbRSA1->DecryptString(CS_argument);                                            //DEBUG       //argument_stream->SetSize(CS_argument.Length());       //memcpy(argument_stream->Memory,CS_argument.c_str(),CS_argument.Length());       AnsiString Serverletexecpath=Serverletpath CS_name;       if(!CreateProcess(Serverletexecpath.c_str(),NULL,NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))  //呼叫Serverlet起來run
    {
       ShowMessage("CreateProcess failed!" IntToStr(GetLastError()));
    }       Application->ProcessMessages();       delete filestream;
   FileFound=FindNext(Input_sr);
  }
 FindClose(Input_sr);
}
//---------------------------------------------------------------------------    void __fastcall TForm1::MM2S_ServerClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
    for(int i=0;iSocket->ActiveConnections;i  )
    {
     MM2S_Server->Socket->Connections[i]->SendText(CS_argument);
    }
}
//---------------------------------------------------------------------------    void __fastcall TForm1::S2MM_ServerClientRead(TObject *Sender,  //Mace Main接收Serverlet運算的結果(加密後)
      TCustomWinSocket *Socket)
{
 int buf_len=Socket->ReceiveLength();
 char *pData=new char[buf_len 1];
 memset(pData,0,buf_len 1);
 Socket->ReceiveBuf(pData,buf_len);
 encrypted_result=pData;                           //加密的result
 Edit1->Text=pData;     //debug     //讀原先存在Temp子目錄下的agent資料
 AnsiString fullagent="";
 TMemoryStream *tempstream=new TMemoryStream();
 tempstream->LoadFromFile(Temppath agentname);
 char *buffer=new char[tempstream->Size 1];
 memset(buffer,0,tempstream->Size 1);
 memcpy(buffer,tempstream->Memory,tempstream->Size);
 fullagent=buffer;                                 //fullagent裡面為temp資料夾內暫存的agent
 //Edit1->Text=buffer;
 //Memo1->Text=buffer;
 DeleteFile(Temppath agentname); //刪除Temp資料
 delete [] buffer;        //free
 delete [] pData;         //free     /*包裝Agent開始*/
 //包裝成行動代理者標準格式(*.agn)
 /*****************注意***********************/
 /*          Result值並沒有排序              */
 /********************************************/
 //加入Result值
 int l_index,r_index;
 l_index=fullagent.Pos("") 9;
 AnsiString addstring="" "Data" "" encrypted_result "";
 fullagent.Insert(addstring,l_index);
 //END     //變更CS與PS之欄位     //PS
 l_index=fullagent.Pos("") 4;
 r_index=fullagent.Pos("
");
 int PS_num=StrToInt(fullagent.SubString(l_index,r_index-l_index));
 fullagent.Delete(l_index,PS.Length());
 PS_num  ;
 fullagent.Insert(IntToStr(PS_num),l_index);
 //END     //CS
 l_index=fullagent.Pos("") 4;
 r_index=fullagent.Pos("");
 int CS_num=StrToInt(fullagent.SubString(l_index,r_index-l_index));
 fullagent.Delete(l_index,CS.Length());
 CS_num  ;
 fullagent.Insert(IntToStr(CS_num),l_index);     //END     //找尋下一個IP
 l_index=fullagent.Pos("") 6 IntToStr(CS_num).Length();
 r_index=fullagent.Pos("");
 AnsiString C_Item=fullagent.SubString(l_index,r_index-l_index);     NextIP=C_Item.SubString(C_Item.Pos("") 4,C_Item.Pos("")-(C_Item.Pos("") 4));
 //END     //Memo1->Text=fullagent;    //DEBUG     //加密並存檔到Output子目錄下
 TMemoryStream *agentstream=new TMemoryStream();
 TMemoryStream *encrypt_stream=new TMemoryStream();
 agentstream->SetSize(fullagent.Length());
 memcpy(agentstream->Memory,fullagent.c_str(),fullagent.Length());
 MMDES->EncryptStream(agentstream,encrypt_stream);
 encrypt_stream->SaveToFile(Outputpath agentname);     //End
 //free
 delete agentstream;
 delete encrypt_stream;
 //end    }
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::IPConverter(AnsiString IP) //轉換IP用(把140116039126->140.116.39.126)
{
 AnsiString ip1,ip2,ip3,ip4;
 ip1=IP.SubString(1,3);
 ip2=IP.SubString(4,3);
 ip3=IP.SubString(7,3);
 ip4=IP.SubString(10,3);
 AnsiString realIP=IntToStr(ip1.ToInt()) "." IntToStr(ip2.ToInt()) "." IntToStr(ip3.ToInt()) "." IntToStr(ip4.ToInt());
 return realIP;
}
//--------------------------------------------------------------------------- 
InputDirectoryThread部份 ===================================================================== __fastcall TThreadCheckInput::TThreadCheckInput(bool CreateSuspended) : TThread(CreateSuspended) { } //--------------------------------------------------------------------------- void __fastcall TThreadCheckInput::Execute() { while(!Terminated) { Synchronize(Loop); ::Sleep(0); } //---- Place thread code here ---- } //--------------------------------------------------------------------------- void __fastcall TThreadCheckInput::Loop() { Form1->InputDirectoryChange(); } //--------------------------------------------------------------------------- OutputDirectoryThread部份 ===================================================================== //--------------------------------------------------------------------------- __fastcall TThreadCheckOutput::TThreadCheckOutput(bool CreateSuspended) : TThread(CreateSuspended) { } //--------------------------------------------------------------------------- void __fastcall TThreadCheckOutput::Execute() { while(!Terminated) { Synchronize(Loop); ::Sleep(0); } //---- Place thread code here ---- } //--------------------------------------------------------------------------- void __fastcall TThreadCheckOutput::Loop() { Form1->OutputDirectoryChange(); } //--------------------------------------------------------------------------- 程式有點長,我也不知道要怎麼問起,所以只好全部貼,謝謝包子哥的回應,小弟感激不盡,我會先去試包子哥給我的連結,對了,剛剛看了一下,發現有這個部分,查MSDN並沒有相關資料 BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_COPYDATA, TMessage, WMCopyData) END_MESSAGE_MAP(TForm) 這個BEGIN_MESSAGE_MAP是什麼意思??
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-13 00:47:39 IP:61.221.xxx.xxx 未訂閱
引言:
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "LbCipher"
#pragma link "LbClass"
#pragma link "LbAsym"
#pragma link "LbRSA"
#pragma resource "*.dfm"
TSearchRec FileRec;
int Attr=faAnyFile;
TForm1 *Form1;
AnsiString CurrentDir,Inputpath,Outputpath,Temppath;
AnsiString Serverletpath;
AnsiString agentname;
TKey128 Key128;
HANDLE InputPathHandle,OutputPathHandle;
AnsiString CS_argument,encrypted_result;
AnsiString CS,PS;
AnsiString NextIP;    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 DS_Client->Host="127.0.0.1";//先假定內部傳輸,應該為140.116.39.126
 DS_Client->Port=6666;     MMServer_Receiver->Port=7777;
 MM2S_Server->Port=8888;
 S2MM_Server->Port=5555;     CurrentDir=GetCurrentDir();
 Serverletpath=CurrentDir "\\..\\Serverlet\\";
 Inputpath=CurrentDir "\\Input\\";
 Outputpath=CurrentDir "\\Output\\";
 Temppath=CurrentDir "\\Temp\\";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 InputPathHandle=FindFirstChangeNotification(Inputpath.c_str(),false,FILE_NOTIFY_CHANGE_LAST_WRITE);
 OutputPathHandle=FindFirstChangeNotification(Outputpath.c_str(),false,FILE_NOTIFY_CHANGE_LAST_WRITE);     //啟動InputDirectoryCheck Thread
 TThreadCheckInput *ThreadCheckInput=new TThreadCheckInput(true);
 ThreadCheckInput->Resume();
 //End     //啟動OutputDirectoryCheck Thread
 TThreadCheckOutput *ThreadCheckOutput=new TThreadCheckOutput(true);
 ThreadCheckOutput->Resume();
 //End     MMDES->SetKey(Key128);
 MMDES->GenerateKey("TIWGODIE");
 MMDES->GetKey(Key128);     DS_Client->Open();
 S2MM_Server->Open();
 MMServer_Receiver->Open();
 MM2S_Server->Open();    }
//---------------------------------------------------------------------------
//傳送Serverlet列表到Directory Service
void __fastcall TForm1::DS_ClientWrite(TObject *Sender,
      TCustomWinSocket *Socket)
{
 int FileFound=FindFirst(Serverletpath "*.exe",Attr,FileRec);
 while (FileFound==0)
 {
  Socket->SendText(FileRec.Name);
  ServerletList->Items->Add(FileRec.Name);
  Sleep(2);
  FileFound=FindNext(FileRec);
 }
}
//---------------------------------------------------------------------------
//接收由Directory Service傳來的資料
void __fastcall TForm1::MMServer_ReceiverClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
     Form1->Show();
     TMemoryStream *receive=new TMemoryStream();
     int buf_len=Socket->ReceiveLength();
     char *pData = new char[buf_len];
     memset(pData, 0, buf_len);
     Socket->ReceiveBuf(pData,buf_len);
     //Sleep(2);
     receive->Write(pData,buf_len);
     receive->SaveToFile(CurrentDir "\\Input\\MACE140116039126.tmp");
     MMDES->DecryptFileA(CurrentDir "\\Input\\MACE140116039126.tmp",CurrentDir "\\Input\\MACE140116039126.agn");
     //Sleep(2);
     DeleteFile(CurrentDir "\\Input\\MACE140116039126.tmp");
     delete [] pData;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::InputDirectoryChange()        //監看Input子目錄下的資料
{
 DWORD result;     result=MsgWaitForMultipleObjects(1,&InputPathHandle,false,INFINITE,QS_ALLINPUT);
 if(result==WAIT_OBJECT_0)
  {
   Agentparser();
   FindNextChangeNotification(InputPathHandle);
   Application->ProcessMessages();
  }
 else
  {
   Application->ProcessMessages();
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OutputDirectoryChange()
{
 DWORD result;     result=MsgWaitForMultipleObjects(1,&OutputPathHandle,false,INFINITE,QS_ALLINPUT);
 if(result==WAIT_OBJECT_0)
  {
   Launcher();
   FindNextChangeNotification(OutputPathHandle);
   Application->ProcessMessages();
  }
 else
  {
   Application->ProcessMessages();
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Launcher()
{
 TSearchRec Output_sr;     int FileFound=FindFirst(Outputpath "*.agn",faAnyFile,Output_sr);
   while(FileFound==0)
   {
    //讀取在Outputpath下的Agent檔案
    TMemoryStream *sendstream=new TMemoryStream();
    sendstream->LoadFromFile(Outputpath Output_sr.Name);
    //End
    //連上下一個MM Server傳輸
    MM_Launcher_Client->Port=7777;
    MM_Launcher_Client->Address=IPConverter(NextIP);
    MM_Launcher_Client->Open();        MM_Launcher_Client->Socket->SendStream(sendstream);        MM_Launcher_Client->Close();        //End
    DeleteFile(Outputpath Output_sr.Name);
    FileFound=FindNext(Output_sr);
   }
 FindClose(Output_sr);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Agentparser()
{
 TSearchRec Input_sr;     //Serverlet執行參數設定
 STARTUPINFO si;
 PROCESS_INFORMATION pi;     ZeroMemory(&si, sizeof(si));
 si.cb=sizeof(si);
 ZeroMemory(&pi, sizeof(pi));
 //END     AnsiString AgentID;
 AnsiString CS_Item,PS_Item;
 AnsiString CS_IP,PS_IP;
 AnsiString CS_name,PS_name;
 AnsiString PS_argument;
 int FileFound=FindFirst(Inputpath "*.agn",faAnyFile,Input_sr);
  while(FileFound==0)
  {
   AnsiString agenttext="";
   TMemoryStream *filestream=new TMemoryStream();
   filestream->LoadFromFile(Inputpath Input_sr.Name);
   //設一個AnsiString 紀錄Input子目錄下的行動代理者名稱
   agentname=Input_sr.Name;
   //End
   MoveFile((Inputpath Input_sr.Name).c_str(),(Temppath Input_sr.Name).c_str());
   char *pData = new char[filestream->Size 1];
   memset(pData,0,filestream->Size 1);
   memcpy(pData,filestream->Memory,filestream->Size);
   //Edit1->Text=pData;
   agenttext=pData;
   Memo1->Text=agenttext;       //Debug
   DeleteFile(Inputpath Input_sr.Name);
   delete [] pData;       //處理行動代理者內容
   AgentID=agenttext.SubString(agenttext.Pos("") 4,agenttext.Pos("")-(agenttext.Pos("") 4));       CS=agenttext.SubString(agenttext.Pos("") 4,agenttext.Pos("")-(agenttext.Pos("") 4));
   PS=agenttext.SubString(agenttext.Pos("") 4,agenttext.Pos("
")-(agenttext.Pos("") 4));       int left,right;
   left=agenttext.Pos("") 5 CS.Length() 1;
   right=agenttext.Pos("")-(agenttext.Pos("") 5 CS.Length() 1);       CS_Item=agenttext.SubString(left,right);       left=agenttext.Pos("") 5 PS.Length() 1;
   right=agenttext.Pos("")-(agenttext.Pos("") 5 PS.Length() 1);       PS_Item=agenttext.SubString(left,right);       CS_IP=CS_Item.SubString(CS_Item.Pos("") 4,CS_Item.Pos("")-(CS_Item.Pos("") 4));
   PS_IP=PS_Item.SubString(PS_Item.Pos("") 4,PS_Item.Pos("")-(PS_Item.Pos("") 4));       CS_name=CS_Item.SubString(CS_Item.Pos("") 13,CS_Item.Pos("")-(CS_Item.Pos("") 13));
   PS_name=PS_Item.SubString(PS_Item.Pos("") 13,PS_Item.Pos("")-(PS_Item.Pos("") 13));       CS_argument=CS_Item.SubString(CS_Item.Pos("") 10,CS_Item.Pos("")-(CS_Item.Pos("") 10));
   PS_argument=PS_Item.SubString(PS_Item.Pos("") 10,PS_Item.Pos("")-(PS_Item.Pos("") 10));       //LbRSA1->PrivateKey->LoadFromFile(ExtractFilePath(Application->ExeName) "privatekey");      //DEBUG
   //Edit1->Text=LbRSA1->DecryptString(CS_argument);                                            //DEBUG       //argument_stream->SetSize(CS_argument.Length());       //memcpy(argument_stream->Memory,CS_argument.c_str(),CS_argument.Length());       AnsiString Serverletexecpath=Serverletpath CS_name;       if(!CreateProcess(Serverletexecpath.c_str(),NULL,NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))  //呼叫Serverlet起來run
    {
       ShowMessage("CreateProcess failed!" IntToStr(GetLastError()));
    }       Application->ProcessMessages();       delete filestream;
   FileFound=FindNext(Input_sr);
  }
 FindClose(Input_sr);
}
//---------------------------------------------------------------------------    void __fastcall TForm1::MM2S_ServerClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
    for(int i=0;iSocket->ActiveConnections;i  )
    {
     MM2S_Server->Socket->Connections[i]->SendText(CS_argument);
    }
}
//---------------------------------------------------------------------------    void __fastcall TForm1::S2MM_ServerClientRead(TObject *Sender,  //Mace Main接收Serverlet運算的結果(加密後)
      TCustomWinSocket *Socket)
{
 int buf_len=Socket->ReceiveLength();
 char *pData=new char[buf_len 1];
 memset(pData,0,buf_len 1);
 Socket->ReceiveBuf(pData,buf_len);
 encrypted_result=pData;                           //加密的result
 Edit1->Text=pData;     //debug     //讀原先存在Temp子目錄下的agent資料
 AnsiString fullagent="";
 TMemoryStream *tempstream=new TMemoryStream();
 tempstream->LoadFromFile(Temppath agentname);
 char *buffer=new char[tempstream->Size 1];
 memset(buffer,0,tempstream->Size 1);
 memcpy(buffer,tempstream->Memory,tempstream->Size);
 fullagent=buffer;                                 //fullagent裡面為temp資料夾內暫存的agent
 //Edit1->Text=buffer;
 //Memo1->Text=buffer;
 DeleteFile(Temppath agentname); //刪除Temp資料
 delete [] buffer;        //free
 delete [] pData;         //free     /*包裝Agent開始*/
 //包裝成行動代理者標準格式(*.agn)
 /*****************注意***********************/
 /*          Result值並沒有排序              */
 /********************************************/
 //加入Result值
 int l_index,r_index;
 l_index=fullagent.Pos("") 9;
 AnsiString addstring="" "Data" "" encrypted_result "";
 fullagent.Insert(addstring,l_index);
 //END     //變更CS與PS之欄位     //PS
 l_index=fullagent.Pos("") 4;
 r_index=fullagent.Pos("
");
 int PS_num=StrToInt(fullagent.SubString(l_index,r_index-l_index));
 fullagent.Delete(l_index,PS.Length());
 PS_num  ;
 fullagent.Insert(IntToStr(PS_num),l_index);
 //END     //CS
 l_index=fullagent.Pos("") 4;
 r_index=fullagent.Pos("");
 int CS_num=StrToInt(fullagent.SubString(l_index,r_index-l_index));
 fullagent.Delete(l_index,CS.Length());
 CS_num  ;
 fullagent.Insert(IntToStr(CS_num),l_index);     //END     //找尋下一個IP
 l_index=fullagent.Pos("") 6 IntToStr(CS_num).Length();
 r_index=fullagent.Pos("");
 AnsiString C_Item=fullagent.SubString(l_index,r_index-l_index);     NextIP=C_Item.SubString(C_Item.Pos("") 4,C_Item.Pos("")-(C_Item.Pos("") 4));
 //END     //Memo1->Text=fullagent;    //DEBUG     //加密並存檔到Output子目錄下
 TMemoryStream *agentstream=new TMemoryStream();
 TMemoryStream *encrypt_stream=new TMemoryStream();
 agentstream->SetSize(fullagent.Length());
 memcpy(agentstream->Memory,fullagent.c_str(),fullagent.Length());
 MMDES->EncryptStream(agentstream,encrypt_stream);
 encrypt_stream->SaveToFile(Outputpath agentname);     //End
 //free
 delete agentstream;
 delete encrypt_stream;
 //end    }
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::IPConverter(AnsiString IP) //轉換IP用(把140116039126->140.116.39.126)
{
 AnsiString ip1,ip2,ip3,ip4;
 ip1=IP.SubString(1,3);
 ip2=IP.SubString(4,3);
 ip3=IP.SubString(7,3);
 ip4=IP.SubString(10,3);
 AnsiString realIP=IntToStr(ip1.ToInt()) "." IntToStr(ip2.ToInt()) "." IntToStr(ip3.ToInt()) "." IntToStr(ip4.ToInt());
 return realIP;
}
//--------------------------------------------------------------------------- 
InputDirectoryThread部份 ===================================================================== __fastcall TThreadCheckInput::TThreadCheckInput(bool CreateSuspended) : TThread(CreateSuspended) { } //--------------------------------------------------------------------------- void __fastcall TThreadCheckInput::Execute() { while(!Terminated) { Synchronize(Loop); ::Sleep(0); } //---- Place thread code here ---- } //--------------------------------------------------------------------------- void __fastcall TThreadCheckInput::Loop() { Form1->InputDirectoryChange(); } //--------------------------------------------------------------------------- OutputDirectoryThread部份 ===================================================================== //--------------------------------------------------------------------------- __fastcall TThreadCheckOutput::TThreadCheckOutput(bool CreateSuspended) : TThread(CreateSuspended) { } //--------------------------------------------------------------------------- void __fastcall TThreadCheckOutput::Execute() { while(!Terminated) { Synchronize(Loop); ::Sleep(0); } //---- Place thread code here ---- } //--------------------------------------------------------------------------- void __fastcall TThreadCheckOutput::Loop() { Form1->OutputDirectoryChange(); } //--------------------------------------------------------------------------- 程式有點長,我也不知道要怎麼問起,所以只好全部貼,謝謝包子哥的回應,小弟感激不盡,我會先去試包子哥給我的連結,對了,剛剛看了一下,發現有這個部分,查MSDN並沒有相關資料 BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_COPYDATA, TMessage, WMCopyData) END_MESSAGE_MAP(TForm) 這個BEGIN_MESSAGE_MAP是什麼意思??
willchen 你好:
(1)啊< >,你的程式果然滿長的,小弟我應該是沒有辦法幫你看了< >
(2)BEGIN_MESSAGE_MAP 不是 M$DN 裡面的東西,要查詢 BCB Help
    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-13 04:22:22 IP:211.74.xxx.xxx 未訂閱
多謝版主的幫忙,我剛剛才把包子哥的連結自己用程式寫了一遍,也看了相關的help介紹,我想請問包子哥的是,在內部傳值時,Receiver端,要怎麼來接收Sender傳過來的資料??(程式裡面並沒有所謂的接收,只有使用 COPYDATASTRUCT *CopyData=(COPYDATASTRUCT*)(Message.LParam)) 我看得懂sender的部分,但Receiver的部分,要怎樣的event產生成市才會接收??
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-13 09:00:42 IP:203.73.xxx.xxx 未訂閱
引言: 多謝版主的幫忙,我剛剛才把包子哥的連結自己用程式寫了一遍,也看了相關的help介紹,我想請問包子哥的是,在內部傳值時,Receiver端,要怎麼來接收Sender傳過來的資料??(程式裡面並沒有所謂的接收,只有使用 COPYDATASTRUCT *CopyData=(COPYDATASTRUCT*)(Message.LParam)) 我看得懂sender的部分,但Receiver的部分,要怎樣的event產生成市才會接收??
willchen 你好:
(1)請問你所說的「內部」是什麼意思呢?? 是指同一個  >
( >
    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-13 13:27:13 IP:211.74.xxx.xxx 未訂閱
請問一下版主,那如果我的程式是以兩個不同的project寫的,也就是兩個程式都是以Form1的型態存在,兩個程式是分開來寫的,而不是一個Application有兩個Form存在(我昨天試的是一個Application有兩個Form存在,一個Form為Sender,另一個為ReceiveForm)但我不希望這樣,我希望的是兩個Form都是獨立個體(不同Project)請問版主,這樣可以傳訊嗎??
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-13 13:44:30 IP:203.73.xxx.xxx 未訂閱
引言: 請問一下版主,那如果我的程式是以兩個不同的project寫的,也就是兩個程式都是以Form1的型態存在,兩個程式是分開來寫的,而不是一個Application有兩個Form存在(我昨天試的是一個Application有兩個Form存在,一個Form為Sender,另一個為ReceiveForm)但我不希望這樣,我希望的是兩個Form都是獨立個體(不同Project)請問版主,這樣可以傳訊嗎??
willchen 你好:

當然可以

而且每個 Form 都可以同時扮演 Sender/Receiver 兩種角色 建議你自己試試看,就可以明白我在說什麼了 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
系統時間:2024-05-17 9:50:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!