首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

在静态成员函数创建线程失败,如何解决

2012-12-15 
在静态成员函数创建线程失败,怎么解决?在静态成员函数创建线程,AfxBeginThread(XYZ_Move_thread,this) //

在静态成员函数创建线程失败,怎么解决?


   在静态成员函数创建线程,AfxBeginThread(XYZ_Move_thread,this); //用this报错

    看到网上说:将this改为p
    CProjectSWView   *Mdlg=(CProjectSWView*)p; 
    AfxBeginThread(XYZ_Move_thread, p);
    
    调试时,显示0xcdcdcdcd,无效 

    谁写过类似的代码,给个方法吧?谢谢!


[最优解释]

引用:
 to VisualEleven:
 你能写出大概的具体代码吗? "参数你可以传递一个全局的类指针变量"不知道具体是什么

 什么转换
 (Mdlg->pXYZThread)=AfxBeginThread(XYZ_Move_thread,p);//参2 p 换成什么?

 谢谢!(网上搜不到方法)

你先定义一个静态或者全局的类指针变量,在合适的地方初始化它,AfxBeginThread创建线程的时候将这个静态或者全局的指针作为线程函数的参数传递过去即可。
[其他解释]
今天帮你写了个,
 全局或静态CProjectSWView* Mdlg;
在InitialDialog里初始化:
Mdlg=this(要是不放心的话用Mdlg=(CProjectSWView*)AfxGetMainWnd())
然后将Mdlg传进去就行了。我这边是可以编译通过和运行的。
[其他解释]
本帖最后由 VisualEleven 于 2012-09-07 17:29:12 编辑 普通成员函数中创建线程使用用this肯定是可以的。


[其他解释]


   在静态成员函数里创建线程,静态static.
[其他解释]
静态成员函数里面没有 this 指针的,你要从外部获取对象的地址的
[其他解释]
静态成员函数不属于任何对象实例,所以用this不对吧,可以定义一个静态的对象指针
[其他解释]

  To feilongjilei,w654637923
  这样说太抽象了,可以给出具体的代码吗?谢谢
[其他解释]


 没有人在多线程中遇到这个问题吗?
[其他解释]
我记错了,afxbeginthread不是静态函数,可以调用当前对象实例,你应该是其他地方错了,比如线程函数,定义对了么,是否为static
[其他解释]
你能多贴一点关键代码么
[其他解释]
我的博客
[其他解释]
引用:
  在静态成员函数创建线程,AfxBeginThread(XYZ_Move_thread,this); //用this报错

  看到网上说:将this改为p
  CProjectSWView *Mdlg=(CProjectSWView*)p; 
  AfxBeginThread(XYZ_Move_thread, p);
   
  调试时,显示0xcdcdcdcd,无效 

  ……

Sorry,类的静态成员函数中不带this指针的。你再静态函数中创建线程,参数你可以传递一个全局的类指针变量
[其他解释]
搽,我都看错了,第一次看到了这一句“在静态成员函数创建线程”,第二次又没看到,还是原来的观点.

[其他解释]

 to VisualEleven:
 你能写出大概的具体代码吗? "参数你可以传递一个全局的类指针变量"不知道具体是什么

 什么转换
 (Mdlg->pXYZThread)=AfxBeginThread(XYZ_Move_thread,p);//参2 p 换成什么?

 谢谢!(网上搜不到方法)
[其他解释]
在类外创建一个结构体
struct MDLG
{
   static CProjectSWView *Mdlg;
};
在你创建线程的静态函数里初始化

------其他解决方案--------------------



 to w654637923:

 你写程序时遇到类似问题是这样解决的吗?你确定可行吗?
[其他解释]


  to VisualEleven:
  static CProjectSWView*  threadXYZ;
  CProjectSWView* CProjectSWView::threadXYZ=NULL; //除了NULL,不知道初始化为什么
  (Mdlg->pXYZThread)=AfxBeginThread(XYZ_Move_thread,threadXYZ);
  
  Mdlg->pXYZThread还是显示0xcdcdcdcd,是没创建成功,因为没进去XYZ_Move_thread线程的断点处

  怎么初始化呢?还是用其它方法改?谢谢
[其他解释]

  to w654637923:
   
  用Mdlg=(CProjectSWView*)AfxGetMainWnd())是可以创建线程成功,
  
  但为什么调试时,不去新线程的断点处,在旧线程的断点处?

  
[其他解释]

 
  我问一个新的相关问题:
  我反复调试了几遍,可以去新线程,但回不来旧线程?
[其他解释]


  我发现
  CProjectSWView *Mdlg=(CProjectSWView*)p;  
  AfxBeginThread(XYZ_Move_thread, p);
  这样也是可以的,value没变化是,下一句没断点

 
[其他解释]

  to w654637923:
  
  你是不是写过事件使2个线程同步的code,你可以去看一下这个帖子,这也是我提的问题:

  http://topic.csdn.net/u/20120908/21/f29779d9-2e94-49fe-aed6-a9999a44eec1.html
[其他解释]
你再贴一点关键代码,没办法完全猜测你要做什么

热点排行