社区
进程/线程/DLL
帖子详情
如何得到_beginthreadex创建的线程的运行情况?
aj3423
2007-04-09 09:27:36
我有这样一个线程函数
unsigned __stdcall ThreadFunc(LPVOID args) {
int ret=0;
if(网络通畅) ret = 1;
return ( (DWORD)ret);
}
我用_beginthreadex函数来使用这个线程,我看msdn上说_beginthreadex的返回值是这个线程的HANDLE,究竟怎样可以知道线程的运行情况呢?
...全文
296
6
打赏
收藏
如何得到_beginthreadex创建的线程的运行情况?
我有这样一个线程函数 unsigned __stdcall ThreadFunc(LPVOID args) { int ret=0; if(网络通畅) ret = 1; return ( (DWORD)ret); } 我用_beginthreadex函数来使用这个线程,我看msdn上说_beginthreadex的返回值是这个线程的HANDLE,究竟怎样可以知道线程的运行情况呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
珍惜生命远离CPP
2007-04-10
打赏
举报
回复
你要的是
线程的运行情况
而GetExitCodeThread 是得到线程退出的状态,这是两码事
aj3423
2007-04-09
打赏
举报
回复
谢谢楼上2位 马上结贴,
不过我找到一个函数 GetExitCodeThread 可以看线程返回值,这个比较方便,不知道什么情况下不能用这个函数 一定要用回调呢?
珍惜生命远离CPP
2007-04-09
打赏
举报
回复
robotom(robotom)
这个.....你的代码也太多了吧
class CCallback {
public:
void event(DWORD){
}内容自己写.
};
这个需要在创建线程的时候传递一个CCallback 对象的指针
unsigned __stdcall ThreadFunc(LPVOID args) {
CCallback* p= args;
int ret=0;
if(网络通畅)
p->event( 网络通畅 );
}
robotom
2007-04-09
打赏
举报
回复
akirya的想法实现起来比较方便。
struct CThreadStatus {
int nStatus; //线程运行状态码
};
class CCallback {
public:
CCallback();
virutal ~CCallback();
virtual long OnCallback( CThreadStatus * pStatus ); //status就可以是运行状态。
};
};
aj3423
2007-04-09
打赏
举报
回复
请问能够具体一点吗?
珍惜生命远离CPP
2007-04-09
打赏
举报
回复
传递一个指针过去,由线程来回调
C++多
线
程编程
线
程函数是另一个
线
程的入口函数.默认
情况
下我们所写的代码都是只有一个
线
程的, 而这个
线
程的入口函数是main() 函数, 这是系统默认的. 而我们
创建
的另一个
线
程也需要一个函数来进入, 这个函数叫做
线
程函数. 在C/C++中, 可以调用 '
运行
期库' 函数
_beginthreadex
(…), 来
创建
一个
线
程,
_beginthreadex
(…)函数接受6个参数, 其中第3个参数要求传入该
线
程的入口函数的地址(即:传入
线
程函数的函数名+&即可), 其它的每个参数的意思可以在msdn或网上查一下, 入门的话其余参数全部传0即可.
_beginthreadex
(…)函数返回一个句柄,
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的
运行
库函数。
C/C++ 多
线
程的学习心得总结
个人觉得在学习多
线
程编程之前最好先了解进程和
线
程的关系, 然后在学习
线
程工作方式的过程中动手写个(我是从抄开始的)多
线
程的小程序, 会对学习多
线
程有很大的帮助, 否则只有理论是很抽象的.在学习多
线
程编程之前, 必须先知道什么是
线
程函数,
线
程函数就是另一个
线
程的入口函数. 默认
情况
下一个我们所写的代码都是只有一个
线
程的, 而这个
线
程的入口函数就是main() 函数, 这是系统默认的. 而我们
创建
的另一个
线
程也需要一个函数来进入, 这个函数就叫做
线
程函数.在C/C++中, 可以调用 ‘
运行
期库’ 函数
_beginthreadex
(…), 来
创建
一个
线
程,
_beginthreadex
(…)函
c++ win32
线
程同步5大方案例程
本人用c++实现的win32
线
程同步方案归纳,简洁明了,只用做给新手的基本演示,
创建
线
程所用函数为微软c
运行
时库的
_beginthreadex
,是微软最推荐使用的函数。 总共5种
线
程同步方案:事件、信号量、全局变量、临界区、互斥量。
CreateThread()与beginthread()的区别详细解析
我们知道在Windows下
创建
一个
线
程的方法有两种,一种就是调用Windows API CreateThread()来
创建
线
程;另外一种就是调用MSVC CRT的函数_beginthread()或
_beginthreadex
()来
创建
线
程。相应的退出
线
程也有两个函数Windows API的ExitThread()和CRT的_endthread()。这两套函数都是用来
创建
和退出
线
程的,它们有什么区别呢? 很多开发者不清楚这两者之间的关系,他们随意选一个函数来用,发现也没有什么大问题,于是就忙于解决更为紧迫的任务去了,而没有对它们进行深究。等到有一天忽然发现一个程序
运行
时间很长的时候会有细微的内存
进程/线程/DLL
15,471
社区成员
49,181
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章