VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 570|回复: 7

[求助] 怎么向一个类中的线程传递数据

[复制链接]
09_avatar_middle
online_vip 发表于 2018-8-29 19:50:47 | 显示全部楼层 |阅读模式
有这样一个场景,一个Server端要处理很多请求,然后这些请求要访问共同的资源
  1. void DemoClient::handleRequest(IncomingPacket *pRequest)
  2. {
  3.    Json::Value&jsonval = reinterpret_cast<Json::Value&>(*pRequest);
  4.    DWORD dwThreadId = 0;
  5.    HANDLE hThread = CreateThread(NULL,0,threadProc,(void*)this,0,&dwThreadId);

  6.   //**************省略*********//
  7. }

  8. DWORD WINAPI DemoClient::threadProc(LPVOID lpVoid)
  9. {
  10.   DemoClient *pThis = reinterpret_cast<DemoClient*>(lpVoid);
  11.   //**************省略*********//
  12.    
  13. }
复制代码
(其实就是调用同一个dll)示例代码如下
我想问下 怎么把每次收到请求的数据 pRequest传送给线程 threadProc,在创建线程的时候已经传个this指针了,怎么传额外的请求数据给线程?求教




上一篇:easyhook例子用vs2015编译后xp无法运行
下一篇:窗口跟随显示问题
38_avatar_middle
online_vip 发表于 2018-8-29 20:30:53 | 显示全部楼层
DemoClient定义成员IncomingPacket *pRequest;试试
51_avatar_middle
online_admins 发表于 2018-8-29 22:54:15 | 显示全部楼层
如果给一个函数传递多个参数怎么办?当然是使用结构体了,这样结构体中可以包含N多个成员,你要传多少都可以了。

当然你这里也可以把 pRequest 定义成 DemoClient 的成员变量,这样创建线程的时候 this 指针中就已经包含了 pRequest 的东西了!
09_avatar_middle
ico_lz  楼主| 发表于 2018-8-30 08:28:57 | 显示全部楼层
Syc 发表于 2018-8-29 22:54
如果给一个函数传递多个参数怎么办?当然是使用结构体了,这样结构体中可以包含N多个成员,你要传多少都可 ...

我考虑过把pRequest做成一个成员变量,可是如果请求很频繁的话,担心传到线程里面的数据是上次请求的数据,会出现这种情况么?
51_avatar_middle
online_admins 发表于 2018-8-30 09:52:48 | 显示全部楼层
wangxiaohu104 发表于 2018-8-30 08:28
我考虑过把pRequest做成一个成员变量,可是如果请求很频繁的话,担心传到线程里面的数据是上次请求的数据 ...

如果多个线程共用一个 pRequest 的话肯定不行,那就做成一个结构体安全点
09_avatar_middle
ico_lz  楼主| 发表于 2018-8-30 14:01:16 | 显示全部楼层
Syc 发表于 2018-8-30 09:52
如果多个线程共用一个 pRequest 的话肯定不行,那就做成一个结构体安全点

能用伪代码演示下么?或者给个例子我看下
26_avatar_middle
在线会员 发表于 2018-9-2 21:18:40 | 显示全部楼层
  1. typedef struct _XXXData
  2. {
  3.         DemoClient* pClient;        //需要DemoClient对象的话
  4.         IncomingPacket *pRequest;
  5.         ...
  6. }TXXXData, *PXXXData;

  7. {
  8.         PXXXData pXXXData = new TXXXData;
  9.         pXXXData->pClient = this;
  10.         pXXXData->pRequest = ...;
  11.         HANDLE hThread = CreateThread(NULL,0,threadProc,(void*)pXXXData ,0,&dwThreadId);
  12.         ...
  13. }


  14. DWORD WINAPI threadProc(LPVOID lpVoid)
  15. {
  16.         PXXXData pXXXData = (PXXXData)lpVoid;
  17.         .....
  18.         delete pXXXData;
  19.         return 0;
  20. }
复制代码

评分

参与人数 1威望 +2 热心值 +2 收起 理由
51_avatar_small Syc + 2 + 2 很给力!

查看全部评分

09_avatar_middle
ico_lz  楼主| 发表于 2018-9-3 11:06:55 | 显示全部楼层
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-7-22 06:10

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表