在执行期间中断循环时出错

Posted

技术标签:

【中文标题】在执行期间中断循环时出错【英文标题】:Error in breaking a loop during its execution 【发布时间】:2016-02-02 09:27:07 【问题描述】:

您好,我试图在执行过程中中断循环。循环显示从 5-1 开始的秒数倒计时。我想使用用户输入的任何击键来中断循环。我研究了一段时间并创建了一个线程。我设置了一个全局变量并在第二个线程中更新了它。我使用该全局变量在主函数中给出了一个条件,但循环没有中断。

这里是代码。 请帮忙。

 #include<iostream>
 #include<windows.h>
 #include<stdlib.h>
 #include<iomanip>
 #include<stdio.h>
 using namespace std;

 bool stop=false;

 DWORD WINAPI thread1(LPVOID pm)

//check the getchar value
int a = getchar();
while (a != '0')
    a = getchar();

stop = true;
return 0;

int main()


  HANDLE handle = CreateThread(NULL, 0, thread1, NULL, 0, NULL);
  for(int i=5;i>0 && !stop;i--)
  
    cout<<"\n\n\n\n\n\n";
    cout<<setw(35);
    cout<<i;
    Sleep(1000);
    system("CLS");
 
  system("PAUSE");

程序倒计时,在倒计时中间我试图打破循环。thread1 函数接受输入并修改停止(全局变量)。但是主函数中的循环不会中断(它应该)。循环继续减少循环变量,变为零并且循环结束。

【问题讨论】:

我们可以举一些例子说明你得到了什么和你想要什么? 而且,我个人将反转线程,从主线程中立即杀死递减线程 @Garf365 我想打破 main() 中的循环。并请详细说明反螺纹部分。 你没有解释你期望的行为是什么以及当前代码有什么问题 @Garf365 。现在我有了。 【参考方案1】:

你必须将 stop 声明为 volatile

volatile bool stop

它通知编译器未优化(通过缓存)对变量的访问,因为另一个线程可以修改它。

另外,注意多线程对全局变量的读写访问:在大多数情况下,您必须使用互斥锁来保护它们。 (我认为在你的情况下,根据基本的小类型和基本的访问权限是没有必要的,但要小心)

编辑

在 cmets 中询问,这是我在反转线程时的设计:

#include<iostream>
#include<windows.h>
#include<stdlib.h>
#include<iomanip>
#include<stdio.h>
using namespace std;

volatile bool stop = false;

DWORD WINAPI thread1(LPVOID pm)

    for(int i=5;i>0 && !stop;i--)
    
        cout<<"\n\n\n\n\n\n";
        cout<<setw(35);
        cout<<i;
        Sleep(1000);
        system("CLS");
    
    return 0;


int main()

    HANDLE handle = CreateThread(NULL, 0, thread1, NULL, 0, NULL);
    //check the getchar value
    int a = getchar();
    while (a != '0')
        a = getchar();
    
    stop = true;
    WaitForSingleObject(handle, INFINITE);

    system("PAUSE");

使用此解决方案,它会在等待 1s 后停止。如果您想立即终止,您可以使用TerminateThread,但请先阅读:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686717%28v=vs.85%29.aspx

【讨论】:

使我的变量易失,但仍然无法中断。【参考方案2】:

找到了。 getchar() 正在等待回车。所以我使用了 conio 库中的 _getch() 。像这样。

#include<iostream>
#include<Windows.h>
#include<conio.h>
#include<stdlib.h>
#include<iomanip>
using namespace std;
volatile bool stop = false;
DWORD WINAPI thread1(LPVOID pm)

  int a = 0;
  while (a==0)
  
    a = _getch();
  
  stop = true;
  return 0;


 int main()

  HANDLE handle = CreateThread(NULL, 0, thread1, NULL, 0, NULL);
  int i;
  for ( i = 5; i > 0 && !stop; i--)
  
    cout << "\n\n\n\n\n\n";
    cout << setw(35);
    cout << i;
    Sleep(1000);
    system("CLS");
   
   if (i != 0)
    cout << "Loop broken sucessflly.\n";
   else
    cout << "Attempt failed\n";
   system("PAUSE");

  

【讨论】:

以上是关于在执行期间中断循环时出错的主要内容,如果未能解决你的问题,请参考以下文章

kafkaStream解析json出错导致程序中断的解决方法

循环时出错:尝试在 vectorIndex 中选择多个元素

在返回另一个函数的函数中执行程序时出错

R(插入符号)-在循环中训练“mlpML”模型时出错

在单元测试中创建 coredata 文件时出错

异常处理