• ベストアンサー

[Windowsプログラミング] スレッドでリアルタイムにキーボード入力を処理したいのですが

いつもお世話になっております。 最近Windowsプログラミングを始めたばかりです。 今スレッドの勉強をしているのですが、キーボードの入力をスレッドが処理したいと考えております。 受け渡しでは生成時点での入力しか処理できず、うまくいきません。 プロシージャとスレッドでリアルタイムにデータをやり取りする方法はないでしょうか? ご指導よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

プロシージャとスレッドで参照するキーボード情報の変数を 共有すればいいのではないでしょうか? (勿論同期をとる必要がありますが)

smily_k_c
質問者

補足

そうしてみたところプログラムの原因かわかりませんが、動作に遅れがでてしまっていました。

その他の回答 (1)

回答No.2

 こんにちは。  GetKeyBoardState()でキーボード状態位は取れます。此れをスレッド内で使用するとか。

参考URL:
http://msdn.microsoft.com/ja-jp/library/cc364674.aspx
smily_k_c
質問者

補足

この関数は押されているキーはわからないみたいです・・・ 難しいかもしれませんが、押されたキー情報と離されたキー情報の両方を処理したいのです。 注文が多くてすみません。

関連するQ&A

  • windowsのリアルタイム処理について

    下記の不具合があり困っております。 画像入力ボードを開発し、数msごとに数kbの画像をwindowsのドライバへ取得割り込みをかけております。ドライバはそのデータを取り込みリングバッファに貯めていきます。アプリケーションはそのリングバッファのデータをリングバッファがあふれないように定期的に取り込み、画像認識しながら画面に表示します。このときパソコンに他のアプリが走ったときに画像が乱れます。このときCPU負荷率は80%程度になっておりリングバッファから抜いたデータが異常になっております。ドライバがPCIの割り込みに応答して画像データを取得しリングバッファを更新するのがまずいように思います。 アプリケーションがドライバから受け取ったデータを検証すると異常なデータが入っていることからドライバの動作がおかしいことまではわかりました。 そもそもリアルタイム処理に無理があるのでしょうか? 何か良い対策はないでしょうか?もちろんCPU負荷率が小さいときは正常に稼働しています。

  • STDINによるキーボードからの入力について

    初めて質問させて頂きます。 最近Perlの勉強をはじめ、perlによるネットワークプログラミングに興味が出てきたので、 自分でインスタントメッセンジャーの様な物を作ってみようと思いました。 1つのwhileループ内で、 "受信データがある場合はその内容を表示" "クライアントへの入力があった場合はその内容を送信" という動作をさせたいのですが、 <STDIN>で入力待機状態となるとループが止まるので、受信→内容表示の処理が滞ってしまいます。 while(1){ if(受信内容がある){ print "受信内容"; } if($senddata=<STDIN>){ #ここで止まってしまう為、受信表示ができない print $ソケット "$senddata"; } } 入力待ちをすれば、止まってしまうのは当たり前と言うことはわかっているのですが・・・。 過去の質問に、スレッドを利用して "受信があればそれを表示"と"入力があればそれを送信" の動作を分けている方がいらっしゃいましたが、 スレッドで分けずにこの動作を実現する事はできるのでしょうか? また、可能ならばどの様にしたら良いのでしょうか?

    • ベストアンサー
    • Perl
  • キーボード入力の終了につきまして(ループ処理内)

    いつも参考にさせて頂いております佐藤と申します。 JAVA言語を勉強し初めて数ヶ月程度ですが、楽しさが分かって参りました。 質問させて頂きたい内容は、ループ処理(キーボードや入力ファイルがNULLになるまで繰り返す)でのキーボード入力をどうすれば終了させられるかです。 //読込チェック=NULLならば処理を終了させる while((check = buf.readLine())!=null){ char[] src = check.toCharArray(); ソースの一部ですが、これでは入力ファイルがNULLになれば終了出来ますが、キーボードからの入力だとNULL(何も入力せずにエンター)でも終了しません。 原因が分かる方はいらっしゃいますでしょうか? 宜しくお願い致します。

  • 配列へのキーボード入力

    次のような問題がわからなくて困っています。 まず、キーボード入力により配列の大きさを決め、 その後、先ほど入力した個数のデータをキ-ボードから入力するというものです。 これだけならわかるのですが、条件があって、入力は次のようにするとあります。 2 3 ←配列の大きさ(2行3列) 1 2 3 ←配列に入れるデータ 1行目 4 5 6 ←配列に入れるデータ 2行目 Cプログラミングを始めて間もない初心者です。どなたかよろしくお願いします。

  • Facebook、スレッドの文字入力について

     これから、時々お世話になります。どうぞよろしくお願いいたします。  Facebookのスレッドでのメールのやりとりのことですが、1週間前から突然、文字入力の時にバックスペースで文字が消せなくなったり、文字同士がひっくり返ったり、カーソルが とんでもないところに移動してしまい、とても困っています。 原因と対策を教えてください。 ご回答お待ちしております。  柴田

  • 音声データのリアルタイム処理

    「マイクなどからPCに音声データを入力し そのデータにハイパスフィルタをかけ、リアルタイムでスピーカに出力する」 という課題をC言語かC++を使ってやらなくてはならないのですが、 音声データのCやC++での扱い方といいますか、音声データをどうCやC++に組み込むのかがわかりません。 音声データに何らかの処理をして出力する、というプログラムをCやC++で書くということはできるのでしょうか?何か特別なソフトが必要になってくるのでしょうか?

  • プロセスとスレッドの違いについて(Cプログラミングの観点から)

    プロセスとスレッドの違いがしっくりきません。 <プロセス> (1)プログラムの実行単位。Windows や Linux などの汎用 OS 上のアプリケーションは一般にプロセスとして動作している。プロセスは1つ以上のスレッドと、ファイル、ヒープメモリなどのリソースで構成される (2)起動や切り替えのオーバーヘッドが大きい <スレッド> (1)同一プロセス内の複数スレッドを同一メモリ空間上で実行でき、メモリ消費量などが軽減できる。 (2)マルチスレッド処理のプログラミングにおいては、同じデータを複数のスレッドが同時に書き換えることによる不整合に注意し、排他制御を行う必要がある。 等はwiki等調べて理解しています。 何が疑問なのかと申し上げますと、具体的にプログラミングする際に (1)マルチプロセスとマルチスレッド方式では、ソースにどのような違いが出てくるか (2)マルチプロセスとマルチスレッド方式では実行時間がどれだけ変化するか がわからないのです。お仕事で並列処理等について担当されている方などおられましたら、お手数ですがご教授ください。 なお、わかりやすい書籍、webサイト等ありましたらそれも併せて教えていただけると助かります。よろしくお願いします。ちなみに、環境はWindowsXP,VisualC++ExpressEdition2005を使っていますので、UNIXよりはWindowsかつCで動くプログラム例で教えていただけると大変助かります。しかし、当方Javaも多少であれば組めますのでJavaでも構いません。 何卒、よろしくお願い致します。

  • WINAPI ウィンドウの移動中も処理を続けるには

    お世話になります。 現在、Windowsでゲームを制作しています。 WinMain()内でウィンドウを作り、 その後ループをさせてゲームを処理させているのですが、 ウィンドウをドラッグして移動している最中、このループ内に処理が入ってきません。 ウィンドウを移動している最中も、ゲームの処理の更新や音声のストリーミングなどを続けたいのですが、 ウィンドウ生成時、ウィンドウプロシージャの処理でこれが実現できるでしょうか? できないとすれば、ウィンドウ移動中にプログラムを走らせ続けるにはどうしたらよいでしょうか? ご存知の方がいらっしゃいましたら、是非ご教授宜しくお願いします。

  • Windowsプログラミングでの質問です

    よろしくお願いします。 windowsのプログラミングを、『猫でもわかるwindowsプログラミング弟2版』と言う本を参考にしながら、C言語で作っています。 2ヶ月ほどがんばってみたのですがどうしてもうまく行きません。 手順です、 1、空のウィンドウを作りメニューバーを作成。 2、メニューに『ファイルと、オプションタブを作る』 3、オプションタブに、ダイアログボックスを『開くと、閉じる』タブ   を作る。 4、『開く』タブをクリックすると、名前を入力するためのダイアログ  ボックスを開く。 と言うプログラムなのですが、作成されたウィンドウから⇒オプションタブ⇒開くをクリックしても、ダイアログボックスが表示されません。 リソースファイルや、ヘッダファイルを開いて、参考にしている本と比べてみたのですが、ほとんど変わっていません。自分では原因が発見できないのですが、詳しい方、ご指摘をお願いします。 5、気になる所では、ソース中で、ウィンドウプロシージャの記述で、  else文に{}が無いので、そこをいじってみたのですが、うまく行きま せんでした。   case WM_PAINT: //描画処理 if(strcmp(szName, "")==0) strcpy(szBuf, "まだ名前の入力はありません"); else wsprintf(szBuf, "入力された名前は%sさんです", szName); hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 10, 10, szBuf, (int)strlen(szBuf)); EndPaint(hWnd, &ps); break; ご指導よろしくお願いします。  

  • ファイルデータをキーボード入力に見せかける方法

    大量のデータを素早くキーボード(USB接続)から入力したときにアプリケーションが正しく動作するかどうかをテストしたい。 しかし、キーボードからの手入力では入力速度に限界があるので、あらかじめテキストファイルに大量の文字を入力しておき、そのテキストファイルを読込んであたかもキーボードから入力されたかのように振る舞わせ、アプリケーションの動作をチェックできないでしょうか。 アプリケーションにはユーザが操作する画面があり、画面上にテキストボックスがあります。 そのテキストボックスにテキストファイルから読み込んだ大量文字をあたかもキーボードから入力されたかのように自動的に入力(取込)をしたいのです。 テキストファイルを開いてコピペでよいのでは?と思うかも知れませんが、入力された文字の中にある特定の文字があればその文字が入力された時点である処理を行いたいので、大量文字の全文コピペではそのテストにならないのです。 できるのであればその方法を教えてください。

専門家に質問してみよう