关于PB中实现多线程的问题,求教!!!

toytony 2002-12-12 09:46:32
我用SharedObjectRegister ("u_thread" ,"lu_thread" )

SharedObjectGet ( "lu_thread" ,inv_thread )

inv_thread.post uf_connect()

来实现多线程,但有几个问题不知道怎么解决
1:
对于SharedObjectRegister和SharedObjectGet的返回值我应该怎样获得??
它都是Success!这种类型的,我不知道改定义一个什么类型的变量去获得了!-_-!~~~

2:
其中uf_connect()如果带有参数,如uf_connect(ls_test),参数我能用messagebox显
示出来,但是不能使用,只要我一用它们给uf_connect(string )中的局部变量赋值,
进程好像就死掉了(也有可能退出了,我无法判断出来,程序本身并没有死掉)!!!!
...全文
143 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
toytony 2002-12-12
  • 打赏
  • 举报
回复
以上问题已经解决,但是有了新问题

由于要使用inv_thread.post uf_connect()来执行函数,我有什么办法能够得到这个函数的返回值,这种情况也不能使用reference类型的参数获得返回值,系统会出错!



toutou 2002-12-12
  • 打赏
  • 举报
回复
给你一个完整的


SharedObjectGet("share1",inv_Shared)
第一个参数是你在SharedObjectRegister() function中用到的共享名,第二个参数变量为
SharedObjectRegister() 函数 和第一个参数生命的是同一个类。

产生一个新线程:
一个新线程是用SharedObjectRegister函数产生的。但是在这个线程中得到一个异步执行的方法就必须
用Powerscript的 POST语句编码(例如:inv_shared.POST of_primeNumbers(1,1000))。当你执行一个共享对
象方法或函数或是事件时,若是没有POST关键字,引用的脚本就会运行在另一个线程中的方法,等待它结束
才继续运行下一行的代码。当你设置一个方法,它将被加到对象队列中并按顺序执行。大多数情况下,当当
前脚本结束时,方法被执行。因为它的返回值对引用的脚本不可用,故意放到单独的线程中去执行的方法不
应该有返回值,然而,如果它们确实有返回值将被忽略,不会有错误产生。

pb主线程和其他线程之间的通讯:

pb主线程能够在共享对象中直接执行一个方法(通过用由SharedObjectGet 函数建立的引用变量),但是
在调用线程时,共享对象甚莫都不能引用,调用对象时也是一样。为了解决这一限制,建立了接口对象,通
过引用它来传递共享对象。这种接口对象用来在共享对象和调用线程(pb主线程)之间提供接口(或通讯)。
接口对象的简单形式或许只有一个方法,它用来给frame's microhelp area(of_microhelpMsg(string))传递
一个字符串告诉用户已经完成了操作。
作为例子让我们再来看一下 of_primeNumbers 这个函数。我们家了第三个参数(一个nvo_Intfobj类),
我们用CREAT实例化这个在pb主线程中的nvo_Intfobj接口对象并用引用变量把它传递给of_primeNumbers h函
数作为第三个参数。在of_primeNumbers函数中的最后一个语句将执行街都对象的 of_microhelpMsg函数用一
个字符串告诉用户主要的数字已经计算完了。在这点上,必须有命令按钮或菜单项以便用户单击执行另一个
共享对象函数(of_getPrimeNumbers),这个函数在pb主线程中执行(因此它能返回数据)返回由
of_primeNumbers函数产生的基本数据。
当然,在这个设计中有一个用户接口问题,这需要用户做两件事:开始基本数据计算然后得到计算结果。
为了让基本数据得以计算并返回在只有一个用户交互作用时该怎莫做?
我们不能写一个先执行of_primeNumbers再执行of_getPrimeNumbers的脚本,因为of_primeNumber为了异
步运行必须被POST'ed,因此,of_primeNumbers 在of_getPrimeNumbers执行之前不会结束计算基本数据并返
回值。这个脚本有个时间选择问题。
我们能做的就是为借口对象些一个新方法以能够把数据返回给pb线程和调用对象,请看“返回数据”部
分。

返回数据:
方法of_primeNumbers(1,1000)计算从1到1000的所有奇数,但是,像我们干才学的那样,线程化的方法
不应该有返回值,,因此你或许会问调用脚本是如何获得计算的结果的呢?回答是,通过接口对象。将不得不
写一个新方法(of_returnPrimeNumbers)用来在of_primeNumbers末尾运行并得到of_primeNumbers的结果将
其作为一个参数。of_returnPrimeNUmbers依次会把奇数在调用对现时传递给另一个方法(在这个例子中是:
w_sales).

1. Cb_primeNumbers
2. Post inv_shared.of_primeNumbers(1,1000,inv_IntfObj)
3. Calculates all the prime numbers and saves them to an instance array
4. Post inv_IntfObj.of_returnPrimeNumber() which passes the prime numbers to
5. W_sales.of_returnPrimeNumbers which
6. Populates the DropDownListBox with prime number

图2
让我们描述一下在图2中发生了甚莫?

1.命令按钮cb_primeNumbers 是用户用来单击开始程序的
2.命令按钮cb_primeNumbers 设置了inv_shared.of_primeNumbers 并传递三个参数(包括一个给接口对象的
参数)
3.函数inv_shared.of_primeNumbers计算所有传递给它的参数范围内存在的奇数并把它们存在一个实例数阻

4.函数inv_shared.of_primeNumbers调用函数inv_Intfobj.of_returnPrimeNumbers并把计算好的奇数数组传
递给它
5.函数 w_sales.of_returnPrimeNumbers 作为输入参数的到这些奇数
6.用它们组装下拉列表框

存储空间:
所有的实例化的共享对象用 SharedObjectRegister函数获得他们自己的存储空间,因此,他们只得到他
们的全局变量。共享对象在pb线程中或是任何共享对象线程中不能引用回任何对象。用于共享对象的线程为
应用程序用应用程序对象定义。共享对象会话有自己的应用程序全局变量的副本;然而,用于应用程序对象的
事件并没有被触发。因此,如果你想让共享对象执行任何建立操作(比如说初始化变量),你需要把这些操作
编码到共享对象的构造器事件中,因为应用程序对象的打开和连接开始事件见不会被触发。

方法队列:

作为pb主线程请求一个共享对象服务,这些请求顺序排列以避免可能发生的同时进入。这保证了只有一
个用户能够在固定时刻修改共享对象的内容。
如果想得到的功能是产生两个线程,每一个线程都同时运行一个共享对象方法,用
SharedObjectRegister函数产生两个对象就很必要了(即使它们是同一类)。每个共享对象的到自己的线程
和存储空间,如果它们同时执行,它们每一个都必须分别共享。

总结:

把所有上面提及的条件都考虑进去,典型的变多线程的方法是:

1.用SharedObjectRegister 函数实例化共享对象
2.用SharedObjectGet 函数给共享对象的到引用变量
3.建立一个接口对象,它将提供pb主线程和共享对象线程之间的通讯
4.设置一个方法作执行计算之用并把结果存到共享对象的实例变量里
5.从共享对象执行一个借口对象的方法来得到计算结果并作为参数传回给pb线程和调用对象显示
toytony 2002-12-12
  • 打赏
  • 举报
回复
up!!!!!!!

1,076

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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