你好我试图在执行过程中打破循环。循环显示从5-1倒数秒。我想使用用户输入的任何击键打破中间的循环。我研究了一段时间并创建了一个线程。我设置了一个全局变量并在第二个线程中更新了它。我使用该全局变量在main函数中给出了一个条件,但循环不会中断。
这是代码。 请帮忙。
#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");
}
程序倒计时并且在倒计时的中间我试图打破loop.thread1函数接受输入并修改stop(全局变量)。但是main函数中的循环不会中断(它应该).Loop继续递减循环变量,变为零并且循环结束。
答案 0 :(得分:0)
你必须将stop声明为volatile
volatile bool stop
它通知编译器未优化(通过缓存)对变量的访问,因为另一个线程可以修改它。
此外,请注意许多线程对全局变量的读写访问:在大多数情况下,您必须使用互斥锁来保护它们。 (我认为在你的情况下,没有必要根据基本的小型和基本访问,但要小心)
修改强>
在评论中提问,这是我反转线程的设计:
#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");
}
使用此解决方案,等待1秒后它将停止。如果您想立即终止,可以使用TerminateThread
但请先阅读此内容:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686717%28v=vs.85%29.aspx
答案 1 :(得分:0)
找到它。 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");
}