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事件里写任何代码!!!

本文揭示了PowerBuilder中使用SharedObject时的陷阱:尽管constructor可以用于线程任务,但绝不能在uo_thread_test对象的destructor中执行清理代码,因为这可能导致内存违规。记住,destructor在对象生命周期结束时不可靠,务必避免在其中写代码。
1159

被折叠的 条评论
为什么被折叠?



