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

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

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

Re[10]: Thread.sleep以降が実行されない


(過去ログ 79 を表示中)

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

■46900 / inTopicNo.1)  Thread.sleep以降が実行されない
  
□投稿者/ STO (1回)-(2010/02/13(Sat) 18:58:57)

分類:[.NET 全般] 

タイトルの通り、Thread.Sleepを使用するとその後の処理が実行されません。

ただ不思議な事に、これが起こるのは外部プログラムから起動した場合で、コマンドプロンプトから起動した場合は正常に終了します。

try catchを書いてもエラーがキャッチできずに終わります。

試しにメッセージボックスを前後に置いたところ、直前のものは表示されましたが、直後のものは表示されませんでした。

Thread.sleepには、何かデメリットがあったりするのでしょうか?
引用返信 編集キー/
■46903 / inTopicNo.2)  Re[1]: Thread.sleep以降が実行されない
□投稿者/ Azulean (527回)-(2010/02/13(Sat) 19:36:54)
No46900 (STO さん) に返信
> タイトルの通り、Thread.Sleepを使用するとその後の処理が実行されません。
Thread.Sleep で待たされている時間はどの程度のものでしょうか?

> ただ不思議な事に、これが起こるのは外部プログラムから起動した場合で、コマンドプロンプトから起動した場合は正常に終了します。
(中略)
> 試しにメッセージボックスを前後に置いたところ、直前のものは表示されましたが、直後のものは表示されませんでした。

試しに、前側のメッセージボックスを Sleep 時間と同程度に放置した場合はどうなるのでしょうか?

Sleep の責任なのか、外部プログラムが一定時間以内に終了しないプロセスを殺しているのかどちらなのかを切り分ける一手として提案しました。
Sleep 時間が十分に短い場合は、この切り分けに意味はありませんが…。
引用返信 編集キー/
■46910 / inTopicNo.3)  Re[2]: Thread.sleep以降が実行されない
□投稿者/ STO (2回)-(2010/02/14(Sun) 01:07:56)
返信ありがとうございます。

待ち時間は最低1分、最高で10分になります。
結構長いと思うので、もしかしたらAzuleanさんの説が正しいかもしれません。
今は手元で試せないのですが、月曜日に試して報告したいと思います。

では一度失礼します。
引用返信 編集キー/
■46920 / inTopicNo.4)  Re[3]: Thread.sleep以降が実行されない
□投稿者/ Jitta (635回)-(2010/02/14(Sun) 15:00:09)
Jitta さんの Web サイト
No46910 (STO さん) に返信
> 返信ありがとうございます。
>
> 待ち時間は最低1分、最高で10分になります。
> 結構長いと思うので、もしかしたらAzuleanさんの説が正しいかもしれません。
> 今は手元で試せないのですが、月曜日に試して報告したいと思います。
>
> では一度失礼します。

Sleep を、“待つ”ことに使わないでください。これは、「実行するスレッドを他のものにする」命令です。
「待つ」ことがメインではなく、「他のものに処理をさせる」ことがメインです。
そのため、Sleep に入ると、外部からの呼びかけに答えなくなります。つまり、タスクマネージャーで「応答なし」と報告されます。
引用返信 編集キー/
■46927 / inTopicNo.5)  Re[4]: Thread.sleep以降が実行されない
□投稿者/ STO (3回)-(2010/02/14(Sun) 19:29:11)
>Jittaさん

返信ありがとうございます。
という事は、Thread.sleepを使わずに待たせる方法を考えることも必要かもしれないというわけですね。

Thread.sleep以外ではTimerクラスを見つけましたが、これは一定周期の処理に使うようなので待つのには使えない感じです。
単純にウェイトするようなクラスはあるのでしょうか?
引用返信 編集キー/
■46940 / inTopicNo.6)  Re[4]: Thread.sleep以降が実行されない
□投稿者/ Azulean (529回)-(2010/02/15(Mon) 00:36:28)
No46920 (Jitta さん) に返信
> そのため、Sleep に入ると、外部からの呼びかけに答えなくなります。つまり、タスクマネージャーで「応答なし」と報告されます。

コンソールアプリケーションも応答なしになりましたっけ?

この指摘は恐らく、メッセージループを回すような状況にしろということを示唆していると思われますが、
現状、作成されているアプリケーションがコンソールアプリケーションの可能性もあると思っています。
(言明はされていません)
引用返信 編集キー/
■46944 / inTopicNo.7)  Re[5]: Thread.sleep以降が実行されない
□投稿者/ chobi (1回)-(2010/02/15(Mon) 08:14:09)
> Thread.sleep以外ではTimerクラスを見つけましたが、これは一定周期の処理に使うようなので待つのには使えない感じです。
> 単純にウェイトするようなクラスはあるのでしょうか?

            DateTime startTime = new DateTime();
            startTime = DateTime.Now;
            while (DateTime.Now < startTime.AddSeconds(10)) ;

上記の例は無駄に忙しいですが単純に10秒待ちます。

引用返信 編集キー/
■46947 / inTopicNo.8)  Re[6]: Thread.sleep以降が実行されない
□投稿者/ れい (873回)-(2010/02/15(Mon) 08:40:36)
No46944 (chobi さん) に返信
> > Thread.sleep以外ではTimerクラスを見つけましたが、これは一定周期の処理に使うようなので待つのには使えない感じです。
>>単純にウェイトするようなクラスはあるのでしょうか?
>
> DateTime startTime = new DateTime();
> startTime = DateTime.Now;
> while (DateTime.Now < startTime.AddSeconds(10)) ;
>
> 上記の例は無駄に忙しいですが単純に10秒待ちます。
>

「無駄に忙しい」というフレーズの、この用例ははじめて聞きました。

胸を打たれというのでしょうか。
なんかこう、心に響いて涙ぐんでしまいます。


どうせなら。

DateTime endTime = DateTime.Now.AddSeconds(10);
while (DateTime.Now < endTime);

これの方が少しだけ無駄が多くていい感じです。

引用返信 編集キー/
■46953 / inTopicNo.9)  Re[5]: Thread.sleep以降が実行されない
□投稿者/ 774RR (462回)-(2010/02/15(Mon) 09:41:39)
ネタはネタとして楽しむ範囲にとどめておいて、そういう使い方は非推奨であると明記しておいて欲しいな。
# なんか、こう書けといっているようにしか見えないので
引用返信 編集キー/
■46955 / inTopicNo.10)  Re[6]: Thread.sleep以降が実行されない
□投稿者/ みきぬ (780回)-(2010/02/15(Mon) 09:56:33)
例えば、こんな確認事項
・Visual Studio あるいは .NET Framework のバージョン
 −Visual Studio 2005 とか
・作成しているプログラムの種類
 −Windows アプリとか、WPF とか、コンソールアプリとか
・状況と目的
 −非同期でファイルの転送を実行していて、その終了を待ちたいとか


とりあえず言えることは、UI スレッド上で Thread.Sleep を使うのはマズー。
引用返信 編集キー/
■46957 / inTopicNo.11)  Re[7]: Thread.sleep以降が実行されない
□投稿者/ 囚人 (477回)-(2010/02/15(Mon) 10:23:54)
#全然関係ない話ですけど。

>DateTime endTime = DateTime.Now.AddSeconds(10);
>while (DateTime.Now < endTime);

何か最適化がなされたらすっ飛ばされそうなコードですね。
どっかに書いてあったけど、DateTime.Nowってつくづくメソッドであるべきだと思う。

引用返信 編集キー/
■46992 / inTopicNo.12)  Re[8]: Thread.sleep以降が実行されない
□投稿者/ STO (4回)-(2010/02/15(Mon) 20:25:01)
いつの間にかこんなにレスが・・・。
遅くなって申し訳ありません。

結論から言うと、Azuleanさんの言うとおりプロセスが殺されてしまっているようでした。
今作っているものの流れですが、外部プログラムが自分のプログラムを呼び出したあと監視し、指定した時間応答がなければエラーメッセージを表示するというものです。
そして自分のプログラムが監視時間以上にウェイトし、擬似的にサーバーからの応答が無い状況を作っています。

今回の原因は、どうやら外部プログラムで設定している監視時間が過ぎた時点でプロセスが殺されてしまっている事のようです。
メッセージボックスが大体その時間で消えてしまいました。
アプリケーションはコンソールアプリケーションです。


詳しい情報を書かず混乱させてしまい申し訳ありません。
ただ、Thread.sleepの本来の用途やそれ以外のウェイト方法についても知ることができて感謝しています。

多くの助言ありがとうございました。
解決済み
引用返信 編集キー/
■46994 / inTopicNo.13)  Re[9]: Thread.sleep以降が実行されない
□投稿者/ なちゃ (393回)-(2010/02/15(Mon) 20:57:31)
No46992 (STO さん) に返信
> ただ、Thread.sleepの本来の用途やそれ以外のウェイト方法についても知ることができて感謝しています。

誤解があるといけないので念のため書いておきますが、
出てきた実例はネタなのでやっちゃだめですよ。
本当に指定した時間待ちたいのならSleepで正解です。

もちろん正確に指定時間で戻ってくるわけではないですが、
秒単位以上くらいの時間待ちたいというレベルなら問題ありません。

引用返信 編集キー/
■47011 / inTopicNo.14)  Re[10]: Thread.sleep以降が実行されない
□投稿者/ 774RR (464回)-(2010/02/16(Tue) 08:56:54)
いわゆる GUI を持つソフトであれば (コンソールアプリケーションでない場合)
UI スレッド中でただ待つというロジック自体が禁じ手であることも追記、かな。
解決つけとくね
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -