2014-01-11 5 views
0

Допустим, я хочу взять данные от пользователя и выполнить поиск в текстовом файле для этого ввода. Поиск будет выполняться для каждого входа пользователя персонажа. Будет цикл, выполняющий поиск, и будет еще один цикл для проверки ввода нового символа пользователем. Второй цикл перезапускает первый цикл, если новый символ задан пользователем.Threading in C++

Пожалуйста, просто объясните, как выполнить выше с помощью C++. Я думаю, что потоки должны быть созданы.

Ниже переменные будут использоваться для поддержания общих ценностей:

static var` 
bool change; 


while(!change) 
{ 
change=false 
<<do something, like search in file>> 
} 

Другой цикл будет, как показано ниже:

while(1) 
{ 
if(user enters another char) 
{ 
    var=new value input by the user; 
    change=true; 
} 
else change=false; 
} 

Спасибо!

+2

Использование 'станд :: thread' и' станд :: atomic' – Brandon

+1

Возможно прочитать некоторые [PTHREAD учебник] (https://computing.llnl.gov/tutorials/pthreads/), чтобы понять основные понятия. Кроме того, ваш вопрос, вероятно, зависит от операционной системы (в стандартном C++ нет возможности читать только одно нажатие клавиши!). Возможно, вы хотите использовать [Qt] (http://qt-project.org/) –

+0

http://thecodelesscode.com/case/126 => почему вы так уверены, что потоки необходимы для решения вашей проблемы? –

ответ

0

Создайте два потока: один для чтения пользовательского ввода и другой для выполнения поиска.

Используйте двоичный семафор для синхронизации между двумя потоками в Consumer-Producer способе, то есть, один поток получает семафор и другие выпуски нити это:

static BinarySemaphore binSem; 
static int inputCharacter = 0; 

static void ReadUserInput(); 
static void PerformSearch(); 

void Run() 
{ 
    BinarySemaphore_Init(&binSem,0); 
    CreateThread(ReadUserInput,LOWER_PRIORITY); 
    CreateThread(PerformSearch,HIGHER_PRIORITY); 
} 

static void ReadUserInput() 
{ 
    while (inputCharacter != '\n') 
    { 
     inputCharacter = getc(stdin); 
     BinarySemaphore_Set(&binSem); 
    } 
} 

static void PerformSearch() 
{ 
    while (inputCharacter != '\n') 
    { 
     BinarySemaphore_Get(&binSem,WAIT_FOREVER); 
     // <<do something, like search in file>> 
    } 
} 

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

0

Что-то вроде этого? Теперь я написал это на идеоне, и их потоки не работали для меня, поэтому я не смог проверить это, но да .. Что-то близко к этому должно работать. Наверное, плохой пример. Было бы лучше использовать пул потоков.

#include <iostream> 
#include <thread> 
#include <atomic> 
#include <queue> 
#include <mutex> 
#include <chrono> 

std::mutex lock; 
std::atomic<bool> stop(false); 
std::queue<std::function<void()>> jobs; 

void One() 
{ 
    while(!stop) 
    { 
     if (!jobs.empty()) 
     { 
      if (lock.try_lock()) 
      { 
       std::function<void()> job = jobs.front(); 
       jobs.pop(); 
       lock.unlock(); 

       job(); 
      } 
     } 
     std::this_thread::sleep_for(std::chrono::milliseconds(100)); 
    } 
} 

void Two() 
{ 
    std::string var; 

    while(true) 
    { 
     if (std::cin>> var) 
     { 
      std::lock_guard<std::mutex> glock(lock); 
      jobs.push([] {std::cout<<"Task added to the queue..\n";}); 
     } 
     else 
       break; 

     std::this_thread::sleep_for(std::chrono::milliseconds(100)); 
    } 
} 

int main() 
{ 
    std::thread T(One); 
    Two(); 

    stop = true; 
    T.join(); 
    return 0; 
}