• 5116阅读
  • 2回复

艰苦的线程之旅,请求帮助 [复制链接]

上一主题 下一主题
离线wugamp
 

只看楼主 倒序阅读 楼主  发表于: 2006-06-11
艰苦的线程之旅,请求帮助
我用的是 QT3.2.3。
我要实现这样的功能:用户点 START 按钮,一个线程“工作线程”就开始运行。在工作线程结束前,用户如果又按了STOP按钮,那么就会把一个全局变量 gbAbort 设为1。工作线程每运行一段时间后,就会检查gbAbort。如果它为1,就提前结束。在工作线程运行期间,GUI线程(主线程)唯一的工作就是响应STOP按钮。而工作线程会不时在屏幕上显示一些东西。
正规的做法是:工作线程用postEvent向GUI线程发送事件,由GUI线程替它完成屏幕显示。但是,我觉得这样太麻烦,而且GUI线程除了响应STOP按钮之外什么也不做,应该不会导致GUI操作的冲突。所以我是这样实现的:

class WorkThread; //工作线程

class MainThread: public MainBase //主线程
{
  public
  WorkThread *tT; //tT是指向工作线程的指针
  void Work();
}

class WorkThread : public QThread
{


public
  MainThread *tM; //tM是指向主线程的指针
}

void WorkThread::run()
{
tM->Work();
return;
}

我的想法是这样的:
1。在MainThread的构造函数中,为tT声明一个WorkThread对象,并令tT->tM=this;
2。在WorkThread::run()中,用tM->Work()执行主线程类中的成员函数;
3。在tM::Work()中,就象一般的单线程程序那样,进行各种GUI操作。
4。工作线程运行期间,EXIT按钮是灰的。只有在从WorkThread::run()出来的时候,才允许EXIT按钮。


可是,以上的代码经常出错,出错形式是:平时工作正常,但是在点EXIT按钮关闭进程(此时工作线程肯定结束了)时,有时会有WINDOWS的报错,说该EXE文件需要关闭,并问我是否发送错误信息。


我觉得奇怪:如果说工作线程和GUI线程都对屏幕操作而容易出错,是可以理解的。但是本程序中,一旦工作线程启动,GUI线程就不会对屏幕操作了,怎么也会出错呢?

另外,我也尝试了用postEvent方式。这个方式真麻烦,我得把所有的屏幕操作都定义成各种事件,然后工作线程发事件、GUI线程响应。而且我发现:如果工作线程的一个函数连续两个postEvent都发送同样的事件,就会出错!无奈,我用sendEvent代替postEvent才解决问题。但我不明白其中的道理。
更使我失望的是:使用sendEvent并没有根本解决问题。虽然出错的频率降低了,但并没有杜绝。在SUN工作站上,采用sendEvent的程序在连续运行了78次之后死掉了,只能强行杀死。
离线wugamp

只看该作者 1楼 发表于: 2006-06-11
刚才我采用了这样的办法:
在工作线程中,凡是要做GUI操作的地方,一律用qApp->lock()和qApp->unlock()“前呼后拥”地保护起来。
这样做了之后,在PC上连续运行了200遍,没有出错。
因为今天工作站没开,所以还不知道工作站上的效果如何。
离线fygenius

只看该作者 2楼 发表于: 2006-06-12
为何不用signal和slot机制呢?
快速回复
限100 字节
 
上一个 下一个