关于ThreadEnd事件

jinxintang 2006-06-07 11:55:00
本人用阻塞式多线程编写了一个小程序,其中线程部分如下:

void __fastcall TMyServerThread::ClientExecute(void)
{
// make sure connection is active
while (!Terminated && ClientSocket->Connected)
{
try
{
// Now, use TWinSocketStream to read or write information
// over a blocking socket connection
TWinSocketStream *pStream = new TWinSocketStream(ClientSocket, CLIENTWAITTIME);

try
{
char buffer[BUFFERSIZE];
memset( buffer, 0, sizeof(buffer) );

// give the client 60 seconds to start writing
if (pStream->WaitForData(CLIENTWAITTIME))
{
if (pStream->Read(buffer, sizeof(buffer)) == 0)
// (if can't read in 60 seconds) than close the connection
ClientSocket->Close();
else
{
// Client to Server test text
Form1->memLog->Lines->Add(AnsiString("(Client) ") +AnsiString(buffer) );

// Back again to Client
pStream->Write( buffer, sizeof(buffer));
}

// ...
// Process requests here.
// ...
}
}
__finally
{
delete pStream;
}
}
catch (...)
{
HandleException();
}
}

}

现在有个问题是:我在客户端调用Client->Close();服务器端只出发了ClientDisconnect事件,并没有出发ThreadEnd事件。
当我关闭服务器端程序时却响应了ThreadEnd事件,我在该事件中只有一行代码:memLog->Lines->Add("ThreadEnd");程序总是报地址访问违例的错误。memLog是个TMemo。


...全文
283 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinxintang 2006-06-07
  • 打赏
  • 举报
回复
把ThreadCacheSize设为0,也不响应
jinxintang 2006-06-07
  • 打赏
  • 举报
回复
那为什么会报错呢???
我把memLog->Lines->Add("ThreadEnd");换成了ShowMessage("ThreadEnd"););
当我关闭窗口时,也会响应ThreadEnd事件但却不弹出窗口。前台程序关闭了(界面和windows任务栏都没了),但在任务管理器中还能看到此进程。
pp616 2006-06-07
  • 打赏
  • 举报
回复
TCustomServerSocket::ThreadCacheSize
Specifies the maximum number of threads that can be reused for new client connections.

如果想关闭客户端就响应ThreadEnd 把ThreadCacheSize设为0试试
我不懂电脑 2006-06-07
  • 打赏
  • 举报
回复
因为服务器使用了线程池机制,所以关闭客户端不一定会引起线程结束。
我不懂电脑 2006-06-07
  • 打赏
  • 举报
回复
那为什么会报错呢???
如果使用了象TButton这样的界面控件要用同步方法Synchronize

1,317

社区成员

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

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