2016-02-02 3 views
0

Привет, я пытался разбить цикл в середине его выполнения. Цикл показывает обратный отсчет секунд из 5-1. Я хочу разбить цикл в середине, используя любое нажатие клавиши, введенное user.I исследовал в течение некоторого времени и создал поток. Я установил глобальную переменную и обновил ее во втором потоке. Я дал условие в основной функции, используя эту глобальную переменную, но цикл не прерывается.Ошибка при разрыве цикла во время его выполнения

Вот код. Пожалуйста, помогите.

#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 принимает входной и изменяет остановку (глобальная переменная). Но цикл в основной функции не прерывается (он должен) .Loop продолжает уменьшать переменную цикла, становится нулевым и заканчивается концом.

+0

Можем ли мы иметь примеры того, что вы получаете и чего хотите? – Garf365

+0

И, personnaly, я буду инвертировать поток, убить downcounting thread немедленно из основного потока – Garf365

+0

@ Garf365 Я хочу разбить цикл в main(). И, пожалуйста, уточните обратную часть резьбы. – anjanik012

ответ

0

Найдено. getchar() ожидал возвращения каретки. Поэтому я использовал _getch() из библиотеки conio. Как это.

#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 

информирует компилятор не оптимизирован (кэшем) доступ к переменной, потому что другой поток может изменить его.

Кроме того, позаботьтесь о доступе на чтение и запись по глобальной переменной многими способами: в большинстве случаев вы должны защитить их с помощью мьютекса. (Я думаю, что в вашем случае это не необходимо в соответствии основного малого типа и доступ к основным услугам, но будьте осторожны)

EDIT

Как спросить в комментариях, это мой дизайн, когда инвертирующая нить:

#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

Смежные вопросы