在运行环境下运行正常,但编译后不能正常运行(PB9.0)

时间:2022-04-06 23:46:47
程序是多线程,我跟踪发现,在运行第一个线程的时候正常,运行第二个的时候,在代码:
SharedObjectRegister("uo_thread",ls_thread)
的地方就不运行了(程序就卡在那里,查看系统进程该程序存在的)

注:
1、在PB编辑环境中没问题,运行正常
2、我已经将Sybase\Shared\PowerBuilder目录下的所有XXX.dll都拷贝到运行目录

12 个解决方案

#1


试一下定义一个 ErrorReturn 对象,捕获shareobjectregister() 的返回值,看看它是什么。

#2


代码段如下
do while SharedObjectRegister("uo_thread",ls_thread)= SharedObjectExistsError!
i++
messagebox("uo_pbcomm register loop",string(gi_logsequence))
if i>16 then exit
loop
messagebox("","outloop")

运行时即没有进register loop 也没 outloop
但在PB调试中却正常,就是编译后不行

#3


补充:
在循环前面还有一段调试:
messagebox("","start loop")
do while SharedObjectRegister("uo_thread",ls_thread)= SharedObjectExistsError!
。。。。
loop

#4


多线程,不懂,有没有人能单开一贴晒晒PB多线程设计? 

#5


没人指点啊?郁闷中……

#6


大至这样:

int i
ErrorReturn sErr

sErr = SharedObjectRegister("uo_thread",ls_thread) //如果是要用多线程,这里的 ls_thread 必须每次都是不同的值。
do
  i ++
  if sErr = SharedObjectExistsError! then SharedObjectUnregister ( ls_thread)
  sErr = SharedObjectRegister("uo_thread",ls_thread)
loop while i > 3 or sErr <> Success! 



#7


完了以后,还必须要:SharedObjectUnregister ( ls_thread)

#8


两个地方试试:
1,只开一个线程;
2,不要以Machine code(DLL) 方式编译程序,改用Pcode (PBD) 方式编译。

#9


帮忙顶下。。。。

#10


感谢wag_enu!
ls_thread每次运行是不同的,循环之前有代码段 ls_thread=ls_thread+string(i++)
现在回答你的两个问题:
1、只开一个是没有问题的
2、编译为pbd是没有问题的

但编译成dll就在创建第二个线程的地方锁住,即不报错也不运行。

#11


前两天测试过了,编译为PBD 没问题是偶然试一下知道的。查了一通帮助,没有看到DLL 和PBD 的具体比较。

编译成DLL 和你的现象一样第二次注册就卡住了,PB 处理多线程本来就不强的。

#12


既然如此,那只好结帖了,多谢!

#1


试一下定义一个 ErrorReturn 对象,捕获shareobjectregister() 的返回值,看看它是什么。

#2


代码段如下
do while SharedObjectRegister("uo_thread",ls_thread)= SharedObjectExistsError!
i++
messagebox("uo_pbcomm register loop",string(gi_logsequence))
if i>16 then exit
loop
messagebox("","outloop")

运行时即没有进register loop 也没 outloop
但在PB调试中却正常,就是编译后不行

#3


补充:
在循环前面还有一段调试:
messagebox("","start loop")
do while SharedObjectRegister("uo_thread",ls_thread)= SharedObjectExistsError!
。。。。
loop

#4


多线程,不懂,有没有人能单开一贴晒晒PB多线程设计? 

#5


没人指点啊?郁闷中……

#6


大至这样:

int i
ErrorReturn sErr

sErr = SharedObjectRegister("uo_thread",ls_thread) //如果是要用多线程,这里的 ls_thread 必须每次都是不同的值。
do
  i ++
  if sErr = SharedObjectExistsError! then SharedObjectUnregister ( ls_thread)
  sErr = SharedObjectRegister("uo_thread",ls_thread)
loop while i > 3 or sErr <> Success! 



#7


完了以后,还必须要:SharedObjectUnregister ( ls_thread)

#8


两个地方试试:
1,只开一个线程;
2,不要以Machine code(DLL) 方式编译程序,改用Pcode (PBD) 方式编译。

#9


帮忙顶下。。。。

#10


感谢wag_enu!
ls_thread每次运行是不同的,循环之前有代码段 ls_thread=ls_thread+string(i++)
现在回答你的两个问题:
1、只开一个是没有问题的
2、编译为pbd是没有问题的

但编译成dll就在创建第二个线程的地方锁住,即不报错也不运行。

#11


前两天测试过了,编译为PBD 没问题是偶然试一下知道的。查了一通帮助,没有看到DLL 和PBD 的具体比较。

编译成DLL 和你的现象一样第二次注册就卡住了,PB 处理多线程本来就不强的。

#12


既然如此,那只好结帖了,多谢!