搜索
aardio官方社区 门户 查看主题

多线程操控进度条不成功

发布者: ltmf | 发布时间: 2015-1-6 13:48| 查看数: 3576| 评论数: 3|帖子模式

import win.ui;
/*DSG{{*/
var winform = ..win.form(text="用plus控件创建进度条演示";right=492;bottom=254;image=$"\res\bg.jpg";max=false;parent=...)
winform.add(
button={cls=
"button";text="button";left=336;top=164;right=391;bottom=217;z=2};
progress={cls=
"plus";text="100% ";left=124;top=99;right=382;bottom=123;align="right";background="\res\progress-bg.jpg";color=99525;foreground="\res\progress.jpg";foreLeft=24;foreRepeat="expand";notify=1;z=1}
)
/*}}*/

/*
1、背景、前景图显示模式设为"expand"九宫格拉伸
2、然后用下面的函数指定调整范围。
*/

winform.progress.setProgressRange(1,60)
winform.button.oncommand =
function(id,event){  
    winform.progress.progressPercentage=0;
    fun=
function(phwnd){        
        
import win.ui.ctrl.plus
        progress= win.ui.ctrl.plus()
        process.hwnd=phwnd
        
for(i=1;60;1){
            
var finished =progress.stepProgress(1,false);
            
if( !finished ) progress.text = "已完成 "   
            win.delay(50)
        }
    }   
    thread.create(fun,winform.progress.hwnd)
}
//进度改变时会触发下面的函数,注意前景图的九宫格切图左边界应当指定为显示 1% 的宽度
winform.progress.onPosChanged = function( pos ){
    winform.progress.text =  winform.progress.progressPercentage +
"% "
}
winform.show()
win.loopMessage();

最新评论

roger 发表于 2015-1-6 14:18:16

plus控件没有这种用法,这么复杂的代码你是怎么研究出来的?! 除非你一次也没有用过aardio,不然aardio向导生成的示例代码里就有这些东西,很简单的

plus控件没有这种用法,这么复杂的代码你是怎么研究出来的?!
除非你一次也没有用过aardio,不然aardio向导生成的示例代码里就有这些东西,很简单的,
用 thread.command 响应线程使命令就可以自由控制界面上的控件。

正是因为有 thread.command,aardio里的多线程开发才会简洁高效,避免了复杂的同步问题。
在aardio里做多线程开发而不用 thread.command 那是在不必要的自寻烦恼。
import win.ui;
/*DSG{{*/
mainForm = ..win.form(text=
"aardio Form";right=599;bottom=399)
mainForm.add(
progress={cls=
"progress";left=25;top=38;right=558;bottom=68;edge=1;max=100;min=0;z=1}
)
/*}}*/

import thread.command;
var listener = thread.command();
listener.stepProgress =
function(){
    mainForm.progress.stepIt();
//响用线程命令
}

//创建工作线程
thread.invoke(

   
function(){  
        
import thread.command;
        
        
for(i=1;100;1){
            thread.command.stepProgress();
//调用线程命令
            sleep(100)
        }
    }
);

mainForm.show()
win.loopMessage();

ltmf 发表于 2015-1-6 18:02:18

[i=s] 本帖最后由 ltmf 于 2015-1-6 18:05 编辑 [/i] [quote][size=2][url=forum.php?mod=red

本帖最后由 ltmf 于 2015-1-6 18:05 编辑
roger 发表于 2015-1-6 14:18
plus控件没有这种用法,这么复杂的代码你是怎么研究出来的?!
除非你一次也没有用过aardio,不然aardio向导 ...


谢谢,确实是我想得太复杂了,要控制它,只要让它步进就可以了。以下是我用自定义消息做的,请指正。另外用您教的方法也已操控“plus进度条”成功,再次感谢。
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = ..win.form(text="进度条";right=346;bottom=203;max=false;parent=...)
  4. winform.add(
  5. button={cls="button";text="button";left=137;top=101;right=192;bottom=154;z=2};
  6. progress={cls="plus";text="100% ";left=39;top=42;right=297;bottom=66;align="right";background="\res\progress-bg.jpg";color=99525;foreground="\res\progress.jpg";foreLeft=24;foreRepeat="expand";notify=1;z=1}
  7. )
  8. /*}}*/

  9. winform.wndproc = function(hwnd,message,wParam,lParam){
  10.         select( message ) {
  11.                 case  0x401/*_WM_MYMESSAGEBOX*/{
  12.                         //接到消息就步进一次
  13.                         winform.progress.stepProgress(1);
  14.                 }
  15.         }
  16.         //无返回值则继续调用默认回调函数
  17. }
  18. winform.progress.setProgressRange(1,60)
  19. winform.button.oncommand = function(id,event){       
  20.         winform.progress.progressPercentage=0;
  21.         fun=function(hwnd){
  22.                 import win       
  23.                 for(i=1;60;1){
  24.                         //需要步进时给主窗体发一个消息
  25.                         ::SendMessage(hwnd, 0x401/*_WM_MYMESSAGEBOX*/);       
  26.                         win.delay(50)
  27.                 }
  28.         }
  29.         thread.create(fun,winform.hwnd)
  30. }
  31. winform.progress.onPosChanged = function( pos ){
  32.         winform.progress.text =  winform.progress.progressPercentage + "% "
  33. }
  34. winform.show()
  35. win.loopMessage();
复制代码
roger 发表于 2015-1-7 10:03:48

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=68612&ptid=12738][c

ltmf 发表于 2015-1-6 18:02
谢谢,确实是我想得太复杂了,要控制它,只要让它步进就可以了。以下是我用自定义消息做的...
最好不要用自定义消息,
如果程序里比较多的自定义消息ID会把代码逻辑搞的很乱,维护扩展也不方便。
例如其他地方不小心用了0x401的消息ID呢?或者发送消息时希望增加更多参数获取一个返回的字符串呢?这都很麻烦。

其实用 thread.command 代码更简洁,
thread.command 是响应式编程,不需要去维护管理一个窗口句柄,发送命令不需要关心是谁在接收,任何线程的代码都可以自由订阅消息响应命令,把线程间的交互转化成简单的函数调用,可以传入参数获取返回值等等,非常方便。

你只要简单的按开发工具的生成的范例去做就行了。

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2017-9-25 19:23 , Processed in 0.093750 second(s), 18 queries , WinCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表