2012-04-07 3 views
2

Я сделал небольшую программу opengl, используя язык программирования d. что я пытаюсь сделать, это разрешить программе читать ввод с консоли. Я попытался использовать readf(), getc() и некоторые другие функции. но моя проблема в том, что я не хочу, чтобы программа останавливалась при поиске ввода.чтение с консоли без приостановки программы

Я попытался найти решение для решения, но не смог найти. поэтому, если кто-нибудь знает, как проверить, действительно ли что-то было написано на консоли, и если это так читать. или если существует какая-либо функция, которая читает с консоли, но будет проигнорирована, если ничего не будет записано.

Мне в основном хотелось бы знать, как это сделать в d, но решение для C++ тоже может быть полезно.

ответ

3

Вам нужно использовать отдельный поток. Что-то, как это один из способов сделать это в D:

import std.stdio, std.concurrency; 

void main() 
{ 
    // Spawn a reader thread to do non-blocking reading. 
    auto reader = spawn(() 
    { 
     // Read console input (blocking). 
     auto str = readln(); 

     // Receive the main thread's TID and reply with the string we read. 
     receive((Tid main) { send(main, str); }); 
    }); 

    // ... This is where you can do work while the other thread waits for console input ... 

    // Let the reader thread know the main thread's TID so it can respond. 
    send(reader, thisTid); 

    // Receive back the input string. 
    receive((string str) { writeln("Got string: ", str); }); 
} 

Это порождает отдельный поток, который делает консольный ввод ожидания в то время как ваш основной поток может выполнять другую работу.

+0

Благодарим вас за быстрый ответ. Я тестирую его сейчас. когда я пытаюсь скомпилировать его, он жалуется на несколько ошибок в файле concurrency.d, но я предполагаю, что это проблема с моей настройкой. – user1319341

+0

Он работает для меня с DMD 2.058 на Linux Mint 12 (x86-64). –

+0

с использованием gdc как компилятора, и он жалуется на то, как объявляется enum в concurrency.d «enum hasLocalAliasing = false;» (используя gdc, потому что я не могу заставить dmd работать с блоками кода) – user1319341

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