fork download
  1. //VisualStudio2005 C# を使用してます
  2.  
  3. //やりたいこと
  4. //フォームのbutton1から クラスaの関数bを呼ぶ
  5. //クラスaの関数bで スレッドcを行う
  6. //スレッドcの終了時に フォームの関数dを呼びたい
  7. //フォームの関数dで button1.text="e"; としたい。(スレッドcの結果を表示)
  8.  
  9. //困っていること
  10. //button1.text="e"; とするときエラーが出る
  11. //別スレッドからコントロールを操作できないらしい
  12. using System;
  13. using System.Collections.Generic;
  14. using System.ComponentModel;
  15. using System.Data;
  16. using System.Drawing;
  17. using System.Text;
  18. using System.Windows.Forms;
  19.  
  20. namespace app2
  21. {
  22. public partial class Form1 : Form
  23. {
  24. public Form1()
  25. {
  26. InitializeComponent();
  27. }
  28.  
  29. a aa=new a(); //クラスa
  30.  
  31. private void button1_Click(object sender, EventArgs e)
  32. {
  33. a.delegate_dd return_dd = new a.delegate_dd(d); //終了時に呼ばれるメソッド
  34. aa.b(return_dd);
  35. }
  36.  
  37. //終了時に呼ばれるメソッド
  38. void d()
  39. {
  40. System.Diagnostics.Debug.WriteLine("デバグ eee");
  41. button1.Text = "ee"; //エラー:有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'button1' がアクセスされました。
  42. }
  43. }
  44.  
  45. class a
  46. {
  47. public delegate void delegate_dd();
  48. delegate_dd break_call_dd;
  49.  
  50. public void b(delegate_dd break_call_para)
  51. {
  52. break_call_dd = break_call_para; //処理が終わった時に呼ぶメソッド
  53. //メソッドを別のスレッドで実行する
  54. System.Threading.Thread cc = new System.Threading.Thread(new System.Threading.ThreadStart(c));
  55. cc.Start(); //スレッドを開始する
  56. }
  57.  
  58. public void c()
  59. {
  60. System.Threading.Thread.Sleep(1000);
  61. break_call_dd(); //呼び出し元で指定されたメソッドを呼ぶ
  62. //Invoke(break_call_dd()); //エラー回避で元の基本スレッドで実行したい
  63. }
  64. }
  65. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty