0

以下に示すように、別の関数を呼び出す関数「graph1」があります。電話すると

graph1threader(copy, date);

欲しい答えが得られますが、これには 30 秒以上かかるため、マルチスレッドを使用してみました。しかし、私が使用するとき

thread[copy] = new Thread(() => graph1threader(copy, date));//pass date,copy
thread[copy].Start();

結果が得られません。つまり、グローバル変数は 0 しか保持しません。これはなぜですか? そして、どうすればこれを修正できますか?

void graph1()
    {

        chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
        chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = false;

        for (int k = 0; k < 5; k++)
        {                
            int copy = k;
            DateTime date = G.AddDays(copy);
            refValues[copy] = 0;
            threshValues[copy] = 0;
            y_Values[copy] = 0;
            y__Values[copy] = 0;
            yValues[copy] = 0;

            //task[copy] = new Task(() => graph1threader(copy, date));//pass date,copy
            //ask[copy].Start();
            graph1threader(copy, date);

        }



            for (int j = 0; j < 5; j++)
            {
                DateTime temp = G.AddDays(j);
                string temper = temp.ToShortDateString();
                y__Values[j] = y__Values[j] - y_Values[j];
                xNames[j] = temper;
            }

        chart1.Series[1].Points.DataBindXY(xNames, y_Values);

        chart1.Series[2].Points.DataBindXY(xNames, y__Values);

        chart1.Series[3].Points.DataBindXY(xNames, refValues);

        chart1.Series[4].Points.DataBindXY(xNames, threshValues);

        chart1.Series[5].Points.DataBindXY(xNames, yValues);

    }

void graph1threader(int x, DateTime date)
    {
        DBConnect A = new DBConnect();
        List<string>[] list = new List<string>[4];
        list = A.mandetselect();
        int numberofmen = A.Countmandet();
        string[] man_name = list[0].ToArray();
        string[] trade = list[1].ToArray();
        string[] license = list[2].ToArray();
        string[] training = list[3].ToArray();
        string[] display_status = list[4].ToArray();
        //string abc;
        List<string>[] lista = new List<string>[5];
        List<string>[] listc = new List<string>[14];


        for (int j = 0; j < numberofmen; j++)
        {
            int flag = 0;
            if (!display_status[j].Equals("NO") && (selection == "ALL" || (selection == "LAE" && license[j] != "") || (selection == "NON LAE" && license[j] == "") || (selection == "ALL AVIONICS" && trade[j] == "Avionics") || (selection == "NON LAE AVIONICS" && trade[j] == "Avionics" && license[j] == "") || (selection == "LAE AVIONICS" && trade[j] == "Avionics" && license[j] != "") || (selection == "ALL AIRFRAMES" && trade[j] == "Airframes") || (selection == "NON LAE AIRFRAMES" && trade[j] == "Airframes" && license[j] == "") || (selection == "LAE AIRFRAMES" && trade[j] == "Airframes" && license[j] != "")))
            {
                refValues[x]++;
                threshValues[x] = 0.8 * refValues[x];
                string abc = man_name[j].Replace(" ", "_");
                int no_of_proj = A.Countproj(abc);//required
                lista = A.manprojselect(abc);//required
                string[] projname = lista[0].ToArray();
                string[] country = lista[2].ToArray();
                string[] startofproj = lista[3].ToArray();
                string[] endofproj = lista[4].ToArray();
                string Status = "";
                listc = A.Select();
                int numberc = A.Count();//number of projects, not required
                string[] nameofproj = listc[0].ToArray();
                string[] status = listc[13].ToArray();

                for (int l = 0; l < A.Countproj(abc); l++)
                {

                    for (int m = 0; m < numberc; m++)
                    {
                        if (nameofproj[m] == projname[l])
                        {
                            Status = status[m];
                        }
                    }


                    DateTime shuru = DateTime.ParseExact(startofproj[l],
                                   "dd-MM-yyyy hh:mm:ss",
                                   CultureInfo.InvariantCulture);
                    DateTime anth = DateTime.ParseExact(endofproj[l],
                                   "dd-MM-yyyy hh:mm:ss",
                                   CultureInfo.InvariantCulture);
                    if (date >= shuru && date <= anth)
                    {


                        if (Status != "PLANNED" && Status != "LO" && flag == 0)
                        {
                            y_Values[x]++;//BASIC UTILISATION
                            flag = 1;
                        }
                        if (Status == "IP" || Status == "OTD")
                            y__Values[x]++;//EXCESS
                        if (Status == "PLANNED")
                        {
                            yValues[x]++;//UNUTILISED

                        }

                    }

                }
            }
        }

    }

マルチスレッドに出会ったのはつい最近のことです。コードが見栄えがよくない場合は、すみません。 threshValue[]refValues[]y_Values[]y__Values[]yValues[]すべてグローバル変数です

4

2 に答える 2

0

マルチスレッド化によってプログラムが自動的に高速化されるわけではなくThread.Join、スレッドが完了するのを待つだけです。

基本的に、スレッドが完了するまでメインスレッドを続行できない場合は、マルチスレッドを使用しないでください。

マルチスレッドが適している例:

  • 複数の場所から情報をダウンロードしようとする場合、複数のスレッドがそれぞれ 1 つの場所からのデータを待機するようにすることができます
  • ユーザー インターフェイスの応答性を維持しながら、時間のかかるタスクを実行したい場合

2 番目の例は、この場合に当てはまる可能性がありますThread.Joinが、ブロック操作です。スレッドの動作中にユーザー インターフェイスが更新されないようにします。その場合、スレッドがメインスレッドに完了を通知できるようにする必要があります。

ここで作業しているプラ​​ットフォームはわかりませんが、たとえばWindowsフォームでは、FormクラスにはInvokeそのフォームのスレッドでメソッドを呼び出すことができるメソッドがあります:

class TheForm
{
    // the method running in a separate thread
    void myThread()
    {
        // do the time consuming work
        byte[] myData = ProcessData();

        // send data to the main thread 
        Invoke(new Action<byte[]>(ThreadCompleted), myData);
    }

    // will be executed in the main thread
    void ThreadCompleted(byte[] data)
    {
        // process the data
    }
}

グローバル変数とマルチスレッドについて: どのスレッドからでもアクセスできますが、どのスレッドがいつアクセスするかはわかりません。可能であれば、複数のスレッドがそれらにアクセスすることを避けるか、lockそれらを保護するメカニズムを使用する必要があります。

于 2013-05-14T08:45:35.473 に答える