for循环什么时候停止?

Stack_mz 2017-03-10 09:41:10
这是一段很出名的用CyAPI进行USB的Slave FIFO数据采集的程序。代码是其中的一个线程。我也没有学过C++的线程,我不明白为什么说读取512个字节后将自动停止for循环????

UINT ReadThreadLoop( LPVOID params ) { //线程处理
bool okin;
CMySampleDlg *dlg = (CMySampleDlg *) params;
OVERLAPPED inOvLap; //是一个包含了用于异步输入输出的信息的结构体
PUCHAR inData = new UCHAR[512]; //数据缓冲区
ZeroMemory(inData,1024); //ZeroMemory用0填充一片内存,第一个参数是起始地址,第二个参数是长度
inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN");
dlg->InEndpt->TimeOut = 0;

for (;dlg->ReadThreadLooping ;) //循环
{
LONG inlen=512;
//异步读数据
UCHAR *inContext = dlg->InEndpt->BeginDataXfer(inData,inlen,&inOvLap);
dlg->InEndpt->WaitForXfer(&inOvLap,200);
okin = dlg->InEndpt->FinishDataXfer(inData,inlen, &inOvLap,inContext);
if (okin) //如果读取成功,则保存数据
{
mFile.SeekToEnd();
mFile.Write(inData,inlen);
}
}
//结束Start
ept->Target = TGT_DEVICE;
ept->ReqType = REQ_VENDOR;
ept->Direction = DIR_TO_DEVICE;
ept->ReqCode = 0xAB; //请求码
ept->Value = 0;
ept->Index = 0;

PUCHAR buf=new UCHAR[2];
ZeroMemory(buf, 2);
LONG buflen = 2;
buf[0]=0xAB;
buf[1]=0x00; //结束Start
ept->XferData(buf,buflen);

CloseHandle(inOvLap.hEvent);

delete [] inData;
dlg->ReadThread = NULL; //线程结束

dlg->USBDevice->Close(); //关闭USB设备

mFile.Flush(); //关闭文件
mFile.Close();

return true;
}
...全文
845 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-03-13
  • 打赏
  • 举报
回复
VS IDE中,在ReadThreadLooping上点鼠标右键,选查看所有引用。
向立天 2017-03-13
  • 打赏
  • 举报
回复
那你就全文档搜一下ReadThreadLooping看看哪里还有赋值
kakabulusi 2017-03-13
  • 打赏
  • 举报
回复
这类循环的结束运行方式, 一般是通过其他的线程改变循环判定的值,或者接受其他线程中发送给自己的消息 , 来结束自己的循环。 不妨了解一下windows的消息运行机制。 本身就是一个 while(TRUE) { 接受消息; 处理消息; }
Stack_mz 2017-03-12
  • 打赏
  • 举报
回复
引用 7 楼 xianglitian 的回复:
[quote=引用 6 楼 Stack_mz 的回复:] 这里是MFC中开启线程的代码段

void CMySampleDlg::OnButton4() 
{
	// TODO: Add your control notification handler code here
	if (ReadThread)
	{
		ReadThreadLooping = false;
		ReadThread=NULL;					//线程结束
		SetDlgItemText(IDC_EDIT2,"传输完毕!");
	} 
	else 
	{
		if (USBDevice->IsOpen()) {			//检测USB是否打开
			ReadThreadLooping = true;
			ReadThread = AfxBeginThread(ReadThreadLoop, this);	//开启线程
			SetDlgItemText(IDC_EDIT2,"正在传输!");
		}
	}
}
这不是有个按钮消息赋值false么[/quote] 但是例程说的是采集512个数据后,他会自己动停止
向立天 2017-03-12
  • 打赏
  • 举报
回复
引用 6 楼 Stack_mz 的回复:
这里是MFC中开启线程的代码段

void CMySampleDlg::OnButton4() 
{
	// TODO: Add your control notification handler code here
	if (ReadThread)
	{
		ReadThreadLooping = false;
		ReadThread=NULL;					//线程结束
		SetDlgItemText(IDC_EDIT2,"传输完毕!");
	} 
	else 
	{
		if (USBDevice->IsOpen()) {			//检测USB是否打开
			ReadThreadLooping = true;
			ReadThread = AfxBeginThread(ReadThreadLoop, this);	//开启线程
			SetDlgItemText(IDC_EDIT2,"正在传输!");
		}
	}
}
这不是有个按钮消息赋值false么
sichuanwww 2017-03-11
  • 打赏
  • 举报
回复
向立天 2017-03-11
  • 打赏
  • 举报
回复
for循环三个参数 第一个是初始化 第二个是循环终止判断 第三个是循环结束时的循环变量调整
Stack_mz 2017-03-11
  • 打赏
  • 举报
回复
这里是MFC中开启线程的代码段

void CMySampleDlg::OnButton4() 
{
	// TODO: Add your control notification handler code here
	if (ReadThread)
	{
		ReadThreadLooping = false;
		ReadThread=NULL;					//线程结束
		SetDlgItemText(IDC_EDIT2,"传输完毕!");
	} 
	else 
	{
		if (USBDevice->IsOpen()) {			//检测USB是否打开
			ReadThreadLooping = true;
			ReadThread = AfxBeginThread(ReadThreadLoop, this);	//开启线程
			SetDlgItemText(IDC_EDIT2,"正在传输!");
		}
	}
}
Stack_mz 2017-03-11
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
dlg->ReadThreadLooping值为False时就停止循环
谢谢你的回答 我有一定的编程基础,我明白肯定是为FALSE时停止。我不懂的是ReadThreadLooping是怎么变成FALSE的呢?

CMySampleDlg(CWnd* pParent = NULL);	// standard constructor
	CCyUSBDevice *USBDevice;
	CWinThread *ReadThread;
	CCyUSBEndPoint *InEndpt;

	BOOL ReadThreadLooping;
Stack_mz 2017-03-11
  • 打赏
  • 举报
回复
引用 2 楼 xianglitian 的回复:
for循环三个参数 第一个是初始化 第二个是循环终止判断 第三个是循环结束时的循环变量调整
谢谢你的回答 我有一定的编程基础,我明白肯定是为FALSE时停止。我不懂的是ReadThreadLooping是怎么变成FALSE的呢?

CMySampleDlg(CWnd* pParent = NULL);	// standard constructor
	CCyUSBDevice *USBDevice;
	CWinThread *ReadThread;
	CCyUSBEndPoint *InEndpt;

	BOOL ReadThreadLooping;
worldy 2017-03-10
  • 打赏
  • 举报
回复
dlg->ReadThreadLooping值为False时就停止循环

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧