线程函数传递参数传不进去。

csdn网速很慢 2011-07-26 05:40:51
DWORD WINAPI CCom::readProc(LPVOID lpparam)
{
CCom* com=(CCom*)lpparam;
DWORD readCount=0;
DWORD readedlen=0;
int i=0;
while(com->_isreceiving==true)
{
readCount=1;
readedlen=0;
i=0;
while(readCount>0)
{
ReadFile(com->_hComDev,com->readbuff+readedlen,1024-readedlen,&readCount,&(com->_overlapped));
if(i>10) break;
i++;
Sleep(20);
}
if(readedlen>0)
{
if(com->_onReceiveData!=NULL)
{
com->_onReceiveData(com->readbuff,readedlen);
}
}
}
return 0;
}
void CCom::startReceiveData()
{
DWORD threadid;
_isreceiving=true;
_com=this;
HANDLE hthread=CreateThread(NULL,0,readProc,(LPVOID)_com,NULL,&threadid);
//这儿传进去的_com好像是错的。 _isreceiving 是未初始化的。
//HANDLE hthread=CreateThread(NULL,0,readProc,(LPVOID)NULL,NULL,&threadid);
}
...全文
360 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
csdn网速很慢 2011-07-29
还真的是给析构了。 我把com实例给定义成了局部变量那个函数退了这就成随机数了。。
回复
haoruixiang 2011-07-29
#pragma once
#include <Windows.h>
class hcom
{
public:
hcom(void);
public:
~hcom(void);
void startReceiveData();
private:
HANDLE _hthread;
static DWORD WINAPI readProc(LPVOID lpparam);
bool _isreceiving;
hcom* _com;
};
#include "StdAfx.h"
#include "hcom.h"

hcom::hcom(void)
{
}

hcom::~hcom(void)
{

}
DWORD WINAPI hcom::readProc(LPVOID lpparam)
{
hcom * p = (hcom*) lpparam;
printf("%x \n",(char*)p);
return 0;
}
void hcom::startReceiveData()
{
DWORD threadid;
_com=this;
_com->_isreceiving=TRUE;
_hthread=CreateThread(NULL,0,&readProc,(LPVOID)_com,NULL,&threadid);

}

#include "stdafx.h"
#include "hcom.h"

int _tmain(int argc, _TCHAR* argv[])
{
hcom mp;
mp.startReceiveData();
int n;
scanf("%d",&n);
return 0;
}
hcom mp;
mp.startReceiveData();
这样 是没问题的 不知道你的程序哪里出问题了 你看下是不是 CCom 类型的变量 在 startReceiveData()
后马上 释放了 你在 析构函数那 和线程函数那 都设置断点 看看
回复
csdn网速很慢 2011-07-29
// Com.h: interface for the CCom class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_COM_H__8F7F0485_6FD4_4DEC_A4DE_22BD0720F997__INCLUDED_)
#define AFX_COM_H__8F7F0485_6FD4_4DEC_A4DE_22BD0720F997__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "stdafx.h"

typedef void (*pOnReceiveData)(char* buff,DWORD& len);
class CCom
{
public:
CCom();
virtual ~CCom();
/*enum m_Parity
{
EvenParity,
MarkParity,
NoParity,
OddParity,
SpaceParity
};
enum m_StopBits
{
OneStopBit,
ONE5STOPBITS,
TwoStopBits
};*/
public:
HANDLE getFileHand(){return _hComDev;}
bool isopen(){if (_hComDev!=NULL)
{
return true;
}
else
{
return false;
}}
BOOL _isreceiving;
//打开指定端口
//return 1表示无错误.2端口打开错误3获取端口参数失败4设置端口参数失败20端口被占用
int open(int szPort,bool isoverlapped=false);
//关闭指定串口
bool close();
//设置串口
void setCOM(DWORD BaudRate=115200,BYTE ByteSize=8,BYTE StopBits=1,BYTE Parity=NOPARITY);
bool setBaud(DWORD bandrate); //波特率
bool setByteSize(BYTE bz); // 数据位大小
bool setStopBits(BYTE stopB); //停止位
bool setParity(BYTE parity); //奇偶效验
//通讯超时
bool setTimeOut(DWORD interval=20,DWORD rMutiplier=2,DWORD rConstant=100,DWORD wMutiplier=2,DWORD wConstant=100);

// 写串口
// 输入: pData - 待写的数据缓冲区指针
// nLength - 待写的数据长度
// 返回: 实际写入的数据长度
int ReadCom(void* pData, int nLength);
// 读串口
// 输入: pData - 待读的数据缓冲区指针
// nLength - 待读的最大数据长度
// 返回: 实际读出的数据长度
int WriteCom(void* pData, int nLength);
//读取串口
//pData读取数据缓冲区,实际Writelen读出的长度
CString read();
//写入串口
//pData写入数据缓冲区,实际Writelen写入的长度
BOOL write(const char *pData);
CString sendAt(char* sendstr);
CString sendAt(CString sendstr);

//多线程接收
void SetReciveFun(pOnReceiveData recvFun);
void startReceiveData();
void stopReceiveData();
protected:
HANDLE _hComDev; //串口句柄
private:
HANDLE _hthread;
static DWORD WINAPI readProc(LPVOID lpparam);
char _port[10];
char readbuff[1024];
DCB _dcb; //设备描述
DWORD _baudRate;
BYTE _ByteSize;
BYTE _StopBits;
BYTE _Parity;
OVERLAPPED _overlapped;
pOnReceiveData _onReceiveData;

CCom* _com;
};

#endif // !defined(AFX_COM_H__8F7F0485_6FD4_4DEC_A4DE_22BD0720F997__INCLUDED_)
回复
csdn网速很慢 2011-07-29
Csdn 不能上传文件我把代码复制上去你帮我看看。非常谢谢


// Com.cpp: implementation of the CCom class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Com.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Clog log1("log1.txt");
int g_err;
CCom::CCom()
{
_hComDev=NULL;
ZeroMemory(_port,10);
_baudRate=115200;
_ByteSize=8;
_StopBits=(BYTE)1.5;
_Parity=NOPARITY;
_isreceiving=true;
}

CCom::~CCom()
{

}

int CCom::open(int szPort,bool isoverlapped)
{
CString temp="";
::sprintf(_port,"\\\\.\\COM%d",szPort);
if(isoverlapped==false)
_hComDev=CreateFile(_port,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
else
_hComDev=CreateFile(_port,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if(_hComDev==INVALID_HANDLE_VALUE)
{
g_err=GetLastError();
// temp.Format("端口打开错误:%d",g_err);
// MessageBox(NULL,temp,"错误提示",MB_OK);//errmsg
return 2;
}
if(setTimeOut(5,3,20)==0)
{

}
if(GetCommState(_hComDev,&_dcb)==0)
{
// g_err=GetLastError();
// temp.Format("获取端口参数失败:%d",g_err);
// MessageBox(NULL,temp,"错误提示",MB_OK);//errmsg
return 3;
}
_dcb.BaudRate=_baudRate; //波特率
_dcb.ByteSize=_ByteSize; //数据位
_dcb.StopBits=_StopBits; //停止位
_dcb.Parity=_Parity; //奇偶效验位
// _dcb.fDtrControl=DTR_CONTROL_DISABLE;
if(SetCommState(_hComDev,&_dcb)==0)
{
g_err=GetLastError();
// temp.Format("设置端口参数失败:%d",g_err);
// MessageBox(NULL,temp,"错误提示",MB_OK);//errmsg
//////test//////
return 4;
}
return 1;
}
void CCom::setCOM(DWORD BaudRate,BYTE ByteSize,BYTE StopBits,BYTE Parity)
{
_baudRate=BaudRate;
_ByteSize=ByteSize;
_StopBits=StopBits;
_Parity=Parity;
}
bool CCom::setTimeOut(DWORD interval,DWORD rMutiplier,DWORD rConstant,DWORD wMutiplier,DWORD wConstant)
{
COMMTIMEOUTS timesOut;
GetCommTimeouts(_hComDev,×Out);
timesOut.ReadIntervalTimeout=interval; // 接收时,两字符间最大的时延
timesOut.ReadTotalTimeoutMultiplier=rMutiplier; // 读取每字节的超时
timesOut.ReadTotalTimeoutConstant=rConstant; // 读串口数据的固定超时
// 总超时 = ReadTotalTimeoutMultiplier * 字节数 + ReadTotalTimeoutConstant
timesOut.WriteTotalTimeoutMultiplier=wMutiplier;// 写串口数据的固定超时
timesOut.WriteTotalTimeoutConstant=wConstant; // 写串口数据的固定超时
if(SetCommTimeouts(_hComDev,×Out)==FALSE)
{
g_err=8000;
MessageBox(NULL,"超时设置失败","错误提示",MB_OK);//errmsg
return FALSE;
}
return true;
}
bool CCom::setBaud(DWORD bandrate) //波特率
{
GetCommState(_hComDev,&_dcb);
_dcb.BaudRate=bandrate;
if(SetCommState(_hComDev,&_dcb)==0)
{
g_err=GetLastError();
MessageBox(NULL,"设置波特率失败","错误提示",MB_OK);//errmsg
return false;
}
return true;
}
bool CCom::setByteSize(BYTE bz) // 数据位大小
{
GetCommState(_hComDev,&_dcb);
_dcb.ByteSize=bz;
if(SetCommState(_hComDev,&_dcb)==0)
{
MessageBox(NULL,"设置端口参数失败","错误提示",MB_OK);//errmsg
return false;
}
return true;
}
bool CCom::setStopBits(BYTE stopB) //停止位
{
GetCommState(_hComDev,&_dcb);
_dcb.StopBits=stopB;
if(SetCommState(_hComDev,&_dcb)==0)
{
MessageBox(NULL,"设置端口参数失败","错误提示",MB_OK);//errmsg
return false;
}
return true;
}
bool CCom::setParity(BYTE parity) //奇偶效验
{
GetCommState(_hComDev,&_dcb);
_dcb.Parity=parity;
if(SetCommState(_hComDev,&_dcb)==0)
{
MessageBox(NULL,"设置端口参数失败","错误提示",MB_OK);//errmsg
return false;
}
return true;
}
bool CCom::close()
{
if(_hComDev==INVALID_HANDLE_VALUE)
return true;
if(CloseHandle(_hComDev)==0)
{
MessageBox(NULL,"串口关闭失败","错误提示",MB_OK);//errmsg
return false;
}
return true;
}


int CCom::WriteCom(void* pData, int nLength)
{
DWORD dwNumWrite; // 串口发出的数据长度

WriteFile(_hComDev, pData, (DWORD)nLength, &dwNumWrite, NULL);

return (int)dwNumWrite;
}

BOOL CCom::write(const char *pData)
{
BOOL err=TRUE;
DWORD Writedlen=0;
err=WriteFile(_hComDev,pData,strlen(pData),&Writedlen,&_overlapped);
int i=0;
while(Writedlen<strlen(pData))
{
if(i>6) break;
i++;
DWORD writed=0;
int len=strlen(pData)-Writedlen;
err=WriteFile(_hComDev,pData+Writedlen,strlen(pData)-Writedlen,&writed,&_overlapped);
Writedlen+=writed;
}
int a=GetLastError();
return err;
}
CString CCom::read()
{
CString result="超时";
DWORD tempDWORD=1;
DWORD readedlen=0;
int i=0;
while(tempDWORD!=0)
{
if(i>5)
break;
i++;
ReadFile(_hComDev,readbuff+readedlen,1024-readedlen,&tempDWORD,&_overlapped);
readedlen+=tempDWORD;
result.Format("%.*s",readedlen,readbuff);
if(result.Find("OK")!=-1)
{
return result;
}
else
{
if(result.Find("ERROR")!=-1)
{
return result;
}
else
{
Sleep(20);
}
}
}
if(readedlen!=0)
{
result.Format("%.*s",readedlen,readbuff);
}
return result;
// DWORD threadid;
// HANDLE ht=CreateThread(NULL,0,readProc,this,0,&threadid);
// if(WaitForSingleObject(ht,5000)==WAIT_OBJECT_0)
// {
// DWORD len=0;
// GetExitCodeThread(ht,&len);
// result=CString(readbuff,len);
// }
// else
// {
// result="超时";
// }
// CloseHandle(ht);

// return result;
}
DWORD WINAPI CCom::readProc(LPVOID lpparam)
{
CCom* com=(CCom*)lpparam;
DWORD readCount=0;
DWORD readedlen=0;
int i=0;
while(com->_isreceiving==TRUE)
{
int a=1;
// log1.writeLine("read");
Sleep(10); //加了sleep_isreceiving的值会出错。。。。
// readCount=1;
// readedlen=0;
// i=0;
// while(readCount>0)
// {
// ReadFile(com->_hComDev,com->readbuff+readedlen,1024-readedlen,&readCount,&(com->_overlapped));
// if(i>10) break;
// i++;
// readedlen+=readCount;
// }
// if(readedlen>0)
// {
// MessageBox(NULL,"1","",MB_OK);
// if(com->_onReceiveData!=NULL)
// {
// com->_onReceiveData(com->readbuff,readedlen);
// }
// }
}

return 0;
}
void CCom::startReceiveData()
{
DWORD threadid;
_com=this;
_com->_isreceiving=TRUE;
_hthread=CreateThread(NULL,0,&readProc,(LPVOID)_com,NULL,&threadid);
//HANDLE hthread=CreateThread(NULL,0,readProc,(LPVOID)NULL,NULL,&threadid);

}
void CCom::stopReceiveData()
{
_isreceiving=false;
Sleep(100); //等待线程退出
}
void CCom::SetReciveFun(pOnReceiveData recvFun)
{
_onReceiveData=recvFun;
}
int CCom::ReadCom(void* pData, int nLength)
{
DWORD dwNumRead; // 串口收到的数据长度

ReadFile(_hComDev, pData, (DWORD)nLength, &dwNumRead, NULL);

return (int)dwNumRead;
}
CString CCom::sendAt(char *sendstr)
{
if(write(sendstr)==FALSE)
return "写入失败!";
return read();
}
CString CCom::sendAt(CString sendstr)
{
if(write(sendstr.GetBuffer(1))==FALSE)
return "写入失败!";
return read();
}

/////////////////。h
回复
haoruixiang 2011-07-29
求看全部代码 一个简简单单的线程都搞不定 出鬼了!!!!!1
回复
csdn网速很慢 2011-07-29
线程的句柄我已改了定义位置。
不过我给贤臣函数前加了&依然不行。 而且看windows多线程有这样一句话。
lpstartaddress 新县城将开始的起始地址。只是已改函数指针(译注:在c语言里函数名代 表函数指针,所以可以放一个函数名称)。

另外情况是这样的while(com->_isreceiving==true)
里边代码都注释了会永远真。。不注释的话只有第一次真后边边随机数了。
高手给分析分析这可能的原因。
回复
houwenqiang 2011-07-29
void CCom::startReceiveData()
{
DWORD threadid;
_isreceiving=true;
_com=this;
HANDLE hthread=CreateThread(NULL,0,readProc,(LPVOID)_com,NULL,&threadid);
//这儿传进去的_com好像是错的。 _isreceiving 是未初始化的。
//HANDLE hthread=CreateThread(NULL,0,readProc,(LPVOID)NULL,NULL,&threadid);
}
你得保证创建完线程后,这个类的对象在线程运行期间是存在的
回复
haoruixiang 2011-07-29
[Quote=引用 5 楼 jiergio 的回复:]

楼上的高手经过我仔细反复的检查。1发现你的线程创建参数&myThreadFunc多了个取址符号。
2你的线程函数不是静态的。
你指的不同是那个?我看不出来错误原因。
[/Quote]

传入的函数 静态的 和全局的都行 但是 传入的时候要 取函数的地址 因为CreateThread 的第3个参数是以指针的形式传入的 所以要取地址 或者 你定义一个指针函数 传入也行
回复
c_losed 2011-07-29
[Quote=引用 3 楼 haoruixiang 的回复:]

class Hrthreadx
{
public:
Hrthreadx(){
m_handle = NULL;
};
virtual ~Hrthreadx(){
if(m_handle != NULL) CloseHandle(m_handle);
};
virtual void Execution(){
};
int CreatThread(){
m_handle = ……
[/Quote]
+1 支持这种写法
回复
csdn网速很慢 2011-07-29
楼上的高手经过我仔细反复的检查。1发现你的线程创建参数&myThreadFunc多了个取址符号。
2你的线程函数不是静态的。
你指的不同是那个?我看不出来错误原因。
回复
haoruixiang 2011-07-27
自己看看有什么不同
回复
haoruixiang 2011-07-27
class Hrthreadx
{
public:
Hrthreadx(){
m_handle = NULL;
};
virtual ~Hrthreadx(){
if(m_handle != NULL) CloseHandle(m_handle);
};
virtual void Execution(){
};
int CreatThread(){
m_handle = CreateThread(NULL,0, &myThreadFunc, this, 0, NULL);
if(m_handle == NULL) return -1;
return 0;
};
private:
HANDLE m_handle;
};

DWORD WINAPI myThreadFunc(LPVOID lpParameter)
{
Hrthreadx* p = (Hrthreadx*)lpParameter;
p->Execution();
return 0;
};
回复
csdn网速很慢 2011-07-27
哎,千年谜团终不得解!
回复
csdn网速很慢 2011-07-26
觉得是this的问题。
因为我写
CCom* com=new CCom(); com->isreceiving=true; 这样就可以让线程无限循环。
有谁发表下意见吗、?
回复
相关推荐
发帖
其它技术问题
创建于2007-09-28

3849

社区成员

C/C++ 其它技术问题
申请成为版主
帖子事件
创建了帖子
2011-07-26 05:40
社区公告
暂无公告