socket传输来的数据实时处理的问题 MFC socket 数据处理MFCsocket数据实时处理 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 zhaoze87请问,互斥,是指在下一个timer触发时,在ontimer中,对mstr进行刷新和子线程对mstr进行处理之间的互斥吗?还是说,上一次timer触发时开的子线程如果没有执行完毕与这次timer触发又要开的子线程之间的互斥?因为,我想每隔一段时间对读取的数据进行一次处理,所以在定时器函数中开的子线程。因为不知道线程处理数据需要的时间,所以不确定在两次timer触发时间之内,线程能否执行完毕,是不是要加线程互斥?我是新手,问题可能有点啰嗦,请您不吝赐教。 这是socket中OnRecieve()函数的代码void CMySocket::OnReceive(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class char chMsgTemp[10240]={0}; CString chMsg; CString chmsg; UINT unRXCharNum; //每次接收到的字符数 BOOL bEndFlag=0; //接收完毕标志 do { unRXCharNum=Receive(chMsgTemp,10240);//每次从socket中读入10K字节 if(unRXCharNum>10240||unRXCharNum<=0) { AfxMessageBox("接收数据中出错",MB_OK); return; } else if(unRXCharNum<10240 && unRXCharNum>0)// { chMsgTemp[unRXCharNum]=NULL; bEndFlag=1; } chmsg.Format("%s",chMsgTemp); chMsg+=chmsg; memset(chMsgTemp,0,sizeof(chMsgTemp)); }while(bEndFlag==0); CSClientDlg* pDlg=(CSClientDlg*)AfxGetMainWnd(); //得到主框口(对话框)指针 pDlg->m_strRXDataTemp=chMsg; CSocket::OnReceive(nErrorCode); }这是我在OnTimer函数中的代码:void CSClientDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default switch(nIDEvent) { case 1: { m_MyReceiveData+=m_strRXDataTemp;//m_MyReceiveData是全局变量 UpdateData(FALSE); //开线程处理数据 Info.lsdatastr=m_MyReceiveData;//Info是定义的结构体变量,线程参数 pThread=AfxBeginThread(DataProThreadFunc,&Info);...... 请各位帮忙看看,关于接收函数和OnTimer函数有什么不对的地方 在ontimer中,对mstr进行刷新和子线程对mstr进行处理要进行互斥,因为处于不同线程,可能在ontimer处理mstr的时候,子线程也在同时处理你下面的ontimer函数执行一次就开一个线程,这是想做啥? 你可以在接受线程中new动态分配内存保存接受数据,然后通过postmessge把内存指针发送给界面,界面处理完后delete,这样的话就无需同步。 在ontimer中,对mstr进行刷新和子线程对mstr进行处理要进行互斥,因为处于不同线程,可能在ontimer处理mstr的时候,子线程也在同时处理你下面的ontimer函数执行一次就开一个线程,这是想做啥?ontimer对mstr定时进行刷新,要使子线程对mstr中的内容能做到相对及时的处理,子线程不是应该要每隔一段时间获取一次mstr,并进行处理一次吗?我查了不少资料,还是不太懂线程的运行机制,我本来在onstart函数中开子线程,这个是给socket发送连续测量命令的函数,但是我想到,这个函数只在点击开始测量时打开子线程,子线程获取mstr处理一次,然后结束。之后ontimer对mstr刷新,再怎么处理?还是我对线程的运行机制理解错误?查了好久还是没懂,请给点指点。 我的思路也是把数据处理交给另一个线程,您所指的数据同步,是什么意思?还有请帮看看8楼的代码,子线程的调用位置应该怎么设定,才能让子线程每隔一段时间从接收的数据中获取一次刷新后的数据再进行处理?貌似在ontimer里面开线程确实有点问题,请给点指点。 VS2010资源编辑器问题 QQ是用什么工具开发的? 麻烦大家帮忙翻译下 哪位高手帮我写个Dll,打开文件夹对话框,给VB6使用 请问如何获取jpeg图像的灰度矩阵 编译问题! 怎么得到当前操作的控件 access数据库文件的位置问题 请教诸位大侠一个编程方面的问题(急等) 无法对DAO/Jet DB进行初始化!! 这里有三个小问题,每一个解决给100分。 "Hello,MFC"这个例子里面,为什么new CMainWindow后没有delete的步骤?
请问,互斥,是指在下一个timer触发时,在ontimer中,对mstr进行刷新和子线程对mstr进行处理之间的互斥吗?还是说,上一次timer触发时开的子线程如果没有执行完毕与这次timer触发又要开的子线程之间的互斥?
因为,我想每隔一段时间对读取的数据进行一次处理,所以在定时器函数中开的子线程。因为不知道线程处理数据需要的时间,所以不确定在两次timer触发时间之内,线程能否执行完毕,是不是要加线程互斥?
我是新手,问题可能有点啰嗦,请您不吝赐教。
void CMySocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
char chMsgTemp[10240]={0};
CString chMsg;
CString chmsg;
UINT unRXCharNum; //每次接收到的字符数
BOOL bEndFlag=0; //接收完毕标志
do
{
unRXCharNum=Receive(chMsgTemp,10240);//每次从socket中读入10K字节
if(unRXCharNum>10240||unRXCharNum<=0)
{
AfxMessageBox("接收数据中出错",MB_OK);
return;
}
else if(unRXCharNum<10240 && unRXCharNum>0)//
{
chMsgTemp[unRXCharNum]=NULL;
bEndFlag=1;
}
chmsg.Format("%s",chMsgTemp);
chMsg+=chmsg;
memset(chMsgTemp,0,sizeof(chMsgTemp));
}while(bEndFlag==0);
CSClientDlg* pDlg=(CSClientDlg*)AfxGetMainWnd(); //得到主框口(对话框)指针
pDlg->m_strRXDataTemp=chMsg;
CSocket::OnReceive(nErrorCode);
}
这是我在OnTimer函数中的代码:
void CSClientDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent)
{
case 1:
{
m_MyReceiveData+=m_strRXDataTemp;//m_MyReceiveData是全局变量
UpdateData(FALSE);
//开线程处理数据
Info.lsdatastr=m_MyReceiveData;//Info是定义的结构体变量,线程参数
pThread=AfxBeginThread(DataProThreadFunc,&Info);
......
你下面的ontimer函数执行一次就开一个线程,这是想做啥?
你下面的ontimer函数执行一次就开一个线程,这是想做啥?ontimer对mstr定时进行刷新,要使子线程对mstr中的内容能做到相对及时的处理,子线程不是应该要每隔一段时间获取一次mstr,并进行处理一次吗?
我查了不少资料,还是不太懂线程的运行机制,我本来在onstart函数中开子线程,这个是给socket发送连续测量命令的函数,但是我想到,这个函数只在点击开始测量时打开子线程,子线程获取mstr处理一次,然后结束。之后ontimer对mstr刷新,再怎么处理?
还是我对线程的运行机制理解错误?
查了好久还是没懂,请给点指点。
我的思路也是把数据处理交给另一个线程,您所指的数据同步,是什么意思?
还有请帮看看8楼的代码,子线程的调用位置应该怎么设定,才能让子线程每隔一段时间从接收的数据中获取一次刷新后的数据再进行处理?
貌似在ontimer里面开线程确实有点问题,请给点指点。