- PR -

C#でタイマーが作動しない

1
投稿者投稿内容
tomox
会議室デビュー日: 2006/07/15
投稿数: 4
投稿日時: 2006-08-21 17:29
タイマープログラムを作っています。
2台のコンピュータで通信しながら動作するのですが,以下のようにすると
タイマーがスタート・ストップできません。
button3はタイマーのスタート・ストップのボタンです。
****には適当な名前が入ります。
データの受信はしています。
button3.PerformClick();のところにMsgboxなどをいれると正常に表示されます。


コード:
private void ****()

{
TcpListener listener =
new TcpListener( IPAddress.Any, port);

listener.Start();

bAlive = true;

while( bAlive)
{
if( listener.Pending() == true)
{
TcpClient tcp = listener.AcceptTcpClient();
NetworkStream st = tcp.GetStream();
ArrayList aryList = new ArrayList();
do
{
int nret = st.ReadByte();
if( nret != -1)
{
aryList.Add( (byte)nret);
}
}while( st.DataAvailable == true);
tcp.Close();
byte [] byt = new byte[aryList.Count];
for( int i = 0; i < aryList.Count; i++)
{
byt[i] = (byte)aryList[i];
}
Encoding encode = Encoding.Default;
string strwork = encode.GetString( byt);
string[] stArrayData = strwork.Split(',');

if(stArrayData[0] == "PUSH"){
if(stArrayData[1] == "STBTN")
{
button3.PerformClick();
}

}


}
Thread.Sleep( 100);
}

listener.Stop();
evt.Set();
}



なお,以下のようなプログラムではスタート・ストップができます。

コード:
private void ****()

{
button3.PerformClick();
}



Button3のコードは以下のとおりです。
コード:

private void button3_Click(object sender, System.EventArgs e)
{

s_count.Text = Convert.ToString(set_sec - 1);
if(s_count.Text == "0")
{
button3.Text = "Stop";
}



if(button3.Text == "Start")
{

//presets.Enabled=false;
//al_s.Enabled=false;
rept.Enabled=false;
button3.Text = "Stop";
time_wath.Enabled=true;
sansy = Convert.ToInt32(s_sec.Text) - 1;
button8.Enabled = true;

//sendNetData("ACTN,TMRON",ipaddr,port,LANon.Checked);

checkBox1.Enabled = true;

PlaySound ("start.wav", new System.IntPtr(), PlaySoundFlags.SND_SYNC);
//MessageBox.Show(Convert.ToString(time_wath.Interval));
//time_wath.Interval = Convert.ToInt32(numericUpDown1.Value);


}
else
{
button3.Text = "Start";

presets.Enabled=true;
al_s.Enabled=true;
time_wath.Enabled=false;
rept.Enabled=true;
button8.Enabled = false;
checkBox1.Enabled = false;

}


}



[ メッセージ編集済み 編集者: tomox 編集日時 2006-08-21 17:33 ]
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-08-21 17:54
TcpListener の同期メソッドを使ってるってことは、この****メソッドはメインスレッドとは別のスレッドで動かしてませんか?
別スレッドからコントロールにアクセスする際は Control.Invoke/BeginInvoke を使用する必要がありますが。


[ メッセージ編集済み 編集者: Hongliang 編集日時 2006-08-21 17:56 ]
tomox
会議室デビュー日: 2006/07/15
投稿数: 4
投稿日時: 2006-08-21 18:46
とうもありがとうございます。
具体的にどのように記述すればよいのでしょうか。
初心者の質問で申し訳ございません。
よろしくお願い致します。
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2006-08-22 12:01
下記を参考にすると、Invokeの使い方はわかると思います。

http://www.atmarkit.co.jp/fdotnet/dotnettips/312ctrlinvoke/ctrlinvoke.html
1

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