
こんちは。最近C#をやり始めて行き詰まったので質問致します。
質問内容に対する答えをお持ちの方がいらっしゃいましたら、お暇な時にでもお答えください。
public Class SumLoop {
public Keisan(int Cnt, string Msg) {
// (1)プログレスバーのフォーム生成時に変数Cntをプログレスバーの最大値、変数Msgをフォームのタイトルに設定したい。
FormProgress FrmPro = new FormProgress();
Thread thread = new Thread(new ThreadStart((2)) );
thread.Start();
for(int i=0; i<Cnt; i++) {
// (3)このiがインクリメントする度にプログレスバーのValueを増やしたい
// FrmPro.SetProgressValue(i) // これだとコンパイラに怒られた
// ここに主な処理
}
}
public partial class FormProgress : System.Windows.Forms.Form {
public FormDfmProgress() { InitializeComponent(); }
// (3)これではダメみたい
public void SetprogressValue(int iValue) {
progressBar1.Value = iValue;
progressBar1.Refresh();
}
// (4)他のイベントが必要?
}
ざっと汚いコードを書きましたが具体的にお知恵を貸して頂きたいところは
(1)のフォーム生成時のパラメータをどう与えるのか?
インスタンス作成の際にここで言うFormDfmProgressをthisで継承させオーバーロードさせれば良いんでしょうか?
(2)プログレスバーのフォームを表示させたいだけなのですが、.ShowDialog()では怒られ、.Showでは即座にフォームが消えたりでどうにもなりません。スレッドが消えるまで表示させるにはどうしたらいいでしょう?
(3)フォーム側のプログレスバーのValueなり、変数なりをスレッド稼動中に更新させるにはどうしたらいいでしょうか?
(4)は、大して気にしていないのですが、これが致命的に足りない!とかいうのがあればご指導願います。
以上長々となりましたが、お暇な方お力を御貸しください
No.2
- 回答日時:
この部分は スレッド作成するイベント側で記述します
Thread thread = new Thread(new ThreadStart((2)) );
thread.Start();
(2)はデリゲートを指定しますので 引数なしのデリゲート用関数を用意します
FormProgressのキャプション(タイトル)の変更は Textプロパティでできます
Public Class SumLoop
{
public int nCnt = 0;
public String sMsg = "";
public void keisan()
{
FromProgress frm = new FormProgress();
frm.Text = sMsg;
frm.setProgrssMax( nCnt );
frm.Show();
for( int i = 0; i < nCnt; i++ ) {
frm.setProgressValue( i );
Thread.Sleep( 10 );
}
}
}
ProgessBarの最大値は Maximumプロパティを操作するので 外部から扱えるようにメソッドを追加しましょう
public void setProgressMax( int nMax )
{
progressBar1.Maximum = nMax;
}
スレッド起動側のイベントで
SumLoop objSL = new SumLoop();
objSL.nCnt = 200;
objSL.sMsg = "タイトル";
Thread thread = new Thread( new ThreadStart( objSL.Keisan ) );
thread.Start();
といった具合でしょう
わざわざコードまで付けて頂いて恐縮です。
ただ、こちらの方法では計算(Keisanメソッド)をスレッド化するようです。
私のコードと質問内容の書き方が悪いといえばそれまでですが
Keisanメソッドが言わばMainのような形で、フォームやらその他のメソッドは常にKeisanメソッドの従としたいのでした。
後学の参考とさせて頂きます。
No.1
- 回答日時:
こういうときには、BackgroundWorker という便利なものがありますので、そちらを使いましょう。
http://www.atmarkit.co.jp/fdotnet/dotnettips/436 …
http://msdn.microsoft.com/ja-jp/library/system.c …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JScrollPaneで、表示がおかしく...
-
GetDIBits関数の使い方について
-
C#からVC++DLLの呼び出しに失敗...
-
C#から、C++で作成したdll内の...
-
ボタンの複数割り当てについて
-
コンボボックスを使う時の警告
-
アプレットでマウスイベントが...
-
Exception in thread "main" ...
-
二分探索木の要素の数を数える...
-
パスがとおらない・・・
-
正規表現
-
C# DataGridView列カスタマイズ
-
C言語のポインターに関する警告
-
System.err. printlnとSystem.o...
-
JavaScriptの変数をjavaのメソ...
-
ORA-01858: 数値を指定する箇所...
-
VBAで配列の計算
-
javaで質問です。 文字列2023/2...
-
JavaScriptを使ってロト6の当...
-
streamで送信されたArrayListを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
Junitテストでvoid戻り値メッソ...
-
C#でキーイベントが発生しない...
-
ボタンの複数割り当てについて
-
C#で、あるクラスのメンバーす...
-
C#から、C++で作成したdll内の...
-
C# WinForm のDataGridView Cel...
-
C#でのWNetAddConnection3の使...
-
C# 親フォームで指定した値を...
-
C# 矢印キーの取得
-
unityでのC++エラーの原因がわ...
-
C# DataGridView列カスタマイズ
-
コンボボックスを使う時の警告
-
C#で、定数をフラグ(if文)に...
-
C# MouseHoverを何度も呼ぶには
-
C#で別のFormへ複数の値を返そ...
-
正規表現
-
【Java】画像表示が出来ない!
-
C# visibleプロパティをfalseに...
-
JavaのSwingで別のフォーム...
おすすめ情報