2016-04-18 7 views
0

私はスレッディングの前にC++で学んでいました。今度は、初めてこのコードをCorectlyで動作させるように設定しようとしていますが、CheckIllegal ... = falseでは動作しません。 私はデリゲートをそこに置くことを試みてきましたが、他にもたくさんのものがありましたが、私は同じ問題を抱えています。両方のスレッドがWriteInLogのメソッドに入っているので、私は実際にこの作業を行う方法を見ることができません。 誰でもアイデアと説明がありますか?クロススレッディングC#

namespace viseNitniRad 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 


     } 
     private int firstNum = 0; 
     private int secondNum = 0; 
     public Thread firstThread; 
     public Thread secondThread; 

     public void WriteInLog(string message) 
     { 
      lock (textBox3) 
      { 
       textBox3.Text += message + Environment.NewLine; 
      } 
     } 

     private void CheckInput() 
     { 
      int pom = 0; 
      firstNum = int.Parse(textBox1.Text); 
      secondNum = int.Parse(textBox2.Text); 
      if (firstNum > secondNum) { 
       pom = secondNum; 
       secondNum = firstNum; 
       firstNum = pom; } 

      WriteInLog("Prvi broj: " + firstNum.ToString()); 
      WriteInLog("Drugi broj: " + secondNum.ToString()); 
     } 


     private void button1_Click(object sender, EventArgs e) 
     { 
      CheckInput(); 

     } 

     public delegate void ThreadSum(); 
     public delegate void ThreadUmn(); 
     public void Threadsumm() 
     { 
      int suma = 0; 
      for (int i = firstNum; i < secondNum; i++) 
       suma += i; 
      WriteInLog("Suma= " + suma.ToString() + " kraj: " + DateTime.Now.ToString()); 

     } 

     public void ThreadUmno() 
     { 
      int umnozak = 1; 
      for (int i = firstNum; i < secondNum; i++) 
       umnozak*= i; 
      WriteInLog("Umnozak= " + umnozak.ToString() + " kraj: " + DateTime.Now.ToString()); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      WriteInLog("Pocetak svih izracuna u: " + DateTime.Now.ToString()); 

      firstThread = new Thread(new ThreadStart(Threadsumm)); 
      secondThread = new Thread(new ThreadStart(ThreadUmno)); 


      firstThread.Start(); 
      secondThread.Start(); 


     } 
    } 
} 
+0

テキストボックスのようなUI要素をロックしないで、オブジェクト型のプライベートフィールドをロックします。 – stuartd

答えて

0

誰もがここに来て、この質問の答えを正確に知りたいのですが、ここはそうです。 私は何かを変更したくないので、呼び出すことについて学びます。なお、ここでのコード

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Threading; 


namespace viseNitniRad 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 


     } 
     private int firstNum = 0; 
     private int secondNum = 0; 
     public Thread firstThread; 
     public Thread secondThread; 

     public void WriteInLog(string message) 
     { 
      if (this.textBox3.InvokeRequired) 
      { 
       ThreadSum ts = new ThreadSum(WriteInLog); 
       this.Invoke(ts, new object[] { message }); 

      } 
      else 
      { 
       this.textBox3.Text += message + Environment.NewLine; 
      } 
     } 

     private void CheckInput() 
     { 
      int pom = 0; 
      firstNum = int.Parse(textBox1.Text); 
      secondNum = int.Parse(textBox2.Text); 
      if (firstNum > secondNum) { 
       pom = secondNum; 
       secondNum = firstNum; 
       firstNum = pom; } 

      WriteInLog("Prvi broj: " + firstNum.ToString()); 
      WriteInLog("Drugi broj: " + secondNum.ToString()); 
     } 


     private void button1_Click(object sender, EventArgs e) 
     { 
      CheckInput(); 

    } 
     public delegate void ThreadSum(string message); 
     public delegate void ThreadUmn(); 
     public void Threadsumm() 
     { 
      int suma = 0; 
      for (int i = firstNum; i < secondNum; i++) 
       suma += i; 
      WriteInLog("Suma= " + suma.ToString() + " kraj: " + DateTime.Now.ToString()); 

     } 
     public void ThreadUmno() 
     { 
      int umnozak = 1; 
      for (int i = firstNum; i < secondNum; i++) 
       umnozak*= i; 
      WriteInLog("Umnozak= " + umnozak.ToString() + " kraj: " + DateTime.Now.ToString()); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      WriteInLog("Pocetak svih izracuna u: " + DateTime.Now.ToString()); 

      firstThread = new Thread(new ThreadStart(Threadsumm)); 
      secondThread = new Thread(new ThreadStart(ThreadUmno)); 


      firstThread.Start(); 

      secondThread.Start(); 


     } 
    } 
} 

だあなたは私はロックメソッドを削除機能WriteInLog、中に少し変更を加えたとinvokeRequiredは、デリゲートは、同じ方法を実行するようにしていない場合よりは、彼を起動初期化する場合の条件を入れて見ることができるように、同じテキストボックスを更新するだけです3。 ありがとうございました! :)