do while成死循环了,怎么解决?

dingshanwei123 2013-07-02 11:12:42
do{
if(cs->KBD_Reset_System_Error() != ERR_OK) continue;
if(cs->KBD_Start_Check() == ERR_OK) {
do {
ret = cs->KBD_Get_Op_Status();//从线程得到一个值
Sleep(100);
}while((ret != LAST_FAILED)&&(ret != READY)&&(ret != FINISHED));
if(ret == LAST_FAILED) {
} else if(ret == FINISHED) {
if(ERR_OK == cs->KBD_Get_MagData(tracks)) {
for (j=0;j<3;j++){
for (i=0;i<(tracks[0].data_len/8+1);i++) {
this->textBox1->Text= this->textBox1->Text + tracks[j].data[i];
}
}
if(ERR_OK == cs->KBD_WriteAndPrint(1,tracks,1,1)) {
Sleep(1000); }
}}
}}while(1);

想实现轮流执行这行代码,单步调试的时候没事,但是直接运行时一点击按钮就点不动了,怎么解决啊?谢谢
...全文
586 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dingshanwei123 2013-07-08
  • 打赏
  • 举报
回复
还是加了一个线程才行啊
lm_whales 2013-07-08
  • 打赏
  • 举报
回复
MSG msg; while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&msg) ; DispatchMessage(&msg); //千万不要Sleep(1000);这个当然卡了,一秒才有一次。 //这里把运行时间长的程序,切割成运行时间短的程序反复运行,有等待,Sleep则要,改用多线程处理。 }
zhxianbin 2013-07-02
  • 打赏
  • 举报
回复
可能需要多线程了,上面代码运行在另外一个线程中 cs->KBD_Start_Check() == ERR_OK 时,通知主线程
dingshanwei123 2013-07-02
  • 打赏
  • 举报
回复
MSG msg; while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&msg) ; DispatchMessage(&msg); } 加入这个了,还是卡了
www_adintr_com 2013-07-02
  • 打赏
  • 举报
回复
错了, GetMessage 改成 PeekMessage, 并判断下返回值再调用 后面两句.
www_adintr_com 2013-07-02
  • 打赏
  • 举报
回复
引用 5 楼 dingshanwei123 的回复:
linux中时在main函数中创建的线程,windows是在按钮事件中创建的线程,这两者不一样吗?这两个都是主线程吧?线程不怎么懂,怎么放到工作线程里呢?
linux 中看到的 main 不做其它事情了吧? 它又不在接受输入哪些处理了, 卡在循环里也没关系. 你的这个是在界面线程中, 线程还需要处理界面消息, 卡在这个循环里了, 界面消息没法处理, 界面就卡住呢. 你都不是开过线程了吗, 怎么又不会了呢? 或者给你一个简单的办法, 在 while 中加一个消息循环来响应界面消息: do{ MSG msg; GetMessage(&msg,NULL,0,0); TranslateMessage(&msg); DispatchMessage(&msg); if(cs->KBD_Reset_System_Error() != ERR_OK) continue; if(cs->KBD_Start_Check() == ERR_OK) { ...
dingshanwei123 2013-07-02
  • 打赏
  • 举报
回复
linux中时在main函数中创建的线程,windows是在按钮事件中创建的线程,这两者不一样吗?这两个都是主线程吧?线程不怎么懂,怎么放到工作线程里呢?
www_adintr_com 2013-07-02
  • 打赏
  • 举报
回复
linux 用的时候是在界面的主线程中使用的吗? 你在界面主线程中使用当然会卡界面. 把它放到一个工作线程里面去运行吧.
dingshanwei123 2013-07-02
  • 打赏
  • 举报
回复
有线程的啊,打开端口的时候就创建了一个线程,得到上面ret = cs->KBD_Get_Op_Status()的值,并且是变化的,这代码是从linux中来的,linux中可以,怎么回事
Carl_CCC 2013-07-02
  • 打赏
  • 举报
回复
要么break,要么函数中还可以return,不然退不出。
www_adintr_com 2013-07-02
  • 打赏
  • 举报
回复
while(1) 中间又没有 break 当然是死循环的呀
dingshanwei123 2013-07-02
  • 打赏
  • 举报
回复
再顶一下?怎么解决呢?弄了半天了

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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