社区
进程/线程/DLL
帖子详情
使用_beginthreadex创建线程失败
shootingstars
2003-08-20 02:36:03
函数返回的句柄正确,但是过了一会儿显示
Debug Error
Programe:........
R6016
- not enough space for thread data
在线程函数中设置断点按F5,程序未运行到断点处。
为什么,那位出现过这种情况,是由于什么情况造成的?
...全文
125
2
打赏
收藏
使用_beginthreadex创建线程失败
函数返回的句柄正确,但是过了一会儿显示 Debug Error Programe:........ R6016 - not enough space for thread data 在线程函数中设置断点按F5,程序未运行到断点处。 为什么,那位出现过这种情况,是由于什么情况造成的?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
shootingstars
2003-08-20
打赏
举报
回复
是不是连接的库不对?
UP,请求援助。。。
DDHuang
2003-08-20
打赏
举报
回复
咋会呢,没空间??
CreateThread
创建
多
线
程与单
线
程比较
仿多
线
程的效果一般有2种办法:第一种是通过定时器;第二种是启动多
线
程,不同模式下启动函数不同,mfc与API与WIN32下面注意点也是有区别的! VC启动一个新
线
程的三种方法,有需要的朋友可以参考下。 第一种AfxBeginThread() 用AfxBeginThread()函数来
创建
一个新
线
程来执行任务,工作者
线
程的AfxBeginThread的原型如下: CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID lParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );//用于
创建
工作者
线
程 返回值: 成功时返回一个指向新
线
程的
线
程对象的指针,否则NULL。 pfnThreadProc :
线
程的入口函数,声明一定要如下: UINT MyThreadFunction(LPVOID pParam),不能设置为NULL; pParam : 传递入
线
程的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体入
线
程. nPriority :
线
程的优先级,一般设置为 0 .让它和主
线
程具有共同的优先级. nStackSize : 指定新
创建
的
线
程的栈的大小.如果为 0,新
创建
的
线
程具有和主
线
程一样的大小的栈 dwCreateFlags : 指定
创建
线
程以后,
线
程有怎么样的标志.可以指定两个值: CREATE_SUSPENDED :
线
程
创建
以后,会处于挂起状态,直到调用:ResumeThread 0 :
创建
线
程后就开始运行. lpSecurityAttrs : 指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新
创建
线
程的安全性.如果为 NULL, 那么新
创建
的
线
程就具有和主
线
程一样的安全性. 如果要在
线
程内结束
线
程,可以在
线
程内调用 AfxEndThread. 一般直接用AfxBeginThread(ThreadProc,this); 示例: UINT myproc(LPVOID lParam){CITTDlg *pWnd = (CITTDlg *)lParam; //将窗口指针赋给无类型指针pWnd->KMeansSegment(); //要执行的函数return 1;}void CITTDlg::KMeansSegment(){// 主要处理函数在这里写}void CITTDlg::OnKMeansSegment() //按钮点击执行{AfxBeginThread(myproc, (LPVOID)this);//启动新的
线
程} 注意,工作者
线
程的函数必须是全局函数或静态成员函数,不能是普通的成员函数。 第二种CreateThread()函数原型为:HANDLECreateThread( NULL, // 没有安全描述符 0, // 默认
线
程栈的大小 MyThreadProc, //
线
程函数指针,即函数名 (LPVOID)&n, // 传递参数 NULL, // 没有附加属性 NULL // 不需要获得
线
程号码 ); CreatThread,它返回的是一个句柄;如果不需要再监视
线
程,则用CloseHandle()关闭
线
程句柄。
线
程的函数必须定义为: DWORD WINAPI MyThreadProc(LPVOID pParameter); 下面演示多
线
程操作控件,点击一个Button然后运行一个
线
程,将字符串显示在CEdit控件里面; 示例: .h头文件struct hS {CString Tmp;CTestDlg *hWnd; };//定义全局结构体,用来传递自定义消息DWORD WINAPI ThreadProc(LPVOIDlpParam);//
线
程函数声明,全局函数public: CString chtmp; struct hS *hTmp;protected: HANDLE m_hThread;//
线
程句柄 CEdit m_Edit;.cpp实现文件//
线
程执行函数DWORD WINAPI ThreadProc(LPVOID lpParam){//在这里写处理函数struct hS *Tmp2;Tmp2 = (hS*)lpParam;// 操作: Tmp2->hWnd->m_Edit.SetWindowText( (LPTSTR)Tmp2->Tmp );}void CTestDlg::OnBnClickedButton1(){ hTmp->Tmp = chtmp; hTmp->hWnd = this;//关键是把this指针传进去 m_hThread =CreateThread(NULL,0,ThreadProc,hTmp,0,NULL);//
创建
新
线
程 CloseHandle(m_hThread );} 用CreateThread()函数
创建
线
程将返回一个
线
程句柄,通过该句柄你可以控制和操作该
线
程,当你不用时可以一
创建
该
线
程后就关闭该句柄,有专门的函CloseHandle()。关闭句柄不代表关闭
线
程,只是你不能在外部控制该
线
程(比如,提前结束,更改优先级等)。在
线
程结束后,系统将自动清理
线
程资源,但并不自动关闭该句柄,所以
线
程结束后要记得关闭该句柄。 第三种_beginthread() 函数原型为:intptr_t _beginthread( void( *start_address )( void * ), //指向新
线
程调用的函数的起始地址 unsigned stack_size, //堆栈大小,设置0为系统默认值 void *arglist //传递给
线
程函数的参数,没有则为NULL ); 返回值: 假如成功,函数将会返回一个新
线
程的句柄,用户可以像这样声明一个句柄变量存储返回值: HANDLE hStdOut = _beginthread( CheckKey, 0, NULL )。如果
失败
_beginthread将返回-1。所在库文件: #include
线
程函数的定义: 对于_beginthread()
创建
的
线
程,其
线
程函数定义为: void ThreadPro(void * pArguments );
_beginthreadex
()为_beginthread()的升级版。 总结:AfxBeginThread是MFC的全局函数,是对CreateThread的封装。 CreateThread是Win32 API函数,AfxBeginThread最终要调到CreateThread。而_beginthread是C的运行库函数。
socket 动态链接库
这是我自己编写的 测试好使通过 //======================================================================== //绑定协议栈-TCPServer mode //======================================================================== int dllBindTCPSockServer(SOCKADDR_IN pSockAddr,RECV_DATA_CALLBACK DataCallBack, VOID* pContext) { int res = 0; //Create Socket if(glb_SockTCPServer!=NULL) { OutputDebugString("套接字已存在!"); return -1; } glb_SockTCPServer = socket(AF_INET,SOCK_STREAM,0); //Create Socket res = WSAGetLastError(); if(res) { glb_SockTCPServer = NULL; OutputDebugString("套接字建立
失败
!"); return res; } pSockAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); pSockAddr.sin_family=AF_INET; pSockAddr.sin_port = htons(pSockAddr.sin_port); res = bind(glb_SockTCPServer,(SOCKADDR*)&pSockAddr,sizeof(SOCKADDR)); if(res) { OutputDebugString("绑定
失败
!"); closesocket(glb_SockTCPServer); glb_SockTCPServer = NULL; return res; } OutputDebugString("绑定成功!"); res = listen(glb_SockTCPServer,5); if(res) { OutputDebugString("监听
失败
!"); closesocket(glb_SockTCPServer); glb_SockTCPServer = NULL; return res; } OutputDebugString("开始网络监听..."); //Register RecvDataCallBackServer glb_lpFunCallBackTCPServer = DataCallBack; glb_pContext = pContext; //Create ListenThread UINT (WINAPI * pFnStartAddr)(LPVOID); pFnStartAddr = WinSockListenThread; glb_WinSockListenThread = (HANDLE)
_beginthreadex
(NULL, 0, pFnStartAddr, NULL, 0,//0 for running, CREATE_SUSPENDED NULL); if (glb_WinSockListenThread==NULL) { OutputDebugString("
创建
监听
线
程
失败
!"); closesocket(glb_SockTCPServer); glb_SockTCPServer = NULL; glb_WinSockListenThread = NULL; return -2; } return 0; }
C++
使用
_beginthreadex
创建
线
程、
线
程句柄(等待
线
程关闭)、
线
程id的作用(发送
线
程消息)
_beginthreadex
c语言库 process.h 中的函数, 用来
创建
一个
线
程 unsignedlong
_beginthreadex
( void*security,//安全属性,为NULL时表示默认安全性 unsignedstack_size,//
线
程的堆栈大小,一般默认为0 ...
用
_beginthreadex
创建
线
程
http://jialinwang.blog.163.com/blog/static/1014026912009415113716375/用
_beginthreadex
创建
线
程
_beginthreadex
参数说明 unsigned long
_beginthreadex
( void *security, unsignedstack_size, unsigned ( __std
_beginthreadex
创建
多
线
程解读
一、解释 (1)如果你正在编写C/C++代码,决不应该调用CreateThread。相反,应该
使用
VisualC++运行期库函数
_beginthreadex
,退出也应该
使用
_endthreadex。如果不
使用
Microsoft的VisualC++编译器,你的编译器供应商有它自己的CreateThread替代函数。不管这个替代函数是什么,你都必须
使用
。 (2)因为
_beginthreadex
和_en...
进程/线程/DLL
15,471
社区成员
49,181
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章