在执行期间中断循环时出错
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");
【讨论】:
以上是关于在执行期间中断循环时出错的主要内容,如果未能解决你的问题,请参考以下文章