2016-02-02 38 views
0

你好,我正試圖在執行過程中打破循環。循環顯示從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"); 
} 

程序倒計時,在中間的倒計數我試圖打破loop.thread1函數接受一個輸入和修改停止(全局變量)。但主函數中的循環不會中斷(它應該)。循環繼續減少循環變量,變爲零,循環結束。

+0

我們可以有你獲得什麼,你想要的一些例子嗎? – Garf365

+0

而且,personnaly,我將反線程,立即殺死線程主線 – Garf365

+0

@ Garf365我要打破main()中的循環。請詳細說明反螺紋部分。 – anjanik012

回答

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

    } 
0

您必須聲明停止揮發性

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

+0

使我的變量易變但仍不能中斷。 – anjanik012