社区
进程/线程/DLL
帖子详情
已知线程的句柄(m_hThread)如何获得线程的指针(MyThread *)
xlxl
2000-09-13 09:43:00
请教各位大虾:
如何根据一个线程的句柄,如m_hThread 或 m_ThreadID, 获得该线程的指针呢,因为接下来我要调用相应线程的成员函数.
...全文
168
3
打赏
收藏
已知线程的句柄(m_hThread)如何获得线程的指针(MyThread *)
请教各位大虾: 如何根据一个线程的句柄,如m_hThread 或 m_ThreadID, 获得该线程的指针呢,因为接下来我要调用相应线程的成员函数.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xlxl
2000-09-14
打赏
举报
回复
谢谢 Holly 大虾
MyThread 是从 CWinThread 来的,看来是不太方便,其实我的问题是,开发一个ODBC的驱动程序,我想针对每个用户的 语句句柄--SQLHSTMT , NEW 一个类,以便在该类里保存相应的中间数据,如结果集,变量集,以便进行处理,但ODBC API 的相关函数都是以刚才的 语句句柄 作为上下文的,所以我的问题就是如何根据一个句柄找到相应的类,是不是只能自己写个数组或LIST来处理了。用SDK怎么实现呢?
netsong
2000-09-14
打赏
举报
回复
listen
Holly
2000-09-13
打赏
举报
回复
不明白MyThread是哪里来的?
如果是继承于CWinThread,对不起,不简单的转换!
你有什么功能一定要class实现,用SDK不好吗?SDK能作的,MFC不一定能作,但MFC能作的SDK一定能作!
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
MyThread
Function(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, // 默认
线
程栈的大小
MyThread
Proc, //
线
程函数
指针
,即函数名 (LPVOID)&n, // 传递参数 NULL, // 没有附加属性 NULL // 不需要
获得
线
程号码 ); CreatThread,它返回的是一个句
柄
;如果不需要再监视
线
程,则用CloseHandle()关闭
线
程句
柄
。
线
程的函数必须定义为: DWORD WINAPI
MyThread
Proc(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++多
线
程的创建挂起执行与销毁
1. 创建一个基于对话框的应用程序。并增加如图所示控件;分别为3个进度条控件关联三个进度条类型的变量;并在对话框的初始化函数中,设定进度条的范围;为编辑框关联一个整型的变量;为12个按钮添加消息处理函数; 2. 定义结构体:用做
线
程函数的参数传递 typedef struct Threadinfo{ CProgressCtrl *progress;//进度条对象 int speed; //进度条速度 int pos; //进度条位置 } thread,*lpthread; 3. 为对话框增加三个句
柄
,用于标识各个
线
程; HANDLE hThread1; //
线
程1
线
程句
柄
HANDLE hThread2; //
线
程2
线
程句
柄
HANDLE hThread3; //
线
程3
线
程句
柄
在增加三个结构体类型的变量,用做
线
程函数的参数传递; HANDLE hThread1; //
线
程1
线
程句
柄
HANDLE hThread2; //
线
程2
线
程句
柄
HANDLE hThread3; //
线
程3
线
程句
柄
4. 新增一个静态的全局变量,用于记录所有
线
程的状态:static int GlobalVar=10000; 5. 声明并编写
线
程函数,注意只能有一个参数,且函数的返回值类型也是固定的;函数名可以自定义; DWORD WINAPI ThreadFun(LPVOID pthread);//
线
程入口函数 6. 在启动按钮的消息处理函数中编写如下代码: thread1.progress=&m_progress1;//进度条对象 thread1.speed=100;//速度 thread1.pos=0;//初始位置 hThread1=CreateThread(NULL,0,ThreadFun,&thread1;,0,0);//创建并开始
线
程 if (!hThread1) { MessageBox("创建
线
程失败"); } 7. 编写
线
程函数(一般是一个死循环,或者需要花费时间很长的算法!否者就失去了多
线
程的意义) DWORD WINAPI ThreadFun(LPVOID pthread) //
线
程入口函数 { lpthread temp=(lpthread)pthread;//参数强制转换为结构体类型 temp->progress->SetPos(temp->pos); //设置被传递过来的进度条的位置 while(temp->posspeed); /设置速度 temp->pos++; //增加进度 temp->progress->SetPos(temp->pos); //设置进度条的新位置 GlobalVar--; if(temp->pos==20) { temp->pos=0; //进度条满则归0 } } return true; } 8. 在挂起按钮函数中,编写如下代码: if(SuspendThread(hThread1)==0xFFFFFFFF) { MessageBox("挂起失败!进程可能已经死亡或未创建!"); return; } 9. 在执行按钮函数中,编写如下代码: if(ResumeThread(hThread1)==0xFFFFFFFF) { MessageBox("执行失败!进程可能已经死亡或未创建!"); return; } 10. 在停止按钮函数中,编写如下代码: if(TerminateThread(hThread1,0))//前些终止
线
程 { CloseHandle(hThread1);//销毁
线
程句
柄
} else { MessageBox("终止进程失败!"); } 11. 为应用程序添加WM_TIMER消息,实时更新全局变量的值到编辑框;
线
程句
柄
及 ::WaitForSingleObject(
m_hThread
, 0)
线
程句
柄
,可以粗略的理解为
线
程的地址,通过这个句
柄
可以找到对应的
线
程,进而对
线
程进行操作。
线
程句
柄
关闭并不意味着
线
程结束,只是减少了该
线
程的引用。 如果
线
程启动后,不需要对它进行别的操作,即可调用::CloseHandle(
m_hThread
)关闭
线
程句
柄
。 ::WaitForSingleObject(
m_hThread
, 0),传入的参数若为
线
程句
柄
,
线
程正常运行时,为...
WaitForSingleObject 等待
线
程句
柄
http://blog.csdn.net/dyzhen/article/details/5993396 WaitForSingleObject(hThread/*某个
线
程的句
柄
*/,INFINITE)可以吗? hThread代表的
线
程如果在运行,就要一直等下去,直到
线
程退出来吗? 如果是这样,就是说我等到的时候,
线
程已经退出了?我还需要调用类似于ReleaseSema
java
线
程句
柄
_
线
程与
线
程句
柄
今天温习很久前写的代码,发现自己写的这么一句代码,m_hTheard = CreateThread(NULL,0,RegNotifyProc,LPVOID(this),0,NULL);CloseHandle(m_hTheard);突然给糊涂了,刚创建的
线
程,为什么有close了,还是当初入门不踏实,没有细想,现在反过来都记不得了,通过查资料,解决了我的疑惑。1,
线
程和
线
程句
柄
(Handle)不同,...
进程/线程/DLL
15,471
社区成员
49,181
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章