尝试用过createthread创建线程调用函数的做法,
DBHandle=::CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)HandleConnect,(LPVOID)ClientSock,0,&dwThread);
HandleConnect的函数定义如下:
void HandleConnect(SOCKET insocket)
{
……
}
CreateThread创建后没有对它做任何释放好象并没有出现内存泄露状况(不知道是不是由于没有strcpy,new和mallooc等操作的缘故),但是当频繁创建的时候发现内存迅速增加
如下
while (Loop)
{
_NewMainProc();
sleep(10);
}void mComm::_NewMainProc()
{
int i;
HANDLE DBHandle;
DWORD dwThread;
ti=0;
for (i=0;i<MAXNUM;i++)
{
if (Connected!=NULL)
{
DBHandle=::CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)_Handle_Connection,(LPVOID)i,0,&dwThread);
}
}
}在_Handle_Connection中有strcpy,new和mallooc等操作,有人说应该用_beginthreadex?是不是这样的情况,如果是在beginthreadex中调用函数的形式是什么,如何传递参数?
例如调用void HandleConnect(int i)另外对与CreateThread是不是也应该进行资源释放操作?该怎么释放?
DBHandle=::CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)HandleConnect,(LPVOID)ClientSock,0,&dwThread);
HandleConnect的函数定义如下:
void HandleConnect(SOCKET insocket)
{
……
}
CreateThread创建后没有对它做任何释放好象并没有出现内存泄露状况(不知道是不是由于没有strcpy,new和mallooc等操作的缘故),但是当频繁创建的时候发现内存迅速增加
如下
while (Loop)
{
_NewMainProc();
sleep(10);
}void mComm::_NewMainProc()
{
int i;
HANDLE DBHandle;
DWORD dwThread;
ti=0;
for (i=0;i<MAXNUM;i++)
{
if (Connected!=NULL)
{
DBHandle=::CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)_Handle_Connection,(LPVOID)i,0,&dwThread);
}
}
}在_Handle_Connection中有strcpy,new和mallooc等操作,有人说应该用_beginthreadex?是不是这样的情况,如果是在beginthreadex中调用函数的形式是什么,如何传递参数?
例如调用void HandleConnect(int i)另外对与CreateThread是不是也应该进行资源释放操作?该怎么释放?
解决方案 »
- 一个VC与JS交互的问题
- CFtpFileFind 返回的目录名错误 着急!!
- 如何模拟键盘回车,达到新起一行的目的?
- 同样的代码在OnPaint中有正常的效果,而在OnEraseBkgnd中却没有显示出来,这是为什么?
- Static Text如何往里面写文本,请指教!
- 如何在视图中以二进制形式显示数据.谢谢.
- #define ON_WM_CREATE() 为什么被定义成如下德行。
- 关于packet32中PacketSendPacket函数的调用?
- 为什么我用CListCtrl::InsertItem,总返回-1????
- 谁有兴趣看一下这个测试报告-------------->>
- ??????怎么在一个listctrl中的subitem里显示多个图标?
- 请问如何可以改变 ComboBox 控件 左侧 下拉按钮的宽度??以及下拉菜单 List 中垂直滚动条的宽度?谢谢各位!!!
LPVOID lpParameter // thread data
);
楼主用一个强制转型将一个类型不正确的函数地址传入了CreateThread ,应该取消那个强制转型, 如果编译不能通过,则说明你的线程函数定义不正确.
如果你要强制停止线程就要用TerminateThread(),但是在线程里面要响应这个并且释放你malloc分配的内存,不然会泄漏。你的循环内存消耗增加是正常的,看看是不是到一个峰值就不再增长了。如果还是继续增长,那么就可能是哪里泄漏了。
_beginthreadex使用方法和CreateThread差不多,不过线程函数有点差别。具体参数含义MSDN里很详细,调用后无需释放句柄。
如果用MFC,一定要用AfxBeginThread而不要用别的函数。正常情况下,不要用TerminateThread,因为被终结的线程 *绝对* 没有任何机会做任何工作,包括内存、资源的释放,要用信号的机制来告诉一个县城该结束了,然后等待县城结束。