为什么C++程序进入线程以后,就不能进行其他操作了呢?只能执行线程里面的程序了

hangfurang2331 2017-06-24 09:29:45
我编写了一个上位机程序,在线程里面进行数据的接收,但线程一旦开启之后,就一直在接收数据,我想通过一个按键,可以控制这个线程的开始于结束,但是却发现,线程一旦开启,就一直在运行,好像死机了一样,就不能进行其他操作了,我想问这是怎么回事呢?有什么解决方法吗?
以下是我的线程程序:
UINT ReadThreadLoop( LPVOID params ) {		//线程处理

CString strtemp;

CSlaveFIFODlg *dlg = (CSlaveFIFODlg *) params;
OVERLAPPED inOvLap;

ZeroMemory(inData,2048);
inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN");
dlg->InEndpt->TimeOut = 1;
for (;dlg->ReadThreadLooping ;) //循环
{
UCHAR *inContext = dlg->InEndpt->BeginDataXfer(inData,inlen,&inOvLap);
dlg->InEndpt->WaitForXfer(&inOvLap,100);
success = dlg->InEndpt->FinishDataXfer(inData,inlen, &inOvLap,inContext);

if(success ) //如果读取成功,则进行波形显示
{
for(int i = 0,j = 1,k = 0;i < 2048;i=i+2,j=j+2,k++)
{
DataBuffer[k] =inData[j]*256.0 + inData[i];

strtemp.Format(_T("%d"),DataBuffer[k]);
DataWave[k] = (((DataBuffer[k] / 65536.0) * 4.096) - 2.048) * 5000.0;

}

PostMessage(hWindow,WM_DRAWPICTURE,0,0);
}
}

CloseHandle(inOvLap.hEvent);
delete []inData;

return true;
}
...全文
611 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
sichuanwww 2017-07-05
  • 打赏
  • 举报
回复
::Sleep(10);
xiaohuh421 2017-07-04
  • 打赏
  • 举报
回复
引用 16 楼 hangfurang2331 的回复:
]
UINT ReadThreadLoop( LPVOID params ) {        //线程处理
我的这个程序难道不是线程吗?
你这里只是写了一个函数而以, 要看这个函数是否在线程中运行,
hangfurang2331 2017-07-03
  • 打赏
  • 举报
回复
引用 23 楼 schlafenhamster 的回复:
降低 线程的 反应速度 可以 在 线程 中 加入 Sleep(100); 因为 系统是 按照 线程 进行 调度的 (约 100ms 改变一个 线程),你的 线程 占用 太多的 时间 就影响 主线程 的 执行了
我加了一个Sleep(100)就可以操作了,估计就是程序反应速度的问题,多谢您了
schlafenhamster 2017-07-03
  • 打赏
  • 举报
回复
再一个 线程中 不要对 界面 操作 即那个 dlg-> 线程中 只读 窗口 , 读到 数据 后 发 消息 给 对话框。
schlafenhamster 2017-07-03
  • 打赏
  • 举报
回复
降低 线程的 反应速度 可以 在 线程 中 加入 Sleep(100); 因为 系统是 按照 线程 进行 调度的 (约 100ms 改变一个 线程),你的 线程 占用 太多的 时间 就影响 主线程 的 执行了
hangfurang2331 2017-07-03
  • 打赏
  • 举报
回复
引用 21 楼 schlafenhamster 的回复:
"那我的这个线程死循环" 线程本来就是要死循环的,除非退出。
目前存在的问题就是,这个线程一旦开启之后,我就不能操作上位机中的其命令了,上位机中的“退出”按钮,都无法点击,感觉像是死机似的
schlafenhamster 2017-07-03
  • 打赏
  • 举报
回复
"那我的这个线程死循环" 线程本来就是要死循环的,除非退出。
hangfurang2331 2017-07-03
  • 打赏
  • 举报
回复
引用 19 楼 schlafenhamster 的回复:
上面那个叫创建 工作者 线程 下面那个叫 UI 线程 通常 使用 上面 那个 就可以了。
嗯嗯,好的,那我的这个线程死循环有没有其他解决方法啊
schlafenhamster 2017-07-03
  • 打赏
  • 举报
回复
上面那个叫创建 工作者 线程 下面那个叫 UI 线程 通常 使用 上面 那个 就可以了。
hangfurang2331 2017-07-03
  • 打赏
  • 举报
回复
引用 17 楼 schlafenhamster 的回复:
for (;dlg->ReadThreadLooping ;) 中的 要通过 CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); pfnThreadProc,=ReadThreadLooping ; 来创建。(Worker thread) 否则 使用 void DoEvents() { MSG msg; // Process existing messages in the application's message queue. // When the queue is empty, do clean up and return. while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) {// has msg if (!AfxGetThread()->PumpMessage()) break; } } for (;dlg->ReadThreadLooping ;) 中加入 DoEvents();
CWinThread* AFXAPI AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam,
	int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0,
	DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
CWinThread* AFXAPI AfxBeginThread(CRuntimeClass* pThreadClass,
	int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0,
	DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
程序中,有您说的这个线程创建函数,上面就是我的程序中存在的
schlafenhamster 2017-07-03
  • 打赏
  • 举报
回复
for (;dlg->ReadThreadLooping ;) 中的 要通过 CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); pfnThreadProc,=ReadThreadLooping ; 来创建。(Worker thread) 否则 使用 void DoEvents() { MSG msg; // Process existing messages in the application's message queue. // When the queue is empty, do clean up and return. while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) {// has msg if (!AfxGetThread()->PumpMessage()) break; } } for (;dlg->ReadThreadLooping ;) 中加入 DoEvents();
hangfurang2331 2017-07-03
  • 打赏
  • 举报
回复
引用 15 楼 xiaohuh421 的回复:
解决办法很显然啊, 把耗时的操作, 放到线程中去执行就好了, 不要在主线程中.
UINT ReadThreadLoop( LPVOID params ) {        //线程处理
我的这个程序难道不是线程吗?
xiaohuh421 2017-06-30
  • 打赏
  • 举报
回复
解决办法很显然啊, 把耗时的操作, 放到线程中去执行就好了, 不要在主线程中.
zhujinqiang 2017-06-30
  • 打赏
  • 举报
回复
没有创建子线程,然后是主线程的界面死循环了吧。
hangfurang2331 2017-06-28
  • 打赏
  • 举报
回复
引用 12 楼 xiaohuh421 的回复:
如果界面死了, 那么基本可以肯定, 你是在主线程中运行的你的代码, 而没有创建子线程.
有什么解决的办法吗
xiaohuh421 2017-06-28
  • 打赏
  • 举报
回复
如果界面死了, 那么基本可以肯定, 你是在主线程中运行的你的代码, 而没有创建子线程.
schlafenhamster 2017-06-27
  • 打赏
  • 举报
回复
详细见 “带流控制的串口通讯程序.rar” http://download.csdn.net/detail/schlafenhamster/4195462
hangfurang2331 2017-06-27
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
// 告诉 主程序 数据准备好了 pUload->PostMessage(WM_COMMNOTIFY, (WPARAM)1, // EV_RXCHAR (LPARAM)0); // not used // 等待 主程序 处理完毕 WaitForSingleObject(pUload->m_hPostEventRead,0xFFFFFFFF);
嗯嗯,谢谢您的解答
schlafenhamster 2017-06-27
  • 打赏
  • 举报
回复
// 告诉 主程序 数据准备好了 pUload->PostMessage(WM_COMMNOTIFY, (WPARAM)1, // EV_RXCHAR (LPARAM)0); // not used // 等待 主程序 处理完毕 WaitForSingleObject(pUload->m_hPostEventRead,0xFFFFFFFF);
赵4老师 2017-06-27
  • 打赏
  • 举报
回复
《Windows核心编程》
加载更多回复(7)
内容概要:本文详细介绍了一个基于C++语言开发的疫苗接种和儿童体检系统的设计与实现全过程,涵盖项目背景、目标意义、架构设计、核心功能模块、数据库实现、API接口规范、前后端代码实现及部署应用等多个方面。系统采用分层架构与模块化设计,实现了儿童信息管理、疫苗接种记录、体检数据录入、多用户权限控制、数据统计分析、异常预警、安全加密与日志审计等核心功能,并通过MySQL数据库进行数据持久化,结合Qt实现图形化界面,支持高并发、数据脱敏、多平台对接与自动化部署。项目强调数据安全、隐私保护与系统可扩展性,适用于社区医疗、疾控中心、学校及医院等场景。; 适合人群:具备C++编程基础,熟悉数据库操作和基本软件工程流程的开发人员、计算机及相关专业学生、医疗信息化项目开发者,以及希望了解完整医疗管理系统开发流程的技术人员。; 使用场景及目标:①学习如何使用C++构建完整的医疗信息管理系统;②掌握数据库设计、前后端交互、权限控制、多线程处理和GUI开发等关键技术;③应用于社区卫生服务、学校健康管理、疾控数据统计等实际业务场景,提升儿童健康管理水平;④作为课程设计、毕业设计或实际项目的参考模板。; 阅读建议:建议读者结合文档中的代码示例与数据库脚本,搭建本地开发环境进行实践操作,重点关注系统架构设计、模块解耦、安全机制与前后端交互逻辑,深入理解各功能模块的实现原理,并尝试在此基础上进行功能扩展,如接入移动端或增加AI分析模块。

15,467

社区成员

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

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