为什么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;
}
...全文
589 27 打赏 收藏 转发到动态 举报
写回复
用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)

15,471

社区成员

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

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