<thread>と_kbhitについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: <thread>と_kbhitについて

Re: <thread>と_kbhitについて

#3

by かずま » 6年前

塵界 さんが書きました:
6年前
ControlThread() の部分が怪しいと思いブレークポイントを仕込んだりした結果whileがすっ飛ばされていることがわかった。
なぜ、while がすっ飛ばされているのか調べてみました。

コード:

#include <stdio.h>
#include <conio.h>

int main()
{
	while (1) {
		int c = _getch();
		printf("c = %02x\n", c);
		if (c == 0x1b) break;
	}
}
このプログラムを実行し、0 1 a F1 F12 Esc を入力した
ときの実行結果は次のようになりました。

コード:

c = 30
c = 00
c = 31
c = 00
c = 61
c = 00
c = 00
c = 3b
c = e0
c = 86
c = 1b
_getch() で、キー入力を読み取ると、
入力バッファには常に 2バイトのデータが入るようです。
通常の文字の場合は、2バイト目が 00、
ファンクションキーや矢印キーなどは、
1バイト目が 00 または e0 です。

main で '1' を入力して、それを _getch() で読み込んでも
まだ入力バッファには 00 が残っているので、ControlThread
に入って while (!_kbhit()) を実行した時、 _kbhit() が 1 を
返し、それを !演算子で反転して 0 になるので、while の中
の文に行かず、ループを抜けて次の文に行っているようです。

Re: <thread>と_kbhitについて

#2

by a5ua » 6年前

コード:

 	while (!_kbhit()) {
この条件だと、何かキーが押されるとループを抜けてしまいます。

_getch()は文字が入力されるまで待機するため、
今回のケースでは_kbhit()を使わずとも、単なる無限ループで十分です。

キーが押されていないときになにか別の処理を行いたい場合は、
ループの中に、if (_kbhit())という条件を入れてもいいでしょう。

コード:

void ControlThread() {
	char c;
	while (true) {
		c = _getch();
		if ((c == 0x1B) || (c == '0')) {
			gThreadDone = true;
			break;
		}
	}
	
	return;
}

<thread>と_kbhitについて

#1

by 塵界 » 6年前

[1.1] 自分が今行いたい事は何か
マルチスレッドのプログラムで1つのスレッドでキー入力を受け付け、特定のキーが押されたら動作終了し、もう一つのスレッドを終了させたい

[1.2] どのように取り組んだか(プログラムコードがある場合記載)

コード:

#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <thread>
#include <string.h>

using namespace std;
int loop();

void MainThread();
void KEYControlThread();
bool gThreadDone = false;

int main(void) {
	
	int proc_error = 0;

	char c;
	
	while (!_kbhit()) {
		system("cls");
		cout << "menu : " << endl;
		cout << " 0 - exit" << endl;
		cout << " 1 - start" << endl;

		c = _getch();
		if ((c == 0x1B) || (c == '0')) { break; }
		if ((c == '1')) {  proc_error = loop(); }
	}

}

int loop() {
	
	system("cls");

	//スレッド処理の開始
	
	thread th1(MainThread);
	thread th2(ControlThread);
	
	th1.join();
	th2.join();

	return 0;
}

void MainThread() {
	while (gThreadDone == false) {
			cout << "test " << endl;
			}
	return;
}

void ControlThread() {
	char c;
	while (!_kbhit()) {
		c = _getch();
		if ((c == 0x1B) || (c == '0')) {
			gThreadDone = true;
			break;
		}
	}
	
	return;
}


ControlThread() の部分が怪しいと思いブレークポイントを仕込んだりした結果whileがすっ飛ばされていることが
わかった。

[1.3] どのようなエラーやトラブルで困っているか
ControlThreadのwhileが機能せず、gThreadDone == falseのままで動作が続行してしまう。

[1.4] 今何がわからないのか、知りたいのか
_kbhitの使用方法が間違っているのか、それともマルチスレッドの作り方を失敗してるのか。

[2] 環境  
win10,visualstudiocommunity2017
 

ページトップ