PowerBuilder通过 Shared.... 函数来使用线程。
例如:
int i
for i = 1 to 10
SharedObjectRegister("uo_thread_test","thread_" + string(i))
next
接下来,可以使用 SharedObjectGet 函数取得对象实例,然后用 post 调启动线程 。如果在 uo_thread_test 对象的 constructor 事件里已经有代码,这些代码 其实在 SharedObjectRegister 成功后已经开始运行,也就是构造函数里可以直接实现线程任务,不需要SharedObjectGet然后再post。
对象用完后,可以SharedObjectUnregister来释放这个线程。
那么这个坑在哪呢?既然 constructor 事件里面可以写代码,直接实现线程任务。SharedObjectUnregister释放线程,会触发uo_thread_test 对象的 destructor 事件。destructor 事件里可以写代码在线程结束后进行线程的一些清理任务吗?
答案是否定的!!!
uo_thread_test 对象的destructor里的任何代码都可能导致程序崩溃。原因是此时线程的运行环境已经被PB释放掉了,再在这个环境里运行代码,必然造成内存违规访问。
经验教训:不要在线程对象的destructor事件里写任何代码!!!