|
分類:[C#]
開発環境
Windows7
VisualC# 2008
こんにちは,初めて利用させていただきますC#初心者です.
別スレッドを立てても効果的な使い方ができず困っています.以下,実現したいことと現状です.
したいこと
Orig_studentというフォームが表示(Orig_student_Activatedメソッド)されたらhistory_reader_s(マウスで描画した軌跡を表すデータ)から1行ずつ読み取り,
processPacket()というメソッドを使ってOrig_studentフォーム内のピクチャボックスに描画を行う(history_reader_sの内容を再現する描画を行いたい).
stopButtonを押したら描画を停止し,viewButtonを押したら描画を再開したい.
現状
描画とボタン操作は同じスレッド内では無理だと考え,ボタン操作を違うスレッドを立てて行おうと思いましたが,実際は
・processPacket()を用いてピクチャボックスに描画することは可能ですが,stopButtonやviewButtonを用いて描画の停止・再生を行うことができない(描画中に停止・再生ボタンが使用できない).
・描画がすべて終わってから停止・再生ボタンを押すことが可能になる.
となり,スレッドを立てている意味がありません.
別スレッドでボタンとそのイベントハンドラを作成していますが,そのボタンを張り付ける先がOrig_studentフォームだからだめな気がします.
描画中にボタン操作を可能にするにはどうすればいいでしょうか?
描画部分(processPacket())はかなり面倒なことになっているので,ボタン操作のほうを別スレッドで行いたいです.
以下ソースです.
よろしくお願いします.
public partial class Orig_student :Form
{
private void Orig_student_Activated(object sender, EventArgs e)
{
if (type == 1) return;
if (hist_flag == false) return;
history_reader_s = new StreamReader(CurrentDir+"\\"+histData_s[0].file); //読み込みたいファイルのStreamReader作成
this.newTab_s = new System.Windows.Forms.TabPage();
this.newTab_s.Size = tabPage01.Size;
this.tabControl1.TabPages.Add(newTab_s);
this.newPanel_s = new System.Windows.Forms.Panel(); //再生・停止ボタンを張り付けたいパネルを作成
this.newPanel_s.Location = panel1.Location;
this.newPanel_s.Size = panel1.Size;
this.newPanel_s.BackColor = Color.White;
this.newTab_s.Controls.Add(newPanel_s);
Packet pk = new Packet();
HistThread = new Thread(new ThreadStart(MakeButton)); //停止・再生ボタンを利用するスレッド作成
HistThread.IsBackground = true;
HistThread.Start();
while (history_reader_s.Peek() > -1)
{
if (stop_flag == false)
{
pk.processPacket(history_reader_s.ReadLine()); //描画
}
}
hist_flag = false;
}
private void MakeButton() //停止・再生ボタンを作成する
{
this.stopButton = new System.Windows.Forms.Button();
this.stopButton.Location = button11.Location;
this.stopButton.Text = "stop!!!";
this.stopButton.Size = button11.Size;
this.stopButton.Click += new EventHandler(stopButton_Click);
this.viewButton = new System.Windows.Forms.Button();
this.viewButton.Location = button10.Location;
this.viewButton.Text = "view";
this.viewButton.Size = button10.Size;
this.viewButton.Click += new EventHandler(viewButton_Click);
setButton SB = new setButton(Set); //フォームにボタンを張り付ける
this.Invoke(SB);
}
private void Set()
{
this.newPanel_s.Controls.Add(stopButton);
this.newPanel_s.Controls.Add(viewButton);
stopButton.BringToFront();
viewButton.BringToFront();
}
private void stopButton_Click(object sender, EventArgs e)
{
stop_flag = true;
}
private void viewButton_Click(object sender, EventArgs e)
{
stop_flag = false;
}
}
|