C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: Buttonコントロールのイベントについて


(過去ログ 19 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■7842 / inTopicNo.1)  Buttonコントロールのイベントについて
  
□投稿者/ エビアン (13回)-(2007/09/17(Mon) 21:59:41)

分類:[.NET 全般] 

お世話になります。
VS 2005 .net C#で開発しています。

Buttonのイベントについてですが、
KeyDownである処理のループを開始して、
KeyUpでその処理を中断しています。

KeyDownでFlagをONします。
KeyUpでFlagをOFFします。
動作処理の最初にFlagの状態をみて、開始(継続)するか、中断するかを
判断しています。

問題はKeyUpの処理が遅れてしまうことです。
FlagがOFFになるのが遅れるので、動作処理が2〜3回くらい繰り返されてしまいます。

Keyが放されたらすぐにKeyUpイベントを呼びたいのですが、
何かいい方法があるのでしょうか?


分かりにくい文章で申し訳ありませんが、
よろしくお願いします。
引用返信 編集キー/
■7853 / inTopicNo.2)  Re[1]: Buttonコントロールのイベントについて
□投稿者/ ひろ (29回)-(2007/09/18(Tue) 10:38:45)
No7842 (エビアン さん) に返信

誤解していたら申し訳ありません。

ひょっとして、エビアンさんが行いたい処理は、

「処理ループを実行中はボタンが押されても無視したい」

でしょうか?

だとすれば、KeyUp イベントでは駄目なのでは?
押しっぱなしってことも考えられるので。

こんなのではどうでしょうか?

// メンバー変数
private bool m_Doing = false;

ボタンのキーダウンイベント()
{
// フラグが立っていたら処理しない。
if(! m_Doing)
{
// 処理中フラグを立てる。
m_Doing = true;

// ここでループの処理?を行う。

// 処理が終わったので、フラグを元に戻す。
m_Doing = false;
}

引用返信 編集キー/
■7894 / inTopicNo.3)  Re[2]: Buttonコントロールのイベントについて
□投稿者/ エビアン (15回)-(2007/09/18(Tue) 21:35:41)
ひろさん、ありがとうございます。

ちょっと脱線かもしれませんが、
仕事でC#のプログラムからモーターを回転させようと思います。

そこで、KeyDownでStartして、
1動作で4回転回るという動作をさせます。
この動作をwhile処理で繰り返し、連続動作をさせる、
KeyUpで動作中断(中断処理を行うまでは動き続ける)、ということをやろうとしています。


whileの条件文は
while(!cancelflag)
{
 動作処理
}
としています。
KeyDown時にcancelflag = falseでStartし、
KeyUp時にcancelflag = trueとしています。

KeyUpしても、while文が2〜3回繰り返されます。
もっと悪い時はKeyを放しても動き続けてしまいました。

KeyUpイベントをすぐに発生させたい、
確実に発生させたい時はどうしたらいいでしょうか?



引用返信 編集キー/
■7896 / inTopicNo.4)  Re[3]: Buttonコントロールのイベントについて
□投稿者/ 渋木宏明(ひどり) (366回)-(2007/09/18(Tue) 23:45:20)
渋木宏明(ひどり) さんの Web サイト
> KeyUpイベントをすぐに発生させたい、
> 確実に発生させたい時はどうしたらいいでしょうか?

どうしようもありません。
KeyXXX 系のイベントは、そういうリアルタイム入力用には適していないんです。

キー押下で、独自ループに入って他のすべての UI 操作を受け付けなくていいなら、そのループ先頭で毎回 GetAsyncKeyState() API を呼び出して、キーの押下状態をチェックすればよろしいんじゃないでしょうか。

引用返信 編集キー/
■7901 / inTopicNo.5)  Re[4]: Buttonコントロールのイベントについて
□投稿者/ ひろ (33回)-(2007/09/19(Wed) 11:23:41)
No7896 (渋木宏明(ひどり) さん) に返信

ふと思いついたのですが、「モータを回転させる」モジュールのレスポンスが悪くて処理が
溜まっているという可能性は無いのかな、と?
「モータ回転モジュール」がスレッド動作なんかしてたら出来たりして。

思いつきなので、「そんなこと無いよ」なら無視してください。

引用返信 編集キー/
■7914 / inTopicNo.6)  Re[5]: Buttonコントロールのイベントについて
□投稿者/ y4yama (24回)-(2007/09/19(Wed) 14:30:49)
No7901 (ひろ さん) に返信
> 思いつきなので、「そんなこと無いよ」なら無視してください。

便乗にて失礼します
1.「キーの押下状態」とはかけ離れますが、マウス左ボタンの離されているか?は、確かAPIなしで判定できたと記憶してます。で、キーでなく、マウスでみるのもひとつの手かと・・
2.モータを回すくらいなら、DIOのUSBモジュールを買って、外部のキー(スイッチ)をモニターするのも手かと・・
引用返信 編集キー/
■7992 / inTopicNo.7)  Re[6]: Buttonコントロールのイベントについて
□投稿者/ エビアン (17回)-(2007/09/20(Thu) 23:03:53)
みなさん、ありがとうございます。

渋木宏明(ひどり)のGetAsyncKeyState() で試してみました。
実験でサンプルコードに入れて、GetAsyncKeyState() の動作を確認したところOK
でした。

が!!
実際行いたい処理のところに入れたら、Applicationが
止まってしまいました。
コードは
while(!cancelflag)
{
if(!checkkeyboad()) break;
動作処理
}

private bool checkkeyboad()
{
return GetAsyncKeyState(Key.F1);
}

です。GetAsyncKeyState(Key.F1)の直前でブレイクをかけ、
ステップインを押したのにもかかわらず、
Applicationが画面の前面に来て、ブレイクポイントも飛んでしまいます。
以降、Applicationのボタンは押せ、表示等は変わるのですが、
モーターは動かなくなりました。
if(!checkkeyboad))をコメントアウトすると正常に動作します。

これの原因はなんでしょうか?
引用返信 編集キー/
■8007 / inTopicNo.8)  Re[7]: Buttonコントロールのイベントについて
□投稿者/ ひろ (36回)-(2007/09/21(Fri) 08:38:55)
No7992 (エビアン さん) に返信

エビアンさん、渋木さんの回答を良く読んでみてください。
渋木さんは、

「キー押下で、独自ループに入って他のすべての UI 操作を受け付けなくていいなら…」
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
と回答されていますよ。
他の全ての UI 操作を受け付けないのですから、当然ながら Visual Studio も受け付けませんよね。

確かに渋木さんは GetAsyncKeyState を紹介してくれましたが、やはりエビアンさんのほうで
この API が何をするものなのかを調査することは必要であると思います。

#あと、回答をくれた人に対して「さん」付けくらいはした方がいいと思われ

> 渋木宏明(ひどり)のGetAsyncKeyState() で試してみました。
^^^^^^^^^^^^^^^^

引用返信 編集キー/
■8074 / inTopicNo.9)  Re[8]: Buttonコントロールのイベントについて
□投稿者/ エビアン (18回)-(2007/09/21(Fri) 22:25:56)
渋木宏明(ひどり)さん。大変失礼いたしました。
ひろさん、ご指摘ありがとうございます。
以後、失礼のないように気をつけます。

他のすべてのUI操作というのはVisual Studioも受付けないんですね。
ならば、どのように使うのか・・・
たしかに、もう少し調べる必要がありそうです。

みなさん、ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -