请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
查看: 4490|回复: 10

WEB窗口中怎么使用多线程

[复制链接]

2

主题

8

帖子

8

积分
交易币
0

新手入门

Rank: 1

发表于 2016-2-25 20:12:32 | 显示全部楼层 |阅读模式
本帖最后由 xiaohac 于 2016-2-25 20:18 编辑

请问 WEB窗口中怎么使用多线程啊,代码中控制不了啊,只懂控制外部浏览器。
[aardio] 纯文本查看 复制代码
import winex
import web.access;
hwndIE = winex.findEx(,,"Internet Explorer_Server" )
assert(hwndIE,"请先打开IE浏览器,然后再运行本程序!") 
wb = web.access( hwndIE )


我现在猜是不是要先获得窗口句柄?那是不是又在走控制外部浏览器的老路了?

[aardio] 纯文本查看 复制代码
import win.ui;
import thread.manage
/*DSG{{*/
var winform = ..win.form(text="Web Form";right=599;bottom=399)
winform.add(
button={cls="button";text="button";left=513;top=361;right=578;bottom=393;z=1}
)
/*}}*/
xiancheng=thread.manage()

import web.form; 
var wb = web.form( winform );
wb.go("http://www.baidu.com") 
winform.show(); 
wb.wait("");
xiancheng1=function(){
import win.ui
import web.form
var ele = wb.getEle("kw")  //王百度的搜索框里填单
ele.value = "输入新的值"        
}
winform.button.oncommand = function(id,event){
        //winform.msgbox( winform.button.text );
        xiancheng.create(xiancheng1)//启动线程
}

win.loopMessage();
return winform,wb;

求通过这个简易的例子,让脑筋转个弯。
回复

使用道具 举报

14

主题

172

帖子

595

积分
交易币
0

编程三段

Rank: 4

发表于 2016-2-25 20:20:16 | 显示全部楼层
在aa中无法同时开多个线程操作多个web。至今没见过
回复 支持 反对

使用道具 举报

2

主题

8

帖子

8

积分
交易币
0

新手入门

Rank: 1

 楼主| 发表于 2016-2-25 20:37:36 | 显示全部楼层
micksoft 发表于 2016-2-25 20:20
在aa中无法同时开多个线程操作多个web。至今没见过

就是说 WEB窗口中 没有 多线程 这回事是吗?
回复 支持 反对

使用道具 举报

14

主题

172

帖子

595

积分
交易币
0

编程三段

Rank: 4

发表于 2016-2-25 20:39:11 | 显示全部楼层
xiaohac 发表于 2016-2-25 20:37
就是说 WEB窗口中 没有 多线程 这回事是吗?

aa里没有找到
回复 支持 反对

使用道具 举报

2

主题

8

帖子

8

积分
交易币
0

新手入门

Rank: 1

 楼主| 发表于 2016-2-25 20:56:18 | 显示全部楼层

您看,我在请教下,现在有ABC三个按钮。现在我想做一个循环,执行A—B—C—A—。。。。这个循环。但是A代码和C代码都需要运行一段时间后才切换。之前转多线程的牛角尖了,请问下师傅有什么思路呢?
[aardio] 纯文本查看 复制代码
import win.ui;
/*DSG{{*/
var winform = ..win.form(text="Web Form";right=599;bottom=399)
winform.add(
button={cls="button";text="button";left=359;top=367;right=424;bottom=399;z=1};
button2={cls="button";text="button2";left=429;top=367;right=494;bottom=399;z=2};
button3={cls="button";text="button3";left=499;top=367;right=564;bottom=399;z=3}
)
/*}}*/
import web.form; 
var wb = web.form( winform );

wb.go("http://www.baidu.com") 
winform.show(); 
wb.wait("");

winform.button.oncommand = function(id,event){
	//winform.msgbox( winform.button.text );
	winform.button3.text="停止"
	do{
	if(winform.button3.text="已停止")
	break ;
	//A操作web代码
	}while(win.delay(1000))
}

winform.button2.oncommand = function(id,event){
	//winform.msgbox( winform.button2.text );
	winform.button3.text="停止"
	do{
	if(winform.button3.text="已停止")
	break ;
	//C操作web代码
	}while(win.delay(1000))	
}

winform.button3.oncommand = function(id,event){
	//winform.msgbox( winform.button3.text );
	winform.button3.text="已停止"
	//B为停止代码

}

//启动消息循环
win.loopMessage();
return winform,wb;
回复 支持 反对

使用道具 举报

14

主题

172

帖子

595

积分
交易币
0

编程三段

Rank: 4

发表于 2016-2-25 21:49:09 | 显示全部楼层
本帖最后由 micksoft 于 2016-2-25 22:02 编辑

[aardio] 纯文本查看 复制代码
import win.ui;
/*DSG{{*/
var winform = ..win.form(text="Web Form";right=599;bottom=399)
winform.add(
button={cls="button";text="button";left=359;top=367;right=424;bottom=399;z=1};
button2={cls="button";text="button2";left=429;top=367;right=494;bottom=399;z=2};
button3={cls="button";text="button3";left=499;top=367;right=564;bottom=399;z=3}
)
/*}}*/
import web.form; 
var wb = web.form( winform );
wb.html = /**
<!doctype html>
<html>
<body>
</body>
</html>
**/
winform.show(); 
winform.button.oncommand = function(id,event){
    winform.button3.text="停止"
    for(i=1;100;1){
        if(winform.button3.text="已停止"){winform.msgbox("1")
            break ;
        }
        wb.document.writeln("1")
   		win.delay(100) 
    }
}
winform.button2.oncommand = function(id,event){
    winform.button3.text="停止"
    for(i=1;100;1){
        if(winform.button3.text="已停止"){winform.msgbox("2")
            break ;
        }
        wb.document.writeln("2")
    	win.delay(100) 
    }
}
winform.button3.oncommand = function(id,event){
    winform.button3.text="已停止"
}
win.loopMessage();
return winform,wb;


以上面代码运行猜测如下
当第一个按钮点击后执行第一按钮内的循环,点击第二按钮后,执行第二个按钮内的循环,第二循环执行完,第一个循环继续执行。
所以想以这种方式同时操作web是不可能的
回复 支持 反对

使用道具 举报

2

主题

8

帖子

8

积分
交易币
0

新手入门

Rank: 1

 楼主| 发表于 2016-2-25 22:45:03 | 显示全部楼层
本帖最后由 xiaohac 于 2016-2-25 22:47 编辑

老师傅您说的对,我不转牛角尖了,我改了下,可以变相自动循环

[aardio] 纯文本查看 复制代码
winform.button.oncommand = function(id,event){
	//winform.msgbox( winform.button.text );
		计数=1
	do{
	if(计数=5)
	break ;
	计数=计数+1
	//A操作web代码
	}while(win.delay(1000))
}

winform.button2.oncommand = function(id,event){
	//winform.msgbox( winform.button2.text );
	计数=1
	do{
	if(计数=10)
	break ;
	计数=计数+1
	//C操作web代码
	}while(win.delay(1000))	
}

winform.button3.oncommand = function(id,event){
	//winform.msgbox( winform.button3.text );
do{
winform.button.oncommand()
win.delay(1000)
winform.button2.oncommand()
win.delay(1000)
}while(win.delay(1000))

}

回复 支持 反对

使用道具 举报

2

主题

8

帖子

8

积分
交易币
0

新手入门

Rank: 1

 楼主| 发表于 2016-2-25 22:49:47 | 显示全部楼层
micksoft 发表于 2016-2-25 21:49
[mw_shl_code=aardio,true]import win.ui;
/*DSG{{*/
var winform = ..win.form(text="Web Form";right=599; ...

赞一下老师傅,现在我有个清楚的思路了
回复 支持 反对

使用道具 举报

2

主题

118

帖子

99

积分
交易币
0

编程一段

Rank: 2

发表于 2016-2-25 22:57:45 | 显示全部楼层
基础的概念没有搞清楚,
任何程序里都可以用创建多线程,

你的问题并不是能不能用多线程,
而是纠结怎么在多个线程里去操作同一个界面对象。

多线程就相当于很多火车,你想坐哪个线程就坐哪个线程,
但是你希望把一条腿放到去北京的火车上,把另一条腿放到去南京的火车上,这在aardio里是行不通的。
真的允许你这样做的多线程开发工具,死锁同步的问题估计会把一个新手搞死。

----------------

为什么不能用 web.access, 原理如上,跨线程操作同一界面对象不稳定。

----------------

另外你上面的代码来看,你真正需要的并不是多线程。
如果你只是希望执行个异步任务、循环什么的,用定时器就可以。
例如 winform.addtimer, winform.setTimeOut 这些函数都可以创建异步任务。

例如浏览器里的JS,就只能运行在多线程里,
这不等于网页脚本里就不能有循环,不能创建动画这些。
这跟多线程没有关系,也不需要多线程。

另外,不要经常写下面这种代码:
while(...){
        win.delay(...)
}
win.delay不是异步的,正确的应当用winform.setTimeOut之类。
回复 支持 反对

使用道具 举报

2

主题

118

帖子

99

积分
交易币
0

编程一段

Rank: 2

发表于 2016-2-25 23:15:19 | 显示全部楼层
多线程的教程里挺多这种例子,其实很简单,没什么好纠结的:
import win.ui;
/*DSG{{*/
var winform = win.form(text="WebForm中使用多线程";right=599;bottom=399)
/*}}*/

import web.form;
var wb = web.form( winform );

wb.html =
/**
<!doctype html>
<html>
<head>
    <meta charset="gb2312">
</head>
<body>
    <div id="a" style="background:#0F0;color:#F00;"></div>
    <div id="b" style="background:#00F;color:#FFF;"></div>
</body>
</html>
**/

winform.show();

//在界面线程定义工作线程可以调用的函数
import thread.command;
with thread.command.instance(){
    updateA =
function(i){
        wb.getEle(
"a").innerText = tostring(i)
    }
    updateB =
function(i){
        wb.getEle(
"b").innerText = tostring(i)  
    }   
}

//创建工作线程A
thread.invoke(
   
function(){
        
import thread.command;
        
        
for(i=1000;2000;1){
            
//调用界面线程的函数 updateA
            thread.command.updateA(i);
            
sleep(100);
        }
    }
)

//创建工作线程A
thread.invoke(
   
function(){
        
import thread.command;
        
        
for(i=2000;1000;-1){
            
//调用界面线程的函数 updateB
            thread.command.updateB(i);
            
sleep(100);
        }
    }
)

win.loopMessage();


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



GMT+8, 2021-4-15 02:00 , Processed in 0.132667 second(s), 36 queries .

© 2001-2011 Powered by Discuz! X3.2.

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