아래와 같이 다른 함수를 호출하는 '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[]
는
아니요, 코드를 다시 실행 해 보았습니다. 그것은 잘 작동하지만 증가 된 값은 전역 변수에 반영되지 않습니다. 그러나 thread.join()을 사용하면 원하는 결과를 얻을 수 있었지만 약 20 초의 시간 지연이있었습니다. –