还是多线程通信有关问题,请求妖哥来解答
还是多线程通信问题,请求妖哥来解答
主要代码如下:Unit_Main.cpp ,Unit_Ping.cpp ,Unit_ADOQ.cpp ,
还有一个Unit_DM就没有写了,里面就是一个ado连接
主要代码如下:Unit_Main.cpp ,Unit_Ping.cpp ,Unit_ADOQ.cpp ,
还有一个Unit_DM就没有写了,里面就是一个ado连接
- C/C++ code
************************************************************************ Unit_Main.cpp文件 //--------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit_Main.h" #include "Unit_DM.h" #include "Unit_Ping.h" #include "Unit_ADOQ.h" //--------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { thread_ADOQ = new TADOQThread(false,PingResultMemo); thread_Ping=new TPingThread(true, "192.168.1.1", PingResultMemo, thread_ADOQ->ThreadID); thread_Ping->Resume(); } //--------------------------------------- Unit_Main.h文件里声明了: TPingThread * thread_Ping; TADOQThread * thread_ADOQ; TMemo *PingResultMemo; ************************************************************************ Unit_Ping.cpp文件 //--------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit_Ping.h" #include "Unit_DM.h" #define MY_MSG WM_USER+100 #pragma package(smart_init) //--------------------------------------- // Important: Methods and properties of objects in VCL can only be // used in a method called using Synchronize, for example: // // Synchronize(UpdateCaption); // // where UpdateCaption could look like: // // void __fastcall TPingThread::UpdateCaption() // { // Form1->Caption = "Updated in a thread"; // } //--------------------------------------- __fastcall TPingThread::TPingThread(bool CreateSuspended,AnsiString sIp,TMemo *ResultMemo,int thread_ADOQ_ID) : TThread(CreateSuspended) { IP = sIp; BMemo = ResultMemo; Interval = 10000; ADOQ_ID = thread_ADOQ_ID; ICMP_Ping= new TIdIcmpClient(NULL); ICMP_Ping->BufferSize = 8192; ICMP_Ping->Port = 0; ICMP_Ping->Protocol = 1; ICMP_Ping->ReceiveTimeout = 5000; ICMP_Ping->Host = IP; ICMP_Ping->OnReply = ICMP_PingReply; } //--------------------------------------- __fastcall TPingThread::~TPingThread() { delete ICMP_Ping; } //---------------------------------------- void __fastcall TPingThread::Execute() { //---- Place thread code here ---- while( !Suspended ) { try { ICMP_Ping->Ping(); Application->ProcessMessages(); Sleep(Interval); } catch(...) { Suspended = true; } } } //--------------------------------------- void __fastcall TPingThread::ICMP_PingReply(TComponent *ASender, const TReplyStatus &AReplyStatus) { AnsiString S ; if( AReplyStatus.ReplyStatusType == rsEcho ) { BMemo->Lines->Add( Now().CurrentDateTime().FormatString("yyyyMMdd HH:mm:ss") + AnsiString(";") + IP + AnsiString(";Ping 成功!") ); S = AnsiString("update hx_monitor set Ping文字状态=") + AnsiString("'Ping 成功!'") + AnsiString(" where IP地址=") + AnsiString("'") + IP + AnsiString("'") ; if( PostThreadMessage(ADOQ_ID,MY_MSG,(WPARAM)S.c_str(),0) ) { BMemo->Lines->Add( Now().CurrentDateTime().FormatString("yyyyMMdd HH:mm:ss") + AnsiString(";") + IP + AnsiString("发送消息成功!线程ID:") + AnsiString(ADOQ_ID) ); } if( !PostThreadMessage(ADOQ_ID,MY_MSG,(WPARAM)S.c_str(),0) ) { BMemo->Lines->Add( Now().CurrentDateTime().FormatString("yyyyMMdd HH:mm:ss") + AnsiString(";") + IP + AnsiString("发送消息不成功!错误号:") + AnsiString(GetLastError()) + AnsiString(";线程ID:") + AnsiString(ADOQ_ID) ); } } } //--------------------------------------- Unit_Ping.h文件声明了: TIdIcmpClient *ICMP_Ping; TMemo * BMemo; AnsiString IP; int Interval; int ADOQ_ID; ************************************************************************ Unit_ADOQ.cpp文件 //--------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit_ADOQ.h" #include "Unit_DM.h" #define MY_MSG WM_USER+100 #pragma package(smart_init) //--------------------------------------- // Important: Methods and properties of objects in VCL can only be // used in a method called using Synchronize, for example: // // Synchronize(UpdateCaption); // // where UpdateCaption could look like: // // void __fastcall TADOQThread::UpdateCaption() // { // Form1->Caption = "Updated in a thread"; // } //--------------------------------------- __fastcall TADOQThread::TADOQThread(bool CreateSuspended,TMemo *ResultMemo) : TThread(CreateSuspended) { CMemo = ResultMemo; //PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE); } //--------------------------------------- void __fastcall TADOQThread::Execute() { //---- Place thread code here ---- CoInitialize(NULL); ADOQ_update_status = new TADOQuery(NULL); ADOQ_update_status->Connection = DM->ADOConn_226_11;//Unit_DM里面的连接 while( !Suspended ) { GetMessage(&msg,0,0,0); switch(msg.message) { case MY_MSG: char * pInfo= (char *)msg.wParam; CMemo->Lines->Add( Now().CurrentDateTime().FormatString("yyyyMMdd HH:mm:ss") + AnsiString("接收到的消息如下:") + AnsiString(pInfo) ); if( AnsiString(pInfo).Trim() != "" ) { ADOQ_update_status->SQL->Clear(); ADOQ_update_status->SQL->Add( AnsiString(pInfo) ); ADOQ_update_status->ExecSQL(); } } } delete ADOQ_update_status; CoUninitialize(); } //--------------------------------------- Unit_ADOQ.h声明了: TMemo * CMemo; MSG msg; TADOQuery * ADOQ_update_status; ************************************************************************