- PR -

スレッドでのDoEvents

投稿者投稿内容
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-10-20 15:23
コウイチさん、こんにちは。

引用:

コウイチさんの書き込み (2005-10-20 12:08) より:
Tdnr_Sym さん、ありがとうございます。

ループ内に
Application.DoEvents();
を書かないとフォームは固まったままでした。



うまくいっているようで、良かったです。

引用:

引用:

じゃんぬねっとさんの書き込み (2005-10-18 12:26) より:
Application.DoEvents メソッドを使わずとも、
System.Threading.Thread.Join メソッドを用いて、
終了するまでに適宜本スレッドに処理を返すとか...

固まらなくはなったのですが、この記事の内容が気になります。
DoEvents メソッドを使わないでも、Thread.Join メソッドだけで
フォームを固まらないようにする方法=手軽出ない方法だと思うのですが・・・。
調べてはみたのですが、その方法がわかりません。(見つけられません><)
参考にできるサイト等あれば教えて頂けないでしょうか?

よろしくお願いします。m(_ _)m



ちょっと、私には分からないですね〜。
直接、じゃんぬねっとさんに本意をお聞きしないと。

でも、どうやら最初のご質問については解決されているようですので
これ以上どうこう調べなくてもいいんじゃないでしょうか(*^_^*)
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-20 16:04
引用:

コウイチさんの書き込み (2005-10-20 12:08) より:

DoEvents メソッドを使わないでも、Thread.Join メソッドだけで
フォームを固まらないようにする方法=手軽出ない方法だと思うのですが・・・。
調べてはみたのですが、その方法がわかりません。(見つけられません><)


す、すいません、思いっきり勘違いしておりました。
Join メソッドだけでは本スレッドが Busy であることに変わりなかったですね... (^-^A)

混乱させてすいませんでした。(*_ _)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
コウイチ
常連さん
会議室デビュー日: 2003/11/04
投稿数: 48
投稿日時: 2005-10-20 18:13
Tdnr_Symさん、じゃんぬさん
ありがとうございます。

引用:

Tdnr_Symさんの書き込み (2005-10-20 15:23) より:
でも、どうやら最初のご質問については解決されているようですので
これ以上どうこう調べなくてもいいんじゃないでしょうか(*^_^*)


引用:

じゃんぬねっとさんの書き込み (2005-10-20 16:04) より:
す、すいません、思いっきり勘違いしておりました。
Join メソッドだけでは本スレッドが Busy であることに変わりなかったですね... (^-^A)


別の方法があるなら、ついでに覚えたかったのですが、
勘違いでしたかw

ありがとうございました。
また質問のときは、よろしくお願いしますm(_ _)m
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-10-20 18:22
う〜ん。
何故メインスレッドが、サブスレッドが終了するのを一々待つんでしょうか?
メインスレッドはユーザの再入力だけ禁止して、そのまま放っておいても問題ないと思うのですが。
スレッドで処理しているのが終了するときに、最後に「スレッド終了」メソッドを実行し、そこでユーザの再入力等を可能にすれば済む話だと思うのです。
//まあ別スレッドで実行することになるからコントロールの操作にInvoke/BeginInvokeは必要だけど。
コウイチ
常連さん
会議室デビュー日: 2003/11/04
投稿数: 48
投稿日時: 2005-10-21 22:52
Hongliangさん、返事が遅くなってすみません。

索引構築と書いていますが、ホントは再構築をしています。
このアプリは、ボタンを押すと、索引再構築後、データの挿入・更新・削除を行います。
対象のテーブルが、頻繁に更新されている&件数が多いテーブルなので、
更新処理等を行う前に索引を再構築しています。
なので、再構築が終わってから、更新等の処理を行うために終了を待っています。

引用:

スレッドで処理しているのが終了するときに、最後に「スレッド終了」メソッドを実行し、そこでユーザの再入力等を可能にすれば済む話だと思うのです。
//まあ別スレッドで実行することになるからコントロールの操作にInvoke/BeginInvokeは必要だけど。


この方法は時間をみて試してみようと思います。
ありがとうございました。m(_ _)m
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2005-10-22 02:12
超簡単なサンプル。
Winアプリつくって貼り付けてそのままコンパイルすればOKっす。

コード:


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Threading;

public class SampleForm : System.Windows.Forms.Form {
private Button button;
private ProgressBar progressBar;
private TextBox textBox;

private const int waitTime = 10000;

public SampleForm() {
this.button = new Button();
this.progressBar = new ProgressBar();
this.textBox = new TextBox();

this.button.Dock = DockStyle.Fill;
this.button.Text = "待つよ";
this.button.Click += new EventHandler(button_Click);

this.progressBar.Dock = DockStyle.Bottom;
this.progressBar.Minimum = 0;
this.progressBar.Maximum = waitTime;

this.textBox.Dock = DockStyle.Top;
this.textBox.Text = "ここをいじって固まってないことを確認しる";

this.Controls.Add(this.button);
this.Controls.Add(this.progressBar);
this.Controls.Add(this.textBox);
}

private delegate void SetProgressInvoker(int progress);
private void SetProgress(int progress) {
if(this.InvokeRequired) {
this.Invoke(
new SetProgressInvoker(this.SetProgress),
new object[]{ progress }
);
return;
}
this.progressBar.Value = progress;
}

private Thread workerThread = null;
private void DoWorks() {
SetProgress(0);
for(int i=1000;i<=waitTime;i+=1000) {
Thread.Sleep(1000);
SetProgress(i);
}
this.BeginInvoke(
new CompleteWorksInvoker(this.CompleteWorks),
new object[]{ waitTime }
);
}
private delegate void CompleteWorksInvoker(int waitTime);
private void CompleteWorks(int waitTime) {
MessageBox.Show(this, string.Format(@"{0}[ms]待ちました", waitTime));

this.workerThread = null;
this.button.Enabled = true;
}
private void BeginWorks() {
if(this.workerThread!=null)throw new InvalidOperationException();

this.workerThread = new Thread(new ThreadStart(this.DoWorks));
this.workerThread.IsBackground = true;
this.button.Enabled = false;

this.workerThread.Start();
}

private void button_Click(object sender, EventArgs e) {
this.BeginWorks();
}

[STAThread]
private static void Main() {
Application.Run(new SampleForm());
}
}




[ メッセージ編集済み 編集者: ya 編集日時 2005-10-22 10:58 ]
コウイチ
常連さん
会議室デビュー日: 2003/11/04
投稿数: 48
投稿日時: 2005-10-24 09:06
yaさん、遅くなってすみません。

サンプル作って頂けるとは><
さっそく試してみようと思います。

ありがとうございました。m(_ _)m

スキルアップ/キャリアアップ(JOB@IT)