PB采用共享对象实现伪多线程

liu_jie_1 2012-11-14 11:28:20
如何控制伪线程的运行时? 伪线程是否有特定的运行时间片,伪线程的时间片用完了就会自动停止吗?

问题描述:

在调试PB 多线程的时候,共享变量对应了一个本地的窗口W,将这个窗口W的句柄传给其他的进程A,实现伪线程与进程A之间的交互。
进程A通过发消息给伪线程中的窗口W 的事件,然后处理一些业务逻辑。

伪线程中的窗口W的接收消息处理事件中的代码不能debug跟踪进去,只好采用写日志的方式来记录伪线程到底走到哪一步了。
结果发现,伪线程总是容易在一个固定的代码点终止了(这个代码点是一个调用 send() 函数写的语句) ,也不是每一次都在这个点终止,时不时的发生。 不过 一旦在伪线程中被终止了,PB的主线程也不响应了,造成了程序的卡死。


补充:
在网上查了一下资料,提到:PB程序的主线程可以直接执行在共享对象中的方法(通过使用SharedObjectGet函数对一个共享对象进行引用),然而在调用线程或调用对象中,共享对象不能引用任何对象。

里面的这一句:“在调用线程或调用对象中,共享对象不能引用任何对象” 指的是什么? 是否说这个共享对象只能调用自己的一些方法或引用自己的实例变量之类的,并不能引用其它类的服务?


求高手解答。 不甚感激。
...全文
1423 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
提前十分钟 2013-02-06
  • 打赏
  • 举报
回复
线程中使用全局变量,为什么全局变量总是动态的自己改变值,不知道这个全局变量为什么会自己改变值,挺无语的,但在线程中使用局部变量,一切就没有问题,一句话,无语
liu_jie_1 2012-11-17
  • 打赏
  • 举报
回复
引用 2 楼 xiajinxian 的回复:
是指他是一个独立的线程... 如:SQLCA 等全局变量也是相互独立的 如果主子线程要传值只能传输一些基本的变量,如:string,int,structure等,其它复杂的对象就传不了,如:datawindow等
如果不采用全局变量作为主子线程均能访问的存储空间,如何进行主子线程之间的传值?
liu_jie_1 2012-11-17
  • 打赏
  • 举报
回复
我的问题弄清楚了,问题出在线程的堵塞:采用的窗口与组件之间的消息互动时都使用的send() 同步消息, 因为同步消息只有等待该消息被处理了之后 才会继续运行下去 , 所以存在形成环状消息链的可能,然后就造成了线程堵塞 。 解决的方案是: 窗口接受消息之后不马上send 出消息,而是post消息给窗口本身,而post的消息事件中再进行send消息给组件, 这样就绕过了环状消息链的问题。 感谢各位的解答, 特别是
引用 3 楼 gaoqiangz 的回复:
http://blog.csdn.net/gaoqiangz/article/details/6682895
这个帖子学到了不少东西。
引用 4 楼 lzp_lrp 的回复:
你可以引用全局变量,通过全局变量进行控制
的确采用的是使用全局变量接受共享变量的实例,这样共享变量基本可以操作所有资源,包括引用其它的对象。
WorldMobile 2012-11-16
  • 打赏
  • 举报
回复
你可以引用全局变量,通过全局变量进行控制
A啦Dbit 2012-11-15
  • 打赏
  • 举报
回复
是指他是一个独立的线程... 如:SQLCA 等全局变量也是相互独立的 如果主子线程要传值只能传输一些基本的变量,如:string,int,structure等,其它复杂的对象就传不了,如:datawindow等

740

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 脚本语言
社区管理员
  • 脚本语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧