我在网上找到线程的一些资料:
定义:
DWORD WINAPI CConnectDlg::ThreadFunc( LPVOID lpParam )
{
...//运行线程
}调用:
DWORD dwThreadId;
CreateThread( NULL,0,ThreadFunc,this,0,&dwThreadId);可是因为那线程过程ThreadFunc中我现需要传入两个参数的,一个COM的对象是IVMManager * m_pVMManager1,另一个是 CString m_strExtNum
所以这个程线应该是怎样写呢?我现在使用的过程:
BOOL CDlgMain::UpdateVoiceMail()
{
...//处理写文件
}
那个m_pVMManager1和m_strExtNum是CDlgMain类的全局变量使用中的
有网友提议:
在主线程中malloc空间,把参数存入其中,
把动态分配的空间地质作为参数传给线程函数我也觉得是可行的,但不知道具体代码怎写。
因为本人实在对VC不熟,只能看懂一些语句。希望能有实例给出。
谢谢各位了。
定义:
DWORD WINAPI CConnectDlg::ThreadFunc( LPVOID lpParam )
{
...//运行线程
}调用:
DWORD dwThreadId;
CreateThread( NULL,0,ThreadFunc,this,0,&dwThreadId);可是因为那线程过程ThreadFunc中我现需要传入两个参数的,一个COM的对象是IVMManager * m_pVMManager1,另一个是 CString m_strExtNum
所以这个程线应该是怎样写呢?我现在使用的过程:
BOOL CDlgMain::UpdateVoiceMail()
{
...//处理写文件
}
那个m_pVMManager1和m_strExtNum是CDlgMain类的全局变量使用中的
有网友提议:
在主线程中malloc空间,把参数存入其中,
把动态分配的空间地质作为参数传给线程函数我也觉得是可行的,但不知道具体代码怎写。
因为本人实在对VC不熟,只能看懂一些语句。希望能有实例给出。
谢谢各位了。
{
public:
IVMManager *m_pVMManager1;
CString m_strExtNum;
};
CThreadParam *pParam = new CThreadParam;
pParam->m_pVMManager1=...;
...
DWORD dwThreadId;
CreateThread( NULL,0,ThreadFunc,pParam,0,&dwThreadId);
然后就有两种方法了,
1 把这个参数做成全局变量,然后传这个参数的指针给线程函数,
2 动态创建这个参数,然后传这个参数的指针给线程函数,然后当线程函数结束的时候,记得free这个参数变量,其实,就是flyelf(空谷清音[MVP]) 大哥的做法。反正记住一点,这个参数不能在线程函数结束前就死亡了,不然就crash了。
要先强转成可用的指针类型才行.
class CThreadParam
{
public:
IVMManager *m_pVMManager1;
CString m_strExtNum;
//要多少参数就有多少参数
};
CThreadParam *pParam = new CThreadParam;
pParam->m_pVMManager1=...;
...
DWORD dwThreadId;
CreateThread( NULL,0,ThreadFunc,pParam,0,&dwThreadId);DWORD WINAPI CConnectDlg::ThreadFunc( LPVOID lpParam )
{
//运行线程
//强制指针类型转换
(CThreadParam*)pMyParam = (CThreadParam*)lpParam;
//
//pMyParam->m_pVMManager1
//pMyParam->m_strExtNum
}
我是用AfxBeginThread运行的。
但还有个问题,就是这个线程只能同时运行一个,所以我在CDlgMain类里建了个标记bool m_acThreadpo
然后在线程的最后位置设置CDlgMain类m_acThreadpo为false 代表线程结束。但是我等了好久,判断m_acThreadpo还是为true 难道这个线程里不能传值出来吗?