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

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

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

Re[8]: C# DoEventsを使用しない,処理待ち方法について


(過去ログ 105 を表示中)

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

■62564 / inTopicNo.1)  C# DoEventsを使用しない,処理待ち方法について
  
□投稿者/ JoJo (1回)-(2011/10/18(Tue) 15:33:56)

分類:[C#] 

現状は以下に示す処理で、通信の受信待ちを行っているのですが、
DoEventsを多様すると、通信イベントが2重に発生する現象があったので
DoEventsを使用せず、通信の受信待ちを行う方法はないでしょうか?

int flg = 0;

private void ボタンコントロール押下イベント(object sender, EventArgs e)
{
    コマンド送信関数();

    while (flg == 0) //<-------ここで、通信の応答を待機したいが、他の処理を停止したくない。
    {
      System.Windows.Forms.Application.DoEvents();
    }

    通信受信文字列の解析関数();
}

private void 通信受信イベント(object sender, EventArgs e)
{
    flg = 1;
}


引用返信 編集キー/
■62565 / inTopicNo.2)  Re[1]: C# DoEventsを使用しない,処理待ち方法について
□投稿者/ マサヤ (353回)-(2011/10/18(Tue) 15:42:33)
2011/10/18(Tue) 15:43:14 編集(投稿者)

BeginInvokeとAsyncWaitHandle.WaitOne()でできないでしょうか?
引用返信 編集キー/
■62566 / inTopicNo.3)  Re[1]: C# DoEventsを使用しない,処理待ち方法について
□投稿者/ shu (1046回)-(2011/10/18(Tue) 15:49:16)
2011/10/18(Tue) 15:49:31 編集(投稿者)
No62564 (JoJo さん) に返信

int flg = 0;

private void ボタンコントロール押下イベント(object sender, EventArgs e)
{
    if (flg == 0) {
        flg = 1
        コマンド送信関数();
    }
}

private void 通信受信イベント(object sender, EventArgs e)
{
    通信受信文字列の解析関数();   
  flg = 0;
}

こんな感じには出来ないんですか?

引用返信 編集キー/
■62567 / inTopicNo.4)  Re[2]: C# DoEventsを使用しない,処理待ち方法について
□投稿者/ JoJo (2回)-(2011/10/18(Tue) 17:25:45)
マサヤ さん、shu さん
返信ありがとうございます。

BeginInvokeとAsyncWaitHandle.WaitOne()を使用して、
実現したいことができました。

ただし、MSDNを見てもいまいち理解できず、以下の2点が理解できませんでした。
 (1)WaitOne()を使用することで、Mainスレッドが停止しているにも関わらず、
  なぜ通信受信イベント(Mainスレッド)が起動できるのでしょうか?
 (2)WaitOne()中は画面がロックされてしまうのですが、回避方法はあるでしょうか?
引用返信 編集キー/
■62568 / inTopicNo.5)  Re[3]: C# DoEventsを使用しない,処理待ち方法について
□投稿者/ radlon (1回)-(2011/10/18(Tue) 19:02:18)
No62567 (JoJo さん) に返信
> マサヤ さん、shu さん
> 返信ありがとうございます。
>
> BeginInvokeとAsyncWaitHandle.WaitOne()を使用して、
> 実現したいことができました。
>
> ただし、MSDNを見てもいまいち理解できず、以下の2点が理解できませんでした。
>  (1)WaitOne()を使用することで、Mainスレッドが停止しているにも関わらず、
>   なぜ通信受信イベント(Mainスレッド)が起動できるのでしょうか?
単純に「通信受信イベント」がUIスレッド以外で呼ばれてるのでは?

>  (2)WaitOne()中は画面がロックされてしまうのですが、回避方法はあるでしょうか?
「コマンド送信関数」がどういう実装をしているのか判らないので違うかもですが、
shuさんが提示してる方法のように「通信受信イベント」で「通信受信文字列の解析関数」を
行えば良いんじゃないですかね?
それか、WaitOneをUIスレッド以外で実行するようにするとか。


引用返信 編集キー/
■62576 / inTopicNo.6)  Re[4]: C# DoEventsを使用しない,処理待ち方法について
□投稿者/ JoJo (3回)-(2011/10/19(Wed) 10:10:45)
radlon さん
返信ありがとうございます。

>> (2)WaitOne()中は画面がロックされてしまうのですが、回避方法はあるでしょうか?
> 「コマンド送信関数」がどういう実装をしているのか判らないので違うかもですが、
> shuさんが提示してる方法のように「通信受信イベント」で「通信受信文字列の解析関数」を
> 行えば良いんじゃないですかね?
確かに、この作りが一番一般的な作りだとは認識しているのですが、
事情により、同一関数(ボタンコントロール押下イベント)内で待ちを入れたいと考えております。

> それか、WaitOneをUIスレッド以外で実行するようにするとか。
UIスレッド以外でWaitOne()することで、画面ロックは改善されました。
ですが、これもまたこちらの事情によりMainスレッドで待ちを入れたいと考えております。

条件が多いとは思いますが、改善策がありましたらよろしくお願いします。
引用返信 編集キー/
■62579 / inTopicNo.7)  Re[5]: C# DoEventsを使用しない,処理待ち方法について
□投稿者/ shu (1047回)-(2011/10/19(Wed) 11:41:32)
No62576 (JoJo さん) に返信

> 条件が多いとは思いますが、改善策がありましたらよろしくお願いします。
yieldをうまく使えば可能性はありますが、クリックイベント内だけでかたをつけるには
やはり無理そうです。

条件と解決したいことが矛盾していると思うので条件を変更しないと無理かと思います。
※スレッドに待ちのループをさせて、スレッドを待ち状態にしたくないという矛盾
引用返信 編集キー/
■62580 / inTopicNo.8)  Re[6]: C# DoEventsを使用しない,処理待ち方法について
□投稿者/ JoJo (4回)-(2011/10/19(Wed) 12:02:36)
shu さん
返信ありがとうございます。

画面ロックの改善に関しましては、
やりたいことに矛盾が発生するため、
とりあえず見送りすることにしました。

最後に1点、わからないことがあるため質問です。

WaitOne()で待機中、通信受信イベントの発生が可能でしたが、
Thread.Join()を使用すると、通信受信イベントが発生しませんでした。
WaitOneとJoinの違いがわかりましたら、教えて頂けますでしょうか?
引用返信 編集キー/
■62582 / inTopicNo.9)  Re[7]: C# DoEventsを使用しない,処理待ち方法について
□投稿者/ shu (1048回)-(2011/10/19(Wed) 14:50:37)
No62580 (JoJo さん) に返信

> WaitOne()で待機中、通信受信イベントの発生が可能でしたが、
> Thread.Join()を使用すると、通信受信イベントが発生しませんでした。
> WaitOneとJoinの違いがわかりましたら、教えて頂けますでしょうか?
詳しくないですがThread.Joinはスレッドが終了するまで待つのに対し
WaitOneはなんらかの動きがあるまで待つということで受信イベントの発生で
Waitが終了したのではないでしょうか。
引用返信 編集キー/
■62583 / inTopicNo.10)  Re[8]: C# DoEventsを使用しない,処理待ち方法について
□投稿者/ JoJo (5回)-(2011/10/19(Wed) 16:48:09)
shu さん
返信ありがとうございます。

まだ不明点は残りますが、
もう少しWaitOneを自分なりに勉強してみたいと思います。

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -