gpt4 book ai didi

multithreading - 如何更正 “Cross-thread operation not valid”错误?

转载 作者:行者123 更新时间:2023-12-03 13:00:45 24 4
gpt4 key购买 nike

下面的代码给我下面的错误。我认为我需要“InvokeRequired”。但是我不知道该怎么用?

错误:跨线程操作无效:控件“statusBar1”是从创建该线程的线程之外的其他线程访问的。

代码 :

 public void CalculateGeneration(int nPopulation, int nGeneration)

{

int _previousFitness = 0;
Population TestPopulation = new Population();

for (int i = 0; i < nGeneration; i++)
{
if (_threadFlag)
break;
TestPopulation.NextGeneration();
Genome g = TestPopulation.GetHighestScoreGenome();

if (i % 100 == 0)
{
Console.WriteLine("Generation #{0}", i);
if ( ToPercent(g.CurrentFitness) != _previousFitness)
{
Console.WriteLine(g.ToString());
_gene = g;

statusBar1.Text = String.Format("Current Fitness = {0}", g.CurrentFitness.ToString("0.00"));
this.Text = String.Format("Sudoko Grid - Generation {0}", i);
Invalidate();
_previousFitness = ToPercent(g.CurrentFitness);
}

if (g.CurrentFitness > .9999)
{
Console.WriteLine("Final Solution at Generation {0}", i);
statusBar1.Text = "Finished";
Console.WriteLine(g.ToString());
break;
}
}


}


}

最佳答案

最易于重用的是添加一个辅助函数,例如:

    void setstatus(string txt)
{
Action set = () => statusBar1.Text = txt;
statusBar1.Invoke(set);
}

或先进行invokerequired检查:
    delegate void settextdelegate(string txt);
void setstatus(string txt)
{
if (statusBar1.InvokeRequired)
statusBar1.Invoke(new settextdelegate(setstatus), txt);
else
statusBar1.Text = txt;
}

无论哪种方式,都可以像这样设置状态
 setstatus("Finished");

为了完整起见,我应该补充一点,那就是更好的做法是将您的计算逻辑与表格分开,并从可以由表格处理的计算功能中提高一种状态,但这在这里可能完全超出范围。

关于multithreading - 如何更正 “Cross-thread operation not valid”错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10910863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com