• ベストアンサー

スリープ中に割り込んで中止させたい

VB2010で次の様なSleepを使ったプログラムなんですが途中で中断させることはできるでしょうか。 For I=1 to 100 System.Threading.Thread.Sleep(1000) Next

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

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

>Sleep(1000)の間は止められなくても,For~Next間でどうして止められないのかと思いました。 Loop処理中は、それだけに専念するので他の処理を受付けないからです。 フラグとDoEvents()を使って中止させる例です。 private ExitFlag As Boolean = False 'ボタンのClockイベント Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) ExitFlag = True End Sub ' Forの処理の部分 ' For I=1 to 100 System.Threading.Thread.Sleep(1000) Application.DoEvents() '他のWindows操作を可能にするため If ExitFlag Then Exit For Next

noname#185525
質問者

お礼

出来ました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

Sleepは途中で止めることが出来ません。 AutoResetEventのWaitOneで最大1s待つようにすることで代替することが可能かと。

noname#185525
質問者

お礼

回答ありがとうございます。意味が直ぐに分かりませんので調べてみます。 Sleep(1000)の間は止められなくても,For~Next間でどうして止められないのかと思いました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ループ中にフォームを閉じると、様々な例外が出てしまう・・

    お世話になっております。 VB2005を勉強しております。現在、フォームが一枚だけのシンプルなプログラムを作っています。For~Nextのループ内にApplication.DoEvents()と記述して他の操作を受けられるようにしておりますが、その状態でループ中にフォームを閉じると例外が出てしまいます。それにフォームは消えまても、デバッグ中断ボタンを押すまでプログラム自体はは起動したままです。強制定期にループを破棄する方法をご教授ください。または、ループ中でも正常にプログラムを閉じる方法でも結構です。 ループ内の処理によってエラー内容は違いますが、現在はAccess.Violation.Exceptionという例外がでます。下記のように、なんの処理もしないループを作ってみましたが、やはりこれでも違う例外が出ました。 ・その1 For i As Integer = 0 To 1000000000   Application.DoEvents() Next ・その2 For i As Integer = 0 To 1000000000   Application.DoEvents()   System.Threading.Thread.Sleep(100) Next ちなみに、フォームのClosingイベントでフラグを立てて、 For i As Integer = 0 To maxInt   If flag_closing = True Then     Exit For   End If   Application.DoEvents() Next などとやってみましたが効果がありませんでした。 よろしくお願いいたします。

  • Threading.Thread.Sleep()の前後の処理

    初めて質問します。(VB2008始めたばかりの初心者です) 昔のBASICでwaitやdelay、sleepなどといったプログラムの実行を一時止めることの出来るコマンドがあったと思いますが、 VB2008上で同じようなことさせてラベルの色を一定時間で変化させたいと思い、色々調べて Threading.Thread.Sleep()  というものを見つけました。実際使ってみるとThreading.Thread.Sleep()の前に書いた処理がうまく動作しません。 (下記のような簡単なコードですが) Private Sub Buttonstart_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles Buttonstart.Click    Label1.BackColor = Color.White     Threading.Thread.Sleep(2000)     Label1.BackColor = Color.Blue End Sub スタートボタンを押せばlabel1が白色になり2秒後に青にしたいのですが白色にならずに2秒後にいきなり青になってしまいます。 とても初歩的な間違いをしていると思うのですが解決できません。恥ずかしいと思いながらも質問させていただきます。アドバイスをお願いします。

  • vb2010 Sleepを使うと調子が悪くなる

    次のプログラムでButton1を押さないで×を押すと仕事を残して終了した事になり,PCの調子が悪くなります。 なんとか回避できないでしょうか。 Public Class Form1 Private ExitFlag As Boolean = False Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click For I = 1 To 10000 System.Threading.Thread.Sleep(1000) Application.DoEvents() '他のWindows操作を可能にするため If ExitFlag Then Exit For Next ExitFlag = False MsgBox("中止されました") End Sub Private Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click ExitFlag = True End Sub End Class

  • java Threadのsleepを途中で止める方

    今、訓練校に通っていて課題をだされていますが、どうもうまく行きませんのでお知恵を拝借したく思います。  java Threadのsleepを使用し、クイズの回答を10秒以内で答えるというものですが、 途中で入力をすると、次の問題の回答時間が異様に早くなり1秒ではなくなってしまいます。  こういう場合、入力をすれば、runメソッドが終わるというプログラムはどうやって書けばいいのか教えて頂きたく思います。 どうぞよろしくお願いいたします。 <下記、threadの部分だけですが、パッケージを使用するという課題のため無理やり使っています。> package pa; public class CountTest extends Thread { public void start() { super.start(); } public void run() { for (int i=10; i >= 1; i--) { try{ sleep(1000); System.out.print("⇒" ); }catch(InterruptedException e){} } System.out.println(""); for (int i=1; i >= 1; i--) { / } System.out.println("Time up "); System.out.println(""); System.out.println("1-4で答えを記入してください"); }

    • ベストアンサー
    • Java
  • VB2008で

    VB2008で System.Threading.Thread.Sleepを使って5秒後にテキストボックスにaと表示させるプログラムを作ろうとしましたが、うまくいなないため、タイマーコントロールを使用したいと思ったのですが、どのようにしたらいいでしょうか?

  • C++ Thread::Sleep()について

    RunTimer = gcnew Timer(); RunTimer->Interval = 50; RunTimer->Tick += gcnew EventHandler(this, &RunTick); RunTimer->Enabled = true; ・・・処理・・・ RunTimer->Enabled = false; System::Threading::Thread::Sleep(1000); としているのですが、数コマ動いてしまいます。 処理は3枚の画像を差し替えて動かしているのですが、即座にスリープがかからず、 画像が少し歪んでしまいます。 ソースが長く、どこを記載すれば良いのか解らず、かなり抜粋しましたが、 TimerのTickで画像を入れ替えて、歩いている様にみせかけています。 一時停止後、改めて処理を始めようと思っているのですが、 なぜだか、少し動いてしまします。 Sleepを削除すると、うまく止まるのですが、即座に次の処理に移行してしまう為、数秒停止させたいと考えています。 System::Threading::Thread::Sleep(1000); だけでは、即座に止める事はできないものでしょうか? また、TimerのTickを数秒止める事はできるものでしょうか? ご存じの方、アドバイスよろしくお願いいたします。

  • For ~ Next の使い方

    for ~ next 構文の途中でカウンターを進めることはできますか。 For I=1 to 10 処理 if ~ then next 処理 next このようにすると、エラーになります。 仕方なく次のようにしていますが、もっと良い方法はありますか。 For I=1 to 10 処理 if ~ then goto 次の行へ 処理 次の行へ: next

  • Visual c# スレッド

    プログラム初心者です。 Visual c#にてスレッド関数を使ったプログラムを見よう見まねで 作りました。 スタートボタンを押すとピクチャーボックスの位置が 左から右へ移動し、ストップボタンを押すと止まる。 ピクチャーボックスの位置をテキストボックスに表示する。 というプログラムのつもりです。 デバックの状態でスタートボタンを押すとエラーメッセージが出て テキストボックスに位置を書き込むの関数のところが緑色にハイライトされます。エラーの内容は「有効でないスレッド間の操作」とありますが、どうしたら良いのか分かりません。 エラーの直し方を教えてください。 プログラムコードは以下です。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; namespace bit_map_08._1._ { public partial class Form1 : Form { private Thread thread; static private int Position = 0; static private int i; static bool BtnOnFig; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { thread = new System.Threading.Thread(newSystem.Threading.ThreadStart(MainThread)); thread.Start(); } private void PointMove() { if (i < 300) { i = i + 1; Position = Position + i; textBox1.Text = Convert.ToString(Position); pictureBox1.Left = (Position); } if (i == 300) { i = 0; } } private void MainThread() { while( true ) { Thread.Sleep(100); if (BtnOnFig == true) { PointMove(); } } } private void button1_Click(object sender, EventArgs e) { BtnOnFig = true; } private void button2_Click(object sender, EventArgs e) { BtnOnFig = false; } } }

  • Thread.sleep()について(休止の対象は)。

    こんにちは。 Javaで、 Thread.sleep(duration);と書いた場合、 停止の対象となるスレッドは どうなるのでしょうか。 もし、sleep()がインスタンスから、 呼び出せるなら、thread(インスタンス).sllep() と書くことで、そのインスタンス(スレッドを 継承したクラス)を休止するので、 分かりやすいのですが、Thread.sleep()と 書くので、わかりずらいです。 以下のような、書き方に戸惑っています。 public class xx{ public static void main(String args){ while(1){ Thread.sleep(1000); System.out.println("abc"); } } } これは、 メインスレッドを対象としている、 と考えていいのでしょうか。 スレッドを継承したクラスで、 Thread.sleep()と書いたときは、 そのクラスを休止させる、 という理解で、いいのでしょうか。 何かアドバイスできる人がいましたら、 よろしくお願いします。

    • ベストアンサー
    • Java
  • VB.NET スレッドからのイベント受信について

    はじめて質問させていただく、VB.NET初心者です。 ただいまスレッド、イベント処理を作成中で Form1にButton1、Label1を貼り付け以下の様なプログラムを記述しました。 (スレッドにて5秒ごとにイベントを発生させます。) 'イベント引数 Public Class EventArgs Inherits System.EventArgs Public nowTime As String End Class 'イベント発行 Public Class EventTest Public Event _event(ByVal sender As Object, ByVal e As EventArgs) Public Sub Go() Dim args As New EventArgs() args.nowTime = Now.ToString RaiseEvent _event(Me, args) End Sub End Class 'フォーム内処理 'スレッド宣言 Dim MyThread As New System.Threading.Thread(AddressOf _Thread) Private WithEvents _test As New EventTest() 'イベント受信   Private Sub Handler(ByVal sender As System.Object, ByVal e As EventArgs) Handles _test._event Label1.Text = e.nowTime End Sub 'スレッド(5秒間隔でイベント発行) Private Sub _Thread() Dim i As Integer For i = 0 To 99 System.Threading.Thread.Sleep(5000) _test.Go() Next End Sub 'スレッド起動 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MyThread.Start() End Sub End Class 開発環境から普通に実行すれば正常に動作している様なのですが、 イベント受信部(Handler)のLabel1.Text = e.nowTime部に ブレークポイントを置いてLabel1のウォッチをするとその時点で 処理がとまってしまいます。なぜとまるのかが知りたいです。 作成方法がまずいのでしょうか? 皆様よろしくお願いいたします。