如何编写idtcpclient接收数据的线程

封姜大粒 2010-07-23 03:52:59
第一次写线程,查了些资料但是写出来总是报错。
头文件

class TClientThread : public TThread
{
private:
void __fastcall Execute();
public:
__fastcall TClientThread(void);
};

cpp

TClientThread *ClientThread;
//---------------------------------------------------------------------------
__fastcall TClientThread::TClientThread(void) : TThread(true)
{
FreeOnTerminate = true;
Resume();
}
//---------------------------------------------------------------------------
void __fastcall TClientThread::Execute()
{
while(!Terminated)
{
if(!MainForm->IdTCPClient1->Connected())
{
Terminate();
}
else
{
try
{
AnsiString receiveMessage = MainForm->IdTCPClient1->ReadLn(); //读取数据然后在reditMessage显示
MainForm->reditMessage->Lines->Add(receiveMessage);
}
catch(...)
{
MainForm->reditMessage->Lines->Add("Err");
}
}
}
}
//-------------------------------------------------------------------------
void __fastcall TMainForm::IdTCPClient1Connected(TObject *Sender)
{
ClientThread = new TClientThread; //连接后创建线程
}
//-------------------------------------------------------------------------
void __fastcall TMainForm::IdTCPClient1Disconnected(TObject *Sender)
{
ClientThread-> Terminate(); //断开后释放线程
IdTCPClient1->Disconnect();
}
//---------------------------------------------------------------------------
...全文
218 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
我不懂电脑 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yuzess 的回复:]
引用 1 楼 cppfile 的回复:
在线程中操作主界面的控件,需要用sync.. 包起来,你创建线程以后,上面一大段注释就是说这个的

你的这些都有问题

AnsiString receiveMessage = MainForm->IdTCPClient1->ReadLn(); //读取数据然后在reditMessage显示
MainForm->reditMessage->Line……
[/Quote]

就是它
__fastcall TEnumeratorThread::TEnumeratorThread(TMemo* Memo)
: TThread(true)
{
/* Initialize internal fields */
m_Memo = Memo;
m_CurrNbr = 0;
m_Stop = 0;
}

void __fastcall TEnumeratorThread::Execute()
{
/* Repeat the loop until the flag says otherwise. */
while (!m_Stop)
{
/* Wait for 100 milliseconds. */
Sleep(100);

/*
Run the AddNewNumberToMemo procedure on the main thread.
This makes it safe to access GUI from this thread.
*/
Synchronize(AddNewNumberToMemo);
}

m_Stop = 0;
}

void __fastcall TEnumeratorThread::GentleStop()
{
/* Set the flag to 1. */
InterlockedIncrement(&m_Stop);

/* Wait for this thread to finish executing */
this->WaitFor();
}

void __fastcall TEnumeratorThread::AddNewNumberToMemo()
{
/* Increase the current number and add it to the memo. */
m_CurrNbr++;
m_Memo->Lines->Add(IntToStr(m_CurrNbr));
}
CppFile 2010-07-23
  • 打赏
  • 举报
回复
搜索一下吧,很多内容的

 void __fastcall TNewThread::PushTheButton(void)
  
  {
   Button1->Click();
  }
  
  void __fastcall TNewThread::Execute()
  {
   ...
   Synchronize((TThreadMethod)PushTheButton);
   ...
  }

封姜大粒 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cppfile 的回复:]
在线程中操作主界面的控件,需要用sync.. 包起来,你创建线程以后,上面一大段注释就是说这个的

你的这些都有问题

AnsiString receiveMessage = MainForm->IdTCPClient1->ReadLn(); //读取数据然后在reditMessage显示
MainForm->reditMessage->Lines->Add(receiveMes……
[/Quote]
是不是Synchronize()?
能不能再详细一点啊,非常感谢
CppFile 2010-07-23
  • 打赏
  • 举报
回复
在线程中操作主界面的控件,需要用sync.. 包起来,你创建线程以后,上面一大段注释就是说这个的

你的这些都有问题

AnsiString receiveMessage = MainForm->IdTCPClient1->ReadLn(); //读取数据然后在reditMessage显示
MainForm->reditMessage->Lines->Add(receiveMessage);
}
catch(...)
{
MainForm->reditMessage->Lines->Add("Err");

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧