こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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;
}

}
}

投稿日時 - 2008-11-09 15:41:25

QNo.4465282

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

C#のスレッドには詳しくないですが、VC++でも、この方法はプログラムは停止します。コントロールは、スレッドごとの管理になっているので、子スレッドから別スレッド管理下のコントロールを操作すると、存在しないコントロールを操作することになるので、プログラムが飛びます。
VC++で子スレッドから、親スレッド管理下のコントロールを操作するときは、子スレッドから親スレッドにメッセージを送ります。親スレッドは、そのメッセージを受信したら、コントロールを操作するようにさせています。
おそらく、C#でも同じ原因で飛んでいると思いますし、同じ解決方法がとれる思います。
後は、C#に詳しい方にお任せします。

投稿日時 - 2008-11-09 17:02:35

お礼

回答ありがとうございます。
このプログラムのスレッドに親と子があることを知りませんでした。
テキストボックスやピクチャーボックスなどツールから選んで
フォームに貼り付けるものは自前のスレッド以外のスレッドで
管理されてるのどしょうか?
お時間がありましたらVC++の方法でも良いので聞かせてください。
よろしくお願いします。

投稿日時 - 2008-11-09 19:22:25

あなたにオススメの質問