| 分類:[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; }
}
|