C ++ \ Cli在执行(冗长)方法时没有对Form进行状态更新

时间:2014-04-10 15:15:43

标签: multithreading c++-cli

我有一个执行模拟的方法。在该模拟中,调用了几种耗时的方法。我想在执行模拟期间将一些状态计数器和状态值输出到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等调用的单独方法中?

1 个答案:

答案 0 :(得分:0)

调用f1-&gt;在while(j&lt; nMem&amp;&amp;!terminateLoop)循环结束时刷新。

这将更新您的显示并允许GUI与用户进行交互。

尝试偶尔调用Refresh,比如说每5,10,50或100个循环,直到找到一个能让你根据需要响应GUI的频率 - 但不会更多。