do while成死循环了,如何解决
do while成死循环了,怎么解决?
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);
想实现轮流执行这行代码,单步调试的时候没事,但是直接运行时一点击按钮就点不动了,怎么解决啊?谢谢
------解决方案--------------------
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) {
...
------解决方案--------------------
可能需要多线程了,上面代码运行在另外一个线程中 cs->KBD_Start_Check() == ERR_OK 时,通知主线程
------解决方案--------------------
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg) ;
DispatchMessage(&msg);
//千万不要Sleep(1000);这个当然卡了,一秒才有一次。
//这里把运行时间长的程序,切割成运行时间短的程序反复运行,有等待,Sleep则要,改用多线程处理。
}
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);
想实现轮流执行这行代码,单步调试的时候没事,但是直接运行时一点击按钮就点不动了,怎么解决啊?谢谢
线程,do while 死循环
------解决方案--------------------
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) {
...
------解决方案--------------------
可能需要多线程了,上面代码运行在另外一个线程中 cs->KBD_Start_Check() == ERR_OK 时,通知主线程
------解决方案--------------------
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg) ;
DispatchMessage(&msg);
//千万不要Sleep(1000);这个当然卡了,一秒才有一次。
//这里把运行时间长的程序,切割成运行时间短的程序反复运行,有等待,Sleep则要,改用多线程处理。
}