我用的是 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次之后死掉了,只能强行杀死。