4879|11

84

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请帮忙解释一下这个程序,谢谢! [复制链接]

这是我写的一个简单串口读线程,将线程函数封装在了类里面
  1. class CCESeries:public CGPSpro
  2. {
  3. public:
  4.         //打开串口
  5.         BOOL OpenPort(PTCHAR Port);
  6.         CCESeries();
  7.         virtual ~CCESeries();
  8.        
  9.         HANDLE m_hReadThread;                        //读线程句柄
  10.         DWORD m_dwReadThreadID;                        //读写线程ID标识
  11.        
  12.         static DWORD WINAPI ReadThreadFunc(LPVOID lparam);
  13.         static DWORD WINAPI WriteThreadFunc(LPVOID lparam);

  14. };
复制代码
  1. BOOL CCESeries::OpenPort(PTCHAR Port)
  2. {
  3.         BOOL ret = FALSE;
  4.         if (m_hComm != INVALID_HANDLE_VALUE)        //已经打开,直接返回
  5.         {
  6.                 SerialErrorHandle(_T("<>Serial already opened\r\n"));
  7.                 return TRUE;
  8.         }
  9.         ::Sleep(10000);
  10.         m_hComm = ::CreateFile(Port, //以同步读取方式打开串口
  11.                 GENERIC_READ,// | GENERIC_WRITE, //允许读
  12.                 0, //独占方式
  13.                 NULL,
  14.                 OPEN_EXISTING, //打开而不是创建
  15.                 0,
  16.                 NULL);

  17.         if (m_hComm == INVALID_HANDLE_VALUE)        // 无效句柄,返回。
  18.         {
  19.                 SerialErrorHandle(_T("<>Create COM failed\r\n"));
  20.                 return FALSE;
  21.         }
  22.         [color=#FF0000]m_hReadThread = CreateThread(NULL,0,ReadThreadFunc,this,0,&m_dwReadThreadID);//创建读串口线程[/color]       
  23.         return TRUE;
  24. }
复制代码
  1. DWORD CCESeries::ReadThreadFunc(LPVOID lparam)        //串口读线程函数
  2. {
  3.         try
  4.         {
  5.                 [color=#FF0000]CCESeries *ceSeries = (CCESeries*)lparam;[/color]
  6.                
  7.                 DWORD        evtMask;
  8.                 BYTE * readBuf = NULL;//读取的字节
  9.                 DWORD actualReadLen=0;//实际读取的字节数
  10.                 DWORD willReadLen;
  11.                
  12.                 //清空串口
  13.                 PurgeComm(ceSeries->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR );
  14.                 SetCommMask (ceSeries->m_hComm, EV_RXCHAR);// | EV_CTS | EV_DSR );
  15.                
  16.                 while (TRUE)
  17.                 {          
  18.                 if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))
  19.                 {
  20.                         SetCommMask (ceSeries->m_hComm, EV_RXCHAR);// | EV_CTS | EV_DSR );
  21.                         //表示串口收到字符               
  22.                         if (evtMask & EV_RXCHAR)
  23.                         {                                       
  24.                         willReadLen = 512;//cmState.cbInQue ;//接收缓冲区中存储的待读取的字符数
  25.                         if (willReadLen <= 0)
  26.                         {
  27.                                 continue;
  28.                         }
  29.                         readBuf = new BYTE[willReadLen+1];
  30.                                        
  31.                         ReadFile(ceSeries->m_hComm, readBuf, willReadLen, &actualReadLen,0);
  32.                         readBuf[actualReadLen]=0;
  33.                                        
  34.                         //如果读取的数据大于0,
  35.                         if (actualReadLen>0)
  36.                         {
  37.                            //to do something here
  38.                         }
  39.                 }
  40.                        
  41.                 //如果收到读线程退出信号,则退出线程
  42.                 if (WaitForSingleObject(ceSeries->m_hReadCloseEvent,300) == WAIT_OBJECT_0)
  43.                 {
  44.                         break;
  45.                 }
  46.                 delete readBuf;
  47.         }
  48.         }
  49.         catch (...)
  50.         {
  51.                 RETAILMSG(DBGMSGON, (_T("<>Serial read EXCEPTION\r\n")));
  52.         }
  53.        
  54.         return 0;
  55. }
复制代码

下面这个是什么意思
CCESeries *ceSeries = (CCESeries*)lparam
在创建线程的时候传进的参数是this
谢谢

最新回复

11  详情 回复 发表于 2008-5-8 11:25
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没人知道吗???
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
too simple,这么问题应该是自己查语法书的。

这句的意思是定义一个CCESeries变量ceSeries,然后给这个变量赋值(让指针指向)lparam,(CCESeries*)是强制类型转换。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
CreateThread(NULL,0,ReadThreadFunc,this,0,&m_dwReadThreadID);

这个代码是在CCESeries这个类里写的,所以this是这个类的指针,指向这个类本身。
然后这个指针被作为参数传到线程里了。
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

5
 
this是一个指针,代表类本身的指针.指针实际是一个32位类型的一个数.
CCESeries *ceSeries = (CCESeries*)lparam  将lparam强制转换成(CCESeries*)类型的指针.
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
恩,谢谢各位耐心的解答
但是现在的问题是:我这样把一个线程封装在一个类里面,与把线程单独提出来写一个函数,各有什么优点
我同事说我这样写非常的不好管理!
请各位提供一点意见!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
如果这个线程只是处理这个类的事务,封装起来好一些。

如果是一个公共的线程,需要处理外部的很多事务,独立出来好一些。

 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
你到底想问什么问题?
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 
估计LZ没明白C++里头的线程函数的参数为什么只能用堆上的变量吧
THIS 指向当前类对象指针
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 hnhyhongmingjiang 的回复:
估计LZ没明白C++里头的线程函数的参数为什么只能用堆上的变量吧
THIS 指向当前类对象指针

能说明白点吗?我确实接触C++没有多久,对类的封装更是一塌糊涂,我同事就经常说我代码写得很乱
还望大家多多指点
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

11
 
大家指点是没有多大用的。

你需要好好找几本C++的基础书看一下,

去baidu搜一下“c++ 基础”吧。
这是最好的建议。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

12
 
11
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表