界面A,接收用户输入
线程B,有任意多个,由A创建。B有一个状态标志,A通过设置B的状态标签来控制线程B。B实时将执行结果返回给A。
该怎么设计?
我现在的设计的是烂的。
class A extends wxFrame
{
DispCtrl dispCtrl; // 显示控件
createThread() { ThreadB *b = new ThreadB(); b->start(); // 创建线程
ThreadCtrl() // 控制线程B
{
b = findThreadById(id);
b.setStatus( status ); // 比如暂停,取消,中止等等
}
}
class ThreadB
{
ThreadB( DispCtrl dispCtrl ){ this._dispCtrl = dispCtrl ; }// 将显示控件传入线程内部
void run()
{
// 执行计算
// 在这里实时更新界面显示dispCtrl 的数据
}
}
界面API是wxWidgets
有相当一部分数据访问需要保证其是线程安全的,采用 wxCriticalSection/wxCriticalSectionLocker 来进行互斥访问,采用 wxMutexGuiEnter/wxMutexGuiLeave 在线程中更新界面显示。
但很奇怪。经常会发生莫名其妙的问题,一个不小心CPU就爆满了,再或者跳出错误。当更新数据去掉wxMutexGuiEnter/wxMutexGuiLeave,错误反而都消失了。
搞不清楚。头都晕了。