質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

2008閲覧

C# 一時停止/再開ボタン

Shotani

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2023/04/12 06:43

編集2023/04/12 06:50

実現したいこと

ここに実現したいことを箇条書きで書いてください。
Windows Formでボタンをクリックすると、一時停止、再度ボタンをクリックすると再開する機能を実現したいです。

前提

ここに質問の内容を詳しく書いてください。
Windows Formでロード画面を作成しています。
ボタンをクリックすると、一時停止
再度ボタンをクリックすると再開する機能を実現したいです。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

C#

1ソースコード

試したこと

Sleepメソッドで一定時間停止させることは試しましたが、それですと再開ができません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2023/04/12 07:06

現状のコードを提示しよう
退会済みユーザー

退会済みユーザー

2023/04/12 07:24

質問を書いたら見直して、「ここに実現したいことを箇条書きで書いてください。」などテンプレートの余計な文は削除しましょう。 開発環境を質問欄を編集して追記してください。(例: Windows 10 の Visual Studio 2022 で Windows Forms アプリをターゲットフレームワーク .NET Framework 4.8 で作っています・・・とか) やりたいことを実現するために自分ではどこまで実装できていて、どこで躓いていて、何が分かれば解決できるかを、自分が書いたコードを質問欄に貼るなどして説明してください。丸投げは歓迎されません。 読んでください。 https://teratail.com/help/avoid-asking https://teratail.com/help/question-tips
episteme

2023/04/12 08:00

「何」を一時停止/再開するんですか? stopwatchみたいなやつ?
Shotani

2023/04/12 08:13

ファイルの読み込みです
episteme

2023/04/12 08:33

それはつまり。ファイルの読み込みにすっげー時間かかるからユーザーに停止/再開を求めるってこと?
Shotani

2023/04/12 08:39

その通りです。 勉強の題材としてファイル読み込み中のロード画面に関する機能を実装しています。 プログレスバー、%表示、キャンセルボタンなどの機能を実装してみましたが、一時停止/再開のボタンを実装する方法がなかなか思い浮かばないというところで質問させていただきました。
episteme

2023/04/12 08:56 編集

だったら例えば定周期タイマーを起動させておき、停止/再開ボタンの状態に応じて「動け/止めろ」フラグをON/OFFさせる。タイマーのタイムアウト時にフラグの状態に応じて「読む/読まない」を決めればいいんじゃないかと。
Shotani

2023/04/13 13:40

ありがとうございます。 試してみます。
guest

回答1

0

ベストアンサー

Windows Formでボタンをクリックすると、一時停止、再度ボタンをクリックすると再開する機能を実現したいです。

「ファイルの読み込み」だそうですが、中断できるような作りになっている必要があります(大量のファイルなら1個ずつなり数個ずつなり、大きいファイルなら1行ずつなり何バイトずつなり)

.NET7です^^

cs

1using System.ComponentModel; 2 3namespace Q8mboczjersitg8; 4 5public partial class Form1 : Form 6{ 7 private readonly ManualResetEvent busy = new(false); 8 9 public Form1() 10 { 11 InitializeComponent(); 12 13 backgroundWorker1.WorkerReportsProgress = true; 14 backgroundWorker1.WorkerSupportsCancellation = true; 15 } 16 17 private void button1_Click(object sender, EventArgs e) 18 { 19 if (button1.Text == "一時停止") 20 { 21 busy.Reset(); 22 button1.Text = "再開"; 23 } 24 else 25 { 26 if (!backgroundWorker1.IsBusy) 27 { 28 backgroundWorker1.RunWorkerAsync(); 29 } 30 busy.Set(); 31 button1.Text = "一時停止"; 32 } 33 } 34 35 private void button2_Click(object sender, EventArgs e) 36 { 37 if (backgroundWorker1.IsBusy) 38 { 39 backgroundWorker1.CancelAsync(); 40 busy.Set(); 41 } 42 } 43 44 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 45 { 46 for (var i = 1; i <= 100; i++) 47 { 48 busy.WaitOne(); 49 if (backgroundWorker1.CancellationPending) 50 { 51 e.Cancel = true; 52 return; 53 } 54 55 // ファイルの読み込みがあるテイで 56 Thread.Sleep(100); 57 58 backgroundWorker1.ReportProgress(i, "実行中"); 59 } 60 61 e.Result = "完了"; 62 } 63 64 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 65 { 66 label1.Text = $"{e.UserState} {e.ProgressPercentage}%"; 67 progressBar1.Value = e.ProgressPercentage; 68 } 69 70 private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 71 { 72 if (e.Cancelled) 73 { 74 label1.Text = "キャンセル"; 75 progressBar1.Value = 0; 76 } 77 else 78 { 79 label1.Text = $"{e.Result}"; 80 } 81 82 button1.Text = "開始"; 83 } 84}

アプリ画像

参考

C# Windows Formsで処理中にクルクルするローディングアニメーションを作る方法 - lisz-works

c# - How to pause and resume a BackgroundWorker? - Stack Overflow

c# - Pause/Resume loop in Background worker - Stack Overflow

onlyutkarsh/PauseResumeDemo: Pause and Resume demo using BackgroundWorker in C#

投稿2023/04/12 10:42

TN8001

総合スコア9321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問