在线程中使用INDY的正确方法?如果方法正确了主界面就不会"阻塞"了吗?

qsgs 2006-01-13 12:48:50
我试着在线里使用IdTCPClient,可是程序界面仍然会被"阻塞",直到IdTCPClient执行完毕.
是不是我的方法不正确呢?谁有过成功的例子给我一个好吗?
相关代码:

void __fastcall TfrmMain::btnConnectClick(TObject *Sender)
{
ThreadC1 *Thread1=new ThreadC1(true);
Thread1->FreeOnTerminate=true;
Thread1->Priority=tpLower;
Thread1->Resume();
}


void __fastcall ThreadC1::Execute()
{

this->Synchronize(Connect1);

}
//---------------------------------------------------------------------------

void __fastcall ThreadC1::Connect1()
{
try
{
frmMain->IdTCPClient1->Disconnect();
frmMain->IdTCPClient1->Host=frmMain->edtRemoteIP->Text;
frmMain->IdTCPClient1->Port=StrToInt(frmMain->edtPort->Text);
frmMain->IdTCPClient1->Connect();
}
catch(Exception &e)
{
ShowMessage(e.Message);
}
}
...全文
245 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qsgs 2006-01-17
  • 打赏
  • 举报
回复
自己试吧,结贴
xzlzrsl 2006-01-16
  • 打赏
  • 举报
回复
以前,做程序时也遇到类似的问题。感觉Indy或者bcb自己的clientsocket都不是很好用,在主线程或者子窗口还好,但是一旦到没有窗口的线程中就不好用,总是出现莫名其妙的问题。最头疼的是在客户端开的线程多了(我的程序是7个是分水岭),服务器和别的客户端(7个线程以下)都没有问题,总要延时10秒左右才有结果或没有结果,我在以前提出该类问题,但是没有人能回答。后来还是不用控件,完全用API完成sockt通讯,效果不错,你可以试试。
constantine 2006-01-16
  • 打赏
  • 举报
回复
类似这样我不用Synchronize
Synchronize不是把它丢给main thread 吗
那么这样做跟没有用线程有什么区别
qsgs 2006-01-16
  • 打赏
  • 举报
回复
类似这样我不用Synchronize
Synchronize不是把它丢给main thread 吗
那么这样做跟没有用线程有什么区别
---------------------------------------
果然如您所说,不用Synchronize就好了.
那么如果不用Synchronize,不同的进程同时用到frmMain->IdTCPClient1,会有冲突吗?
我还没试,不知您是如何解决的?
qsgs 2006-01-15
  • 打赏
  • 举报
回复
试过降优先级,没有什么作用呀
qsgs 2006-01-13
  • 打赏
  • 举报
回复
已经放了一个TIdAntiFreeze在里面,好像没什么用处
sfengnet 2006-01-13
  • 打赏
  • 举报
回复
将线程的优先级降低

1,317

社区成员

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

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