社区
进程/线程/DLL
帖子详情
已知线程的句柄(m_hThread)如何获得线程的指针(MyThread *)
xlxl
2000-09-13 09:43:00
请教各位大虾:
如何根据一个线程的句柄,如m_hThread 或 m_ThreadID, 获得该线程的指针呢,因为接下来我要调用相应线程的成员函数.
...全文
173
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一定能作!
Create
Thread
创建多
线程
与单
线程
比较
仿多
线程
的效果一般有2种办法:第一种是通过定时器;第二种是启动多
线程
,不同模式下启动函数不同,mfc与API与WIN32下面注意点也是有区别的! VC启动一个新
线程
的三种方法,有需要的朋友可以参考下。 第一种AfxBegin
Thread
() 用AfxBegin
Thread
()函数来创建一个新
线程
来执行任务,工作者
线程
的AfxBegin
Thread
的原型如下: CWin
Thread
* AfxBegin
Thread
(AFX_
THREAD
PROC pfn
Thread
Proc, LPVOID lParam, int nPriority =
THREAD
_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );//用于创建工作者
线程
返回值: 成功时返回一个指向新
线程
的
线程
对象的
指针
,否则NULL。 pfn
Thread
Proc :
线程
的入口函数,声明一定要如下: UINT My
Thread
Function(LPVOID pParam),不能设置为NULL; pParam : 传递入
线程
的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体入
线程
. nPriority :
线程
的优先级,一般设置为 0 .让它和主
线程
具有共同的优先级. nStackSize : 指定新创建的
线程
的栈的大小.如果为 0,新创建的
线程
具有和主
线程
一样的大小的栈 dwCreateFlags : 指定创建
线程
以后,
线程
有怎么样的标志.可以指定两个值: CREATE_SUSPENDED :
线程
创建以后,会处于挂起状态,直到调用:Resume
Thread
0 : 创建
线程
后就开始运行. lpSecurityAttrs : 指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新创建
线程
的安全性.如果为 NULL, 那么新创建的
线程
就具有和主
线程
一样的安全性. 如果要在
线程
内结束
线程
,可以在
线程
内调用 AfxEnd
Thread
. 一般直接用AfxBegin
Thread
(
Thread
Proc,this); 示例: UINT myproc(LPVOID lParam){CITTDlg *pWnd = (CITTDlg *)lParam; //将窗口
指针
赋给无类型
指针
pWnd->KMeansSegment(); //要执行的函数return 1;}void CITTDlg::KMeansSegment(){// 主要处理函数在这里写}void CITTDlg::OnKMeansSegment() //按钮点击执行{AfxBegin
Thread
(myproc, (LPVOID)this);//启动新的
线程
} 注意,工作者
线程
的函数必须是全局函数或静态成员函数,不能是普通的成员函数。 第二种Create
Thread
()函数原型为:HANDLECreate
Thread
( NULL, // 没有安全描述符 0, // 默认
线程
栈的大小 My
Thread
Proc, //
线程
函数
指针
,即函数名 (LPVOID)&n, // 传递参数 NULL, // 没有附加属性 NULL // 不需要
获得
线程
号码 ); Creat
Thread
,它返回的是一个
句柄
;如果不需要再监视
线程
,则用CloseHandle()关闭
线程
句柄
。
线程
的函数必须定义为: DWORD WINAPI My
Thread
Proc(LPVOID pParameter); 下面演示多
线程
操作控件,点击一个Button然后运行一个
线程
,将字符串显示在CEdit控件里面; 示例: .h头文件struct hS {CString Tmp;CTestDlg *hWnd; };//定义全局结构体,用来传递自定义消息DWORD WINAPI
Thread
Proc(LPVOIDlpParam);//
线程
函数声明,全局函数public: CString chtmp; struct hS *hTmp;protected: HANDLE m_h
Thread
;//
线程
句柄
CEdit m_Edit;.cpp实现文件//
线程
执行函数DWORD WINAPI
Thread
Proc(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_h
Thread
=Create
Thread
(NULL,0,
Thread
Proc,hTmp,0,NULL);//创建新
线程
CloseHandle(m_h
Thread
);} 用Create
Thread
()函数创建
线程
将返回一个
线程
句柄
,通过该
句柄
你可以控制和操作该
线程
,当你不用时可以一创建该
线程
后就关闭该
句柄
,有专门的函CloseHandle()。关闭
句柄
不代表关闭
线程
,只是你不能在外部控制该
线程
(比如,提前结束,更改优先级等)。在
线程
结束后,系统将自动清理
线程
资源,但并不自动关闭该
句柄
,所以
线程
结束后要记得关闭该
句柄
。 第三种_begin
thread
() 函数原型为:intptr_t _begin
thread
( void( *start_address )( void * ), //指向新
线程
调用的函数的起始地址 unsigned stack_size, //堆栈大小,设置0为系统默认值 void *arglist //传递给
线程
函数的参数,没有则为NULL ); 返回值: 假如成功,函数将会返回一个新
线程
的
句柄
,用户可以像这样声明一个
句柄
变量存储返回值: HANDLE hStdOut = _begin
thread
( CheckKey, 0, NULL )。如果失败_begin
thread
将返回-1。所在库文件: #include
线程
函数的定义: 对于_begin
thread
()创建的
线程
,其
线程
函数定义为: void
Thread
Pro(void * pArguments ); _begin
thread
ex()为_begin
thread
()的升级版。 总结:AfxBegin
Thread
是MFC的全局函数,是对Create
Thread
的封装。 Create
Thread
是Win32 API函数,AfxBegin
Thread
最终要调到Create
Thread
。而_begin
thread
是C的运行库函数。
c++多
线程
的创建挂起执行与销毁
1. 创建一个基于对话框的应用程序。并增加如图所示控件;分别为3个进度条控件关联三个进度条类型的变量;并在对话框的初始化函数中,设定进度条的范围;为编辑框关联一个整型的变量;为12个按钮添加消息处理函数; 2. 定义结构体:用做
线程
函数的参数传递 typedef struct
Thread
info{ CProgressCtrl *progress;//进度条对象 int speed; //进度条速度 int pos; //进度条位置 }
thread
,*lp
thread
; 3. 为对话框增加三个
句柄
,用于标识各个
线程
; HANDLE h
Thread
1; //
线程
1
线程
句柄
HANDLE h
Thread
2; //
线程
2
线程
句柄
HANDLE h
Thread
3; //
线程
3
线程
句柄
在增加三个结构体类型的变量,用做
线程
函数的参数传递; HANDLE h
Thread
1; //
线程
1
线程
句柄
HANDLE h
Thread
2; //
线程
2
线程
句柄
HANDLE h
Thread
3; //
线程
3
线程
句柄
4. 新增一个静态的全局变量,用于记录所有
线程
的状态:static int GlobalVar=10000; 5. 声明并编写
线程
函数,注意只能有一个参数,且函数的返回值类型也是固定的;函数名可以自定义; DWORD WINAPI
Thread
Fun(LPVOID p
thread
);//
线程
入口函数 6. 在启动按钮的消息处理函数中编写如下代码:
thread
1.progress=&m_progress1;//进度条对象
thread
1.speed=100;//速度
thread
1.pos=0;//初始位置 h
Thread
1=Create
Thread
(NULL,0,
Thread
Fun,&
thread
1;,0,0);//创建并开始
线程
if (!h
Thread
1) { MessageBox("创建
线程
失败"); } 7. 编写
线程
函数(一般是一个死循环,或者需要花费时间很长的算法!否者就失去了多
线程
的意义) DWORD WINAPI
Thread
Fun(LPVOID p
thread
) //
线程
入口函数 { lp
thread
temp=(lp
thread
)p
thread
;//参数强制转换为结构体类型 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(Suspend
Thread
(h
Thread
1)==0xFFFFFFFF) { MessageBox("挂起失败!进程可能已经死亡或未创建!"); return; } 9. 在执行按钮函数中,编写如下代码: if(Resume
Thread
(h
Thread
1)==0xFFFFFFFF) { MessageBox("执行失败!进程可能已经死亡或未创建!"); return; } 10. 在停止按钮函数中,编写如下代码: if(Terminate
Thread
(h
Thread
1,0))//前些终止
线程
{ CloseHandle(h
Thread
1);//销毁
线程
句柄
} else { MessageBox("终止进程失败!"); } 11. 为应用程序添加WM_TIMER消息,实时更新全局变量的值到编辑框;
MT5 非区间均线回归刷单EA教学
1.主要面向有一定基础的学员;2.想编写EA苦于不知道如何下手的学员!3.能看懂代码的学员!4.不啰嗦直接上干货!5.固定框架式编程!6.面向对象,面向函数式编程!//--- 交易.追踪止损(Symbol(),追踪点值,magic号码); 指标.
句柄
至数组(指标.
句柄
A,小均值,0,iBars(Symbol(),应用周期),true); 指标.
句柄
至数组(指标.
句柄
B,大均值,0,iBars(Symbol(),应用周期),true);//---非区间 double 区间最高价= 数据.求区间最高价(Symbol(),应用周期,MODE_CLOSE,0,区间根数); double 区间最低价= 数据.求区间最低价(Symbol(),应用周期,MODE_CLOSE,0,区间根数); bool 包裹均线=小均值[0]区间最低价&&大均值[0]区间最低价;
线程
句柄
及 ::WaitForSingleObject(m_h
Thread
, 0)
线程
句柄
,可以粗略的理解为
线程
的地址,通过这个
句柄
可以找到对应的
线程
,进而对
线程
进行操作。
线程
句柄
关闭并不意味着
线程
结束,只是减少了该
线程
的引用。 如果
线程
启动后,不需要对它进行别的操作,即可调用::CloseHandle(m_h
Thread
)关闭
线程
句柄
。 ::WaitForSingleObject(m_h
Thread
, 0),传入的参数若为
线程
句柄
,
线程
正常运行时,为...
WaitForSingleObject 等待
线程
句柄
http://blog.csdn.net/dyzhen/article/details/5993396 WaitForSingleObject(h
Thread
/*某个
线程
的
句柄
*/,INFINITE)可以吗? h
Thread
代表的
线程
如果在运行,就要一直等下去,直到
线程
退出来吗? 如果是这样,就是说我等到的时候,
线程
已经退出了?我还需要调用类似于ReleaseSema
进程/线程/DLL
15,471
社区成员
49,181
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章