我在网上找到线程的一些资料:
定义:
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不熟,只能看懂一些语句。希望能有实例给出。
谢谢各位了。

解决方案 »

  1.   

    把一个COM的对象是IVMManager * m_pVMManager1, CString m_strExtNum,做在一个结构体里.然后为线程函数传这个结构体指针.您看可行吗?
      

  2.   

    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);
      

  3.   

    首先封装成一个结构体,那是肯定的,
    然后就有两种方法了,
    1 把这个参数做成全局变量,然后传这个参数的指针给线程函数,
    2 动态创建这个参数,然后传这个参数的指针给线程函数,然后当线程函数结束的时候,记得free这个参数变量,其实,就是flyelf(空谷清音[MVP]) 大哥的做法。反正记住一点,这个参数不能在线程函数结束前就死亡了,不然就crash了。
      

  4.   

    我在线程函数里调用m_pVMManager1和m_strExtNum直接用lpParam->m_pVMManager1->savefile(&filename);提示error C2227: “->m_pVMManager1”的左侧必须指向类/结构/联合这怎么改呢?
      

  5.   

    LPVOID型相当于void型的指针,不能直接使用的.
    要先强转成可用的指针类型才行.
      

  6.   

    同意 flyelf(空谷清音[MVP]) ( ) 信誉:150  2006-02-21 09:39:00  得分: 0 
    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
    }
      

  7.   

    谢谢楼上几位。现在我已经可以正常运行这个线程了。
    我是用AfxBeginThread运行的。
    但还有个问题,就是这个线程只能同时运行一个,所以我在CDlgMain类里建了个标记bool m_acThreadpo
    然后在线程的最后位置设置CDlgMain类m_acThreadpo为false 代表线程结束。但是我等了好久,判断m_acThreadpo还是为true 难道这个线程里不能传值出来吗?