我想让线程能够方便调用某个类的成员变量,该如何创建?

解决方案 »

  1.   

    创建线程时的Callback函数使用你想用的类的静态成员函数试试。
      

  2.   

    #include "process.h"
    class CA
    {
    public:
    static WINAPI UINT threadfunc(LPVOID p);
    int x;
    ...
    }
    ...
    CA::***()
    {
    _beginthreadex(0,0,threadfunc,this,0,0);
    }
    CA::threadfunc(LPVOID p)
    {
    CA* pa=(CA*)p;
    pa->x.....
    }
      

  3.   

    void GlobalThreadProc(void* arg)
    {
     CObject* pObj=(Object*)arg;
     pObj->MemberThreadProc();
    }
      

  4.   

    使用一个简单的SDI新建工程Thread,大家看看相关部分代码有什么问题:
    //ThreadView.h#include "process.h"
    class CThreadView : public CView
    {
    ........
    public:
    CThreadDoc* pDoc;
    static UINT WINAPI threadfunc(LPVOID pParam);
    ........
    }//ThreadView.cpp
    UINT CThreadView::threadfunc(LPVOID pParam)
    {
    CThreadView* pThreadView = (CThreadView*) pParam;
    // CString strttl = pThreadView->pDoc->GetTitle();
    // TRACE("%s\n",strttl);
    pThreadView->pDoc->SetTitle("M4A1"); return 0;
    }void CThreadView::OnInitialUpdate() 
    {
    CView::OnInitialUpdate();

    // TODO: Add your specialized code here and/or call the base class
    pDoc = GetDocument(); pDoc->SetTitle("AK47"); _beginthreadex(0,0,threadfunc,this,0,0);
    // AfxBeginThread(threadfunc, this);}
    这段代码通过编译但执行报错!
    我用Callstack查看了一下,发现是错在线程中的SetTitle()函数。我试着使用了一下GetTitle()却没问题!我怀疑是在线程之间传递了PDoc指针造成的,但却没有明显的证据。。
      

  5.   

    如果线程函数要用到MFC,不要用_beginthreadex建立线程
    用AfxBeginThread因为MFC函数在多线程里会有一些问题如果不用AfxBeginThread
      

  6.   

    但是事实上现在两种创建线程的办法有没有解决上面说的问题啊。
    试着改为:
    //ThreadView.h
    class CThreadView : public CView
    {
    ........
    public:
    CThreadDoc* pDoc;
    static UINT threadfunc(LPVOID pParam);
    ........
    }//ThreadView.cpp
    UINT CThreadView::threadfunc(LPVOID pParam)
    {
    CThreadView* pThreadView = (CThreadView*) pParam;
    // CString strttl = pThreadView->pDoc->GetTitle();
    // TRACE("%s\n",strttl);
    pThreadView->pDoc->SetTitle("M4A1"); return 0;
    }void CThreadView::OnInitialUpdate() 
    {
    CView::OnInitialUpdate();

    // TODO: Add your specialized code here and/or call the base class
    pDoc = GetDocument(); pDoc->SetTitle("AK47");// _beginthreadex(0,0,threadfunc,this,0,0);
    AfxBeginThread(threadfunc, this);}
      

  7.   

    你另开了一个线程,而这个线程没有提供文档视图的非MFC线程,当然会有问题。
    AfxBeginThread可能也会有问题,因为这个线程没有文档视图机制。如果你只想改标题的话,试试直接取主窗口用SetWindowText。
    还有一种方法是你用postthreadmesssage给主线程发个消息,让主线程去调用doc的settile
      

  8.   

    我没有想用它来改变窗口标题,很偶然发现有些我的类的某些成员(一般是指向MFC类的指针成员变量)在我新开的线程中有时会出问题而我却找不出问题所在。很是郁闷啊!希望能够得到更深入的解释。。