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

わんくま同盟

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

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

ツリー一括表示

ループ処理方法 /Users (17/04/11(Tue) 13:31) #83813
Re[1]: ループ処理方法 /shu (17/04/11(Tue) 13:57) #83815
Re[1]: ループ処理方法 /魔界の仮面弁士 (17/04/11(Tue) 13:47) #83814
  └ Re[2]: ループ処理方法 /Users (17/04/11(Tue) 14:49) #83816
    ├ Re[3]: ループ処理方法 /PANG2 (17/04/11(Tue) 15:24) #83819
    ├ Re[3]: ループ処理方法 /774RR (17/04/11(Tue) 15:19) #83818
    └ Re[3]: ループ処理方法 /魔界の仮面弁士 (17/04/11(Tue) 15:18) #83817


親記事 / ▼[ 83815 ] ▼[ 83814 ]
■83813 / 親階層)  ループ処理方法
□投稿者/ Users (3回)-(2017/04/11(Tue) 13:31:35)

分類:[C#] 

Windows 7/ Visual Studio 2010 C#

下記のように常にループした処理の中でアプリケーションをクローズすると、正常にクローズすることが出来ません。
強制的に処理中止にしているせいか、再度ターゲットと繋ぐ際にポート使用中のメッセージが出て来ます。
尚、ループ処理をせずにアプリケーションをクローズして再度ターゲットと繋ぐときは問題ありませんでした。

こういった場合、どういった処置を入れることで対処できるのでしょうか?


while (true) 
{      

 処理

}           

[ □ Tree ] 返信 編集キー/

▲[ 83813 ] / 返信無し
■83815 / 1階層)  Re[1]: ループ処理方法
□投稿者/ shu (1004回)-(2017/04/11(Tue) 13:57:24)
No83813 (Users さん) に返信

catchは特になくてもよいですが下記のように
breakと
finally
を設け必ず終了処理が行われるようにするとよいかと思います。

try
{
    while (true)
    {
        処理
        break;
    }
}
catch (Exception ex)
{
    例外処理
}
finally
{
    終了処理
}

[ 親 83813 / □ Tree ] 返信 編集キー/

▲[ 83813 ] / ▼[ 83816 ]
■83814 / 1階層)  Re[1]: ループ処理方法
□投稿者/ 魔界の仮面弁士 (1255回)-(2017/04/11(Tue) 13:47:37)
この掲示板に新規投稿時する際に表示される注意事項に
 『半角カナは使用しないでください。文字化けの原因になります。』
という一文があったかと思います。次回以降ご留意ください。


No83813 (Users さん) に返信
> 強制的に処理中止にしているせいか

while (true) ではなく、while(継続条件) にすれば良いのでは。

継続するかどうかを判断する変数や式を用意しておき、
終了させたい場合は、それが false になるようにすれば良いかと。


実行中の強制終了が目的なら、while(true)の行にブレークポイントを貼り、
一時停止したときに、ループの外側(直後)の行を右クリックして
「次のステートメントを設定」すれば、ループを脱出できます。
(一時停止中に、左側にある 黄色⇒ をドラッグしてループの外に出す方法でも可)


> ホ゜ート使用中のメッセーシ゛が出て来ます。
一般論としては「終了前に、ポートを解放する」ような手続きが必要になるのでしょう。

具体的なメッセージ内容が分からないので、具体的な対処案は出せませんが、
ひとまず、メッセージ内容を一字一句正確に転記することはできますか?
[ 親 83813 / □ Tree ] 返信 編集キー/

▲[ 83814 ] / ▼[ 83819 ] ▼[ 83818 ] ▼[ 83817 ]
■83816 / 2階層)  Re[2]: ループ処理方法
□投稿者/ Users (4回)-(2017/04/11(Tue) 14:49:33)
大変失礼いたしました。以後、気を付けます。

継続条件としては、Windowsアプリケーションの×印をが押されるまでは処理をループして行い、
×印が押されたあとはループから外れて、クローズポート処理をすればうまくいくと思っています。
但し、この継続条件式をどのように記述すれば分かっておりません。

まずは、このあたりご教示頂けると幸いです。


No83814 (魔界の仮面弁士 さん) に返信
> この掲示板に新規投稿時する際に表示される注意事項に
>  『半角カナは使用しないでください。文字化けの原因になります。』
> という一文があったかと思います。次回以降ご留意ください。
>
>
> ■No83813 (Users さん) に返信
>>強制的に処理中止にしているせいか
>
> while (true) ではなく、while(継続条件) にすれば良いのでは。
>
> 継続するかどうかを判断する変数や式を用意しておき、
> 終了させたい場合は、それが false になるようにすれば良いかと。
>
>
> 実行中の強制終了が目的なら、while(true)の行にブレークポイントを貼り、
> 一時停止したときに、ループの外側(直後)の行を右クリックして
> 「次のステートメントを設定」すれば、ループを脱出できます。
> (一時停止中に、左側にある 黄色⇒ をドラッグしてループの外に出す方法でも可)
>
>
>>ホ゜ート使用中のメッセーシ゛が出て来ます。
> 一般論としては「終了前に、ポートを解放する」ような手続きが必要になるのでしょう。
>
> 具体的なメッセージ内容が分からないので、具体的な対処案は出せませんが、
> ひとまず、メッセージ内容を一字一句正確に転記することはできますか?
[ 親 83813 / □ Tree ] 返信 編集キー/

▲[ 83816 ] / 返信無し
■83819 / 3階層)  Re[3]: ループ処理方法
□投稿者/ PANG2 (171回)-(2017/04/11(Tue) 15:24:04)
No83816 (Users さん) に返信
> 継続条件としては、Windowsアプリケーションの×印をが押されるまでは処理をループして行い、
> ×印が押されたあとはループから外れて、クローズポート処理をすればうまくいくと思っています。

無限ループでポートからのデータ受信を待つ、ということでしょうか?

Windowsアプリケーションで無限ループすること自体が筋が悪いし、
そもそも、無限ループ中に×ボタンを受け付けないはずですが。。。
Application.DoEvents を使っていますか?

COMポートやTCPポートであればサンプルは豊富に転がっています。
[ 親 83813 / □ Tree ] 返信 編集キー/

▲[ 83816 ] / 返信無し
■83818 / 3階層)  Re[3]: ループ処理方法
□投稿者/ 774RR (505回)-(2017/04/11(Tue) 15:19:21)
その無限ループの処理を UI スレッドに書いていてデッドロックしているに1票

プログラムの起動から終了までずっと行う処理であればワーカースレッドにて行うべし。
プログラムを閉じようとしたとき (FormClosing 等) で当該ワーカースレッドに終了してもらうと良い。

[ 親 83813 / □ Tree ] 返信 編集キー/

▲[ 83816 ] / 返信無し
■83817 / 3階層)  Re[3]: ループ処理方法
□投稿者/ 魔界の仮面弁士 (1256回)-(2017/04/11(Tue) 15:18:24)
No83816 (Users さん) に返信
> 継続条件としては、Windowsアプリケーションの×印をが押されるまでは処理をループして行い、

ポートを閉じる処理は、どの程度の時間を要するのでしょうか?

×印が押されてから、実際に閉じるまでに時間を要する場合や、
ポートのクローズが非同期的に行われる場合は、ループ脱出だけでなく、
ポートをクローズし終わってから閉じるような仕組みも必要かもしれません。


話を単純にするため、ひとまずポートのクローズが同期的に行われると仮定すれば、一例として
Form クラスの FormClosing イベントで「継続条件」を false にする方法があります。
この場合、ポートを閉じる処理は、先のループの直後に置いておけば良いでしょう。


それと、先のループ処理が UI スレッド上で行われているのか
それともワーカースレッド上で行われているかも問題になります。

「UI スレッドで無限ループを行っている」のだとしたら、
そもそも作り方に問題があるので、処理を見直すべきです。
(マウス操作や画面描画が阻害されるなどの問題が生じます)

UI スレッドにおいては、それぞれのメソッドやイベント処理は、
短時間で return されるべきであり、長時間のループ待機を避けるようにします。



一方、「ワーカースレッドで無限ループを行っている」場合は、
UI スレッド側とワーカースレッドでの変数の共有が問題になります。

たとえばこれが BackgroundWorker なのであれば、UI スレッドからは
「CancelAsync メソッド」で中止要求を発行することができます。
この場合、ワーカースレッド(DoWork イベント)内では、
CancellationPending プロパティを通じて、継続か中止かを判定できるため
これをループ条件として利用することができます。
[ 親 83813 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -