pb 多线程的问题

zhanghua_1228 2009-04-28 09:05:25
我写了个pb的多线程的例子,就一个窗口,窗口里面是个进度条,
打开线程后,进度条就不停的在走。也达到多线程的目的,在窗口上做操作都没引响
不过在拖动窗口时,进度条会停下来,放掉之后也没一下子走一大段,也就是说线程也给停下了,这是为什么呢
用c写的多线程就没有这个情况
...全文
418 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
lujun1324 2011-08-05
  • 打赏
  • 举报
回复
up!up!看高手,学高手,变高手!
zhanghua_1228 2009-04-30
  • 打赏
  • 举报
回复
终于想到个办法把这个问题都解决
而且发现pb的SharedObjectUnregister并没有完全关掉线程,还要在destroy一下。
pb虽然能做到多线程,但对这多线程所支持的函数太少。所以用起来比较的麻烦,结贴!
zhanghua_1228 2009-04-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 lzp_lrp 的回复:]
你不用全局变量,你不会用全局对象或者其它之类的?

肯定可以实现的
[/Quote]

全局的类,结构体,变量 都是取不到的
WorldMobile 2009-04-30
  • 打赏
  • 举报
回复
你不用全局变量,你不会用全局对象或者其它之类的?

肯定可以实现的
zhanghua_1228 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sinlan 的回复:]
引用 11 楼 zhanghua_1228 的回复:
引用 8 楼 sinlan 的回复:
最近刚好做这个,不知道楼主的子线程怎么主窗口发送进度消息
我用的是sharedobjectregister创建线程,用send()向主窗口发送进度消息(这可是我花了几天时间弄出来的,那个累啊...)
楼主能不能不你的方案拿出来分享一下?


自己写一个类做为一个通讯的类


能说一下主要用到哪些东西吗?
[/Quote]

你看一下这个例子
http://www.builder.com.cn/2007/1023/575138.shtml
他里面是怎么向主窗口发送信息的
sinlan 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhanghua_1228 的回复:]
引用 8 楼 sinlan 的回复:
最近刚好做这个,不知道楼主的子线程怎么主窗口发送进度消息
我用的是sharedobjectregister创建线程,用send()向主窗口发送进度消息(这可是我花了几天时间弄出来的,那个累啊...)
楼主能不能不你的方案拿出来分享一下?


自己写一个类做为一个通讯的类
[/Quote]

能说一下主要用到哪些东西吗?
WorldMobile 2009-04-29
  • 打赏
  • 举报
回复
用个全局变量之类的东东gb_exit = false

do while tru
if gb_exit then exit
loop

然后在程序里赋值结gb_exit
zhanghua_1228 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sinlan 的回复:]
最近刚好做这个,不知道楼主的子线程怎么主窗口发送进度消息
我用的是sharedobjectregister创建线程,用send()向主窗口发送进度消息(这可是我花了几天时间弄出来的,那个累啊...)
楼主能不能不你的方案拿出来分享一下?
[/Quote]

自己写一个类做为一个通讯的类
zhanghua_1228 2009-04-29
  • 打赏
  • 举报
回复
现在呢,我这个拖动会停住这个问题是解决了,
原线程里面我是调用一个我写的通讯的类的函数来确定是否要停,在拖动窗口的时候这个类的函数定下了,导至线程停下
如果在线程里不做判断,就可以了,不过也出现个问题,线程关不掉,有冰刃看,线程一直在运行,
SharedObjectUnregister函数返回是成功的,但线程还在,是不是因为线程内就是一个do while true 的死循环的原因?
zhanghua_1228 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 sinlan 的回复:]
这个啊,看了,他这个主线程向子线程索取当前进度,而非子线程主动向主线程发送当前进度
当子线程正在做一项工作,会造成子线程无响应(比如打开某个硬件设备),这时候如果主线程向子现成索取进度,那么主线程也会处于无响应状态
而子线程主动向主线程发送当前进度就不会发生类似的问题了.
[/Quote]

。。。。。
他不是‘主线程向子线程索取当前进度’,而是 uo_thread线程向中间类uo_argv发送个消息,uo_argv再向窗口发送当前的进度
所有的消息都是从低向高发送的,你再看下
sinlan 2009-04-29
  • 打赏
  • 举报
回复
这个啊,看了,他这个主线程向子线程索取当前进度,而非子线程主动向主线程发送当前进度
当子线程正在做一项工作,会造成子线程无响应(比如打开某个硬件设备),这时候如果主线程向子现成索取进度,那么主线程也会处于无响应状态
而子线程主动向主线程发送当前进度就不会发生类似的问题了.
zhanghua_1228 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lzp_lrp 的回复:]
用个全局变量之类的东东gb_exit = false

do while tru
if gb_exit then exit
loop

然后在程序里赋值结gb_exit
[/Quote]

这个是不行的
线程里是可以取不到全局变量的值
你在程序里改gb_exit = false
但线程里gb_exit还是他的初始值
WorldMobile 2009-04-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhanghua_1228 的帖子:]
我写了个pb的多线程的例子,就一个窗口,窗口里面是个进度条,
打开线程后,进度条就不停的在走。也达到多线程的目的,在窗口上做操作都没引响
不过在拖动窗口时,进度条会停下来,放掉之后也没一下子走一大段,也就是说线程也给停下了,这是为什么呢
用c写的多线程就没有这个情况
[/Quote]

放掉之后也没一下子走一大段,也就是说线程也给停下了,如果真的没有走一大段,那线程应该是停了

不知道你用的什么方法来实现的多线程,建议你用PB的timing控件,用timer事件的话,做不出多个线程了,用N个timing控件,可以模拟出多线程的效果
zhanghua_1228 2009-04-28
  • 打赏
  • 举报
回复
如果写成多线程应该怎么写
rightyeah 2009-04-28
  • 打赏
  • 举报
回复
是用timer事件吧
timer事件是可以被合并的。
当窗口在拖动的时候,窗口上的事件被阻塞,多个timer事件就会在消息队列里面合并成一个。
zhanghua_1228 2009-04-28
  • 打赏
  • 举报
回复
问题就是 他没走一大段 还是在原来停的地方继续走
hxbkkk 2009-04-28
  • 打赏
  • 举报
回复
在拖动窗口时,进度条会停下来,放掉之后也没一下子走一大段m,证明还是在动,只是窗口没有刷新而已
hxbkkk 2009-04-28
  • 打赏
  • 举报
回复
这个要看你的代码了
sinlan 2009-04-28
  • 打赏
  • 举报
回复
最近刚好做这个,不知道楼主的子线程怎么主窗口发送进度消息
我用的是sharedobjectregister创建线程,用send()向主窗口发送进度消息(这可是我花了几天时间弄出来的,那个累啊...)
楼主能不能不你的方案拿出来分享一下?
desegou 2009-04-28
  • 打赏
  • 举报
回复
PB不支持多线程,如果进度条要中断可以用yield函数实现
加载更多回复(1)

1,075

社区成员

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

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