首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 关于一个创建线程的问题 [已结帖,结帖人:naixian1983]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • naixian1983
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-19 16:13:44 楼主
    看了一个创建线程的例子,但有些不明白

    C/C++ code
    struct threadInfo { UINT nMilliSecond; CProgressCtrl* pctrlProgress; }; UINT ThreadFunc(LPVOID lpParam) { threadInfo* pInfo=(threadInfo*)lpParam; for(int i=0;i<100;i++) { int nTemp=pInfo->nMilliSecond; pInfo->pctrlProgress->SetPos(i); Sleep(nTemp); } return 0; }


    threadInfo* pInfo要指向一个地址,(threadInfo*)lpParam是什么?
    为什么要threadInfo* pInfo=(threadInfo*)lpParam?

    30  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jason_wentzel
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:16:101楼 得分:2
    lpParam是创建线程时传进来的一个threadInfo指针参数
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zaodt
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:16:302楼 得分:2
    强制类型转换
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ok1234567
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:20:533楼 得分:2
    为什么要threadInfo* pInfo=(threadInfo*)lpParam?
    强制类型转换

    这样的写法不是很好,进度条不一定正常工作
    最好的写法是通过Windows消息传送
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • naixian1983
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:25:494楼 得分:0
    为什么要强制类型转换?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ok1234567
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:29:565楼 得分:0
    为了正确引用指针所代表数据的相关成员
    不同的指针有不同的行为
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jason_wentzel
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:30:036楼 得分:2
    lpParam的类型是LPVOID ,而你传进来的时候是threadInfo*,当然然强制转换了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • naixian1983
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 17:00:487楼 得分:0
    只是打个比方,如果是仅仅是UINT ThreadFunc(),并没有里面的参数LPVOID lpParam,怎样通过指针pInfo来访问成员变量?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Amuro1987218
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 17:02:438楼 得分:2
    引用 4 楼 naixian1983 的回复:
    为什么要强制类型转换?

    因为无法自动转换
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • naixian1983
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 09:21:209楼 得分:0
    打个比方,如果是仅仅是UINT ThreadFunc(),并没有里面的参数LPVOID lpParam,怎样通过指针pInfo来访问成员变量?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Amuro1987218
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 09:26:0110楼 得分:0
    那就无从访问
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • henry3695
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 10:51:0211楼 得分:2
    UINT ThreadFunc(LPVOID lpParam)

    lpParam 这个可以是一个对话框的指针
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qiandayong
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 10:54:2212楼 得分:2
    如果不会用参数,就只能用全局变量了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • maomaoxiong
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 11:02:0813楼 得分:2
    DWORD WINAPI ThreadProc(
      LPVOID lpParameter  // thread data
    );
    设计时就考虑了通过lpParameter交互数据,如果实在不想用此指针,如在CreateThread中设为NULL,则可以通过全局变量、消息等等传递参数。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yupengchen951124
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 11:13:5314楼 得分:2
    lpParam是创建线程时传进来的一个threadInfo指针参数
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jimmytom
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 11:50:4915楼 得分:10
    HANDLE CreateThread(
      LPSECURITY_ATTRIBUTES lpThreadAttributes,
      SIZE_T dwStackSize,
      LPTHREAD_START_ROUTINE lpStartAddress,
      LPVOID lpParameter,
      DWORD dwCreationFlags,
      LPDWORD lpThreadId
    );
    红色部分是向线程函数传的参数,LPVOID,是一个void*吧,如果如下用法:
        int na = 2;
        void *p = &na;
        std::cout < < *p;
    编译器将会很迷惑,不知道一个void指针该如何解释,必须把他强制转换成一种类型,编译器才知道这个指针指向多少个bit,以及怎么解释这些位,必须给它类型信息,这就是必须强制转换的原因。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cricketol
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 12:31:3616楼 得分:2
    (threadInfo*)lpParam把指针强制转换threadInfo*
    把指针传进线程里面,以便能够在线程里面通过指针操作结构体
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved