標準出力に出力するコンソール アプリケーションがあります。次の動作を実装したい:
- 出力は順番に印刷されます (各ターンの後に 2 秒の休憩)
- ユーザーは(彼にとってはオプションです)キーを押して他のデータの印刷を開始できます
- ユーザーが何もクリックしない場合、出力は印刷されるだけで、何も変わりません
- ユーザーが定義済みのキーをクリックすると (出力が印刷されている間でもクリックできる場合があります)、何らかの関数を呼び出す必要があります。
最初は別のスレッド(印刷用スレッド、入力待ち用スレッド)でやろうかと思ったのですが、この場合はスレッド内で入力待ちが出来ないので無理かなと思います。
それで、それができるかもしれない2つのライブラリを見つけました:
- シンプルで高速なマルチメディア ライブラリ (SFML): http://www.sfml-dev.org/index.php
- ncurses: http://www.gnu.org/software/ncurses/ncurses.html
どちらも知らないので、目標を達成するためにどちらを学べばよいかわかりません。それとも、別のより簡単な解決策がありますか?
OS: Unix
編集: g-makulik は、スレッドを使用して書き込むことができなかった理由を示すように依頼しました。
#include <pthread.h>
#include <iostream>
#include <string>
#include <stdio.h>
void* print_message_function(void *doPrint) {
bool* vDoPrint = (bool*) doPrint;
while (*vDoPrint) {
sleep(0.5);
std::cout << "Thread 1" << std::endl;
}
return NULL;
}
void* keyPressed(void* doPrint) {
bool* vDoPrint = (bool*) doPrint;
while (*vDoPrint) {
*vDoPrint = (char) getchar() == 'k' ? false : true;
std::cout << "THIS ISN'T DISPLAYED UNLESS 'k' PRESSED.";
}
return NULL;
}
int main(int argc, char* argv[]) {
pthread_t thread1, thread2;
int iret1, iret2;
bool doPrint = true;
iret2 = pthread_create(&thread2, NULL, print_message_function,
(void*) &doPrint);
iret1 = pthread_create(&thread1, NULL, keyPressed,
(void*) &doPrint);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
std::cout << "Thread 1 returns: " << iret1 << std::endl;
std::cout << "Thread 2 returns: " << iret2 << std::endl;
return 0;
}