willchen
初階會員
發表:64 回覆:81 積分:29 註冊:2003-05-23
發送簡訊給我
|
各位高手好,小弟最近實作遇到一個很棘手的問題,程式執行速率很慢(我的執行方式是由一個執行檔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
發送簡訊給我
|
引言:
各位高手好,小弟最近實作遇到一個很棘手的問題,程式執行速率很慢(我的執行方式是由一個執行檔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
發送簡訊給我
|
//--------------------------------------------------------------------------- #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
發送簡訊給我
|
引言:
//--------------------------------------------------------------------------- #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
發送簡訊給我
|
多謝版主的幫忙,我剛剛才把包子哥的連結自己用程式寫了一遍,也看了相關的help介紹,我想請問包子哥的是,在內部傳值時,Receiver端,要怎麼來接收Sender傳過來的資料??(程式裡面並沒有所謂的接收,只有使用
COPYDATASTRUCT *CopyData=(COPYDATASTRUCT*)(Message.LParam))
我看得懂sender的部分,但Receiver的部分,要怎樣的event產生成市才會接收??
|
RaynorPao
版主
發表:139 回覆:3622 積分:7025 註冊:2002-08-12
發送簡訊給我
|
引言:
多謝版主的幫忙,我剛剛才把包子哥的連結自己用程式寫了一遍,也看了相關的help介紹,我想請問包子哥的是,在內部傳值時,Receiver端,要怎麼來接收Sender傳過來的資料??(程式裡面並沒有所謂的接收,只有使用
COPYDATASTRUCT *CopyData=(COPYDATASTRUCT*)(Message.LParam))
我看得懂sender的部分,但Receiver的部分,要怎樣的event產生成市才會接收??
willchen 你好:
(1)請問你所說的「內部」是什麼意思呢?? 是指同一個 >
( >
> --
------ -- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
|
willchen
初階會員
發表:64 回覆:81 積分:29 註冊:2003-05-23
發送簡訊給我
|
請問一下版主,那如果我的程式是以兩個不同的project寫的,也就是兩個程式都是以Form1的型態存在,兩個程式是分開來寫的,而不是一個Application有兩個Form存在(我昨天試的是一個Application有兩個Form存在,一個Form為Sender,另一個為ReceiveForm)但我不希望這樣,我希望的是兩個Form都是獨立個體(不同Project)請問版主,這樣可以傳訊嗎??
|
RaynorPao
版主
發表:139 回覆:3622 積分:7025 註冊:2002-08-12
發送簡訊給我
|
引言:
請問一下版主,那如果我的程式是以兩個不同的project寫的,也就是兩個程式都是以Form1的型態存在,兩個程式是分開來寫的,而不是一個Application有兩個Form存在(我昨天試的是一個Application有兩個Form存在,一個Form為Sender,另一個為ReceiveForm)但我不希望這樣,我希望的是兩個Form都是獨立個體(不同Project)請問版主,這樣可以傳訊嗎??
willchen 你好:
當然可以
而且每個 Form 都可以同時扮演 Sender/Receiver 兩種角色
建議你自己試試看,就可以明白我在說什麼了 --
------ -- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
|