我有一个执行模拟的方法。在该模拟中,调用了几种耗时的方法。我想在执行模拟期间将一些状态计数器和状态值输出到Form上的textBoxes。但是,这不起作用。完成模拟后,仅报告最终状态。
我认为treading可能是要走的路,但是我觉得很难把状态更新之间的代码放到一个单独的方法中(没有(返回)参数??),这样就可以使用{{1注意:对于方法中的参数,我得到“委托构造函数的线程无效参数;委托目标需要是指向成员函数的指针”。
以下是模拟方法的代码:
ThreadStart
状态更新将发送到Form1,并以void Simulation::runSimulation(Genome^ aGenome, Organ^ anOrgan, int nCycl, int nMem)
{
int i, j, k;
bool terminateLoop = false;
double gFitness;
double avgFitness;
double sumFitness;
int vCells, vGenes; // void cells / genes
bool nDivLimit;
bool nCellLimit;
i = 0; // cylcle counter
while (i < nCycl && !terminateLoop)
{
f1->textBox3->Text = i.ToString();
j = 0; // population member counter
sumFitness = 0.0;
while (j < nMem && !terminateLoop)
{
genomePool->Add(aGenome);
genomePool[j]->generateRandomGenome(); // time consuming method
anOrgan->initOrgan();
nDivLimit = false;
nCellLimit = false;
k = 0; // organ loop counter
while ( (k < anOrgan->maxCycles || anOrgan->maxCycles == -1) && !nDivLimit && !nCellLimit)
{
anOrgan->processGeneExpressions(nDivLimit, nCellLimit); // very time consuming method
k++;
}
gFitness = anOrgan->getOrganFitness(vCells, vGenes); // time consuming method
genomePool[j]->gFitness = gFitness;
sumFitness += gFitness;
avgFitness = sumFitness / (double) (j+1);
f1->textBox5->Text = j.ToString();
f1->textBox7->Text = gFitness.ToString();
f1->textBox6->Text = avgFitness.ToString();
j++;
}
i++;
}
}
的形式转发到此类。即使是在实际处理开始之前调用的textBox3的第一次更新,也仅在方法完成时输出。
问题:
1)是否采用线程(仅)方式?
2)如何将状态更新(f1
调用)之间的代码移动到可以使用f1->textBox
等调用的单独方法中?
答案 0 :(得分:0)
调用f1-&gt;在while(j&lt; nMem&amp;&amp;!terminateLoop)循环结束时刷新。
这将更新您的显示并允许GUI与用户进行交互。
尝试偶尔调用Refresh,比如说每5,10,50或100个循环,直到找到一个能让你根据需要响应GUI的频率 - 但不会更多。