请问CreateThread的一个问题

biefanwo999 2001-12-17 04:23:25
我遇到一个讨厌的问题,请大家帮忙解决,谢谢
在一个类中定义了两个成员函数,
class base
{
public:
base();
virtual ~base();
static void p1(LPVOID pData)
{
//这里是使用传入的pData指针的操作
((base*)pData)->p2();
}
virtual void p2()
{
...
}
void Createnew();
};
在Createnew()里是这么调用的
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)p1,(LPVOID)this,dwFlag,&dwID);
但是问题是,一运行就出现非法操作。跟踪到p1的时候可以看到((base*)pData)指针的
__vptr指针中的内容全部不正确了,正确的应该是包含虚函数p2的地址,可是现在乱七八糟的,不知道是被什么修改了。

想请大家帮忙看看问题是出在哪里?或者是否有其他方法实现同样的功能?
非常感谢!
...全文
179 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
biefanwo999 2001-12-25
  • 打赏
  • 举报
回复
supperapplication(行星) ,你这样的调用好像不能成功。
抱歉,我后来改动了一下程序,把p1 myp1;
改成p1 *myp1;
myp1 = new p1;
就不再发生错误了。
谢谢各位。
Thunder_ 2001-12-19
  • 打赏
  • 举报
回复
to biefanwo999(猫你) 我就是在对话框程序中测试的,没错
111222 2001-12-18
  • 打赏
  • 举报
回复
AfxBeginThread和CreateThread没多大区别,AfxBeginThread只是对CreateThread进行了少量的封装。

你看看传入线程函数数据的生存周期吧
supperapplication 2001-12-18
  • 打赏
  • 举报
回复
怎么没有声音了??????????????
supperapplication 2001-12-18
  • 打赏
  • 举报
回复
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)p1,(LPVOID)this,dwFlag,&dwID);
你把this给传进去了?

这样改动:
virtual void p2()
{
...
}

static void p1(LPVOID pData)
{
//这里是使用传入的pData指针的操作
p2();
}

你试试吧,我也不是很清楚。
Phourm 2001-12-18
  • 打赏
  • 举报
回复
_beginthread()
or AfxBeginThread()
biefanwo999 2001-12-18
  • 打赏
  • 举报
回复
在对话框或者多文档MFC程序中就会出错。
请帮忙看看,感激不尽!
biefanwo999 2001-12-17
  • 打赏
  • 举报
回复
在对话框或者多文档MFC程序中就会出错。
请帮忙看看,感激不尽!
Thunder_ 2001-12-17
  • 打赏
  • 举报
回复
我这里没错。
biefanwo999 2001-12-17
  • 打赏
  • 举报
回复
兄台,如果不用CreateThread使用哪个函数较妥?万望赐教!
xiaoxiaohan 2001-12-17
  • 打赏
  • 举报
回复
3. 如何使用CreateThread函数?
当CreateThread被调用时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。使用时应当注意在不需要对线程内核进行访问后调用CloseHandle函数关闭线程句柄。因为CreateThread函数中使用某些C/C++运行期库函数时会有内存泄漏,所以应当尽量避免使用。
参数 含义
lpThreadAttributes 如果传递NULL该线程使用默认安全属性。如果希望所有的子进程能够继承该线程对象的句柄,必须将它的bInheritHandle成员被初始化为TRUE。
dwStackSize 设定线程堆栈的地址空间。如果非0,函数将所有的存储器保留并分配给线程的堆栈。如果是0,CreateThread就保留一个区域,并且将链接程序嵌入.exe文件的/STACK链接程序开关信息指明的存储器容量分配给线程堆栈。
lpStartAddress 线程函数的地址。
lpParameter 传递给线程函数的参数。
dwCreationFlags 如果是0,线程创建后立即进行调度。如果是CREATE_SUSPENDED,系统对它进行初始化后暂停该线程的运行。
LpThreadId 用来存放系统分配给新线程的ID。
biefanwo999 2001-12-17
  • 打赏
  • 举报
回复
大家帮我看看啊
谢谢了
三杯倒 2001-12-17
  • 打赏
  • 举报
回复
1111

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧