在执行期间打破循环时出错

时间:2016-02-02 09:27:07

标签: c++ multithreading winapi

你好我试图在执行过程中打破循环。循环显示从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继续递减循环变量,变为零并且循环结束。

2 个答案:

答案 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");

  }