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

 找回密码
 立即注册
查看: 2970|回复: 4

多线程任务派发问题

[复制链接]

4

主题

14

帖子

37

积分
交易币
0

新手入门

Rank: 1

发表于 2015-7-30 10:41:50 | 显示全部楼层 |阅读模式
AAUTO的多线程任务派发,不是很了解,所以做了一个测试文件,现在有一个问题就是任务执行到一定的时候他会自动停止,不知道是什么原因?代码也没有报错。
[aardio] 纯文本查看 复制代码
import win.ui;
/*DSG{{*/
mainForm = ..win.form(text="多线程任务分派";right=599;bottom=399)
mainForm.add(
btnPause={cls="button";text="暂停";left=134;top=9;right=242;bottom=35;z=3};
btnStart={cls="button";text="开始";left=9;top=9;right=117;bottom=35;z=2};
btnStop={cls="button";text="停止";left=259;top=9;right=367;bottom=35;z=4};
edit={cls="edit";left=8;top=42;right=590;bottom=383;db=1;dl=1;dr=1;dt=1;edge=1;multiline=1;vscroll=1;z=1}
)
/*}}*/

import thread.works;
import thread.command;
var listener = thread.command();
listener.print = function(...){
	mainForm.edit.print(...);
}

//线程共享表
import thread.table;
var tab = thread.table("table")
tab.set("ispass", true);



io.open();
//线程多任务分派
var works = thread.works(3, 
	function(title){
		import win;
		import thread.command;
		import thread.table;
		
		var tab = thread.table("table");
		var ispass = tab.get("ispass");
		
		for(i=1;10;1){
			thread.command.print(title, "________线程运行位置【"++i++"】");
			win.delay(10);
			if( !ispass ){
				thread.command.print(title, "-------------本次任务被停止---------------");
				return ; 
			}
		}
		thread.command.print(title, "++++++++++本次任务完成+++++++");
	}
);

mainForm.btnPause.disabled = true;
mainForm.btnStop.disabled = true;

//开始任务
mainForm.btnStart.oncommand = function(id,event){
	//mainForm.msgbox( mainForm.btnStart.text );
	mainForm.btnStart.disabled = true;
	mainForm.btnPause.disabled = false;
	mainForm.btnStop.disabled = false;
	
	
	for(i=1;100;1){
		if( works.queueCount() > 5 ){
			mainForm.edit.print("===============等待中==============");
			works.wait();
		}
		
		if( !tab.get("ispass") ){
			break ;
		}
		
		mainForm.edit.print("任务派发中...");
		works.push("工作线程【"++ i ++ "】");
		win.delay(10);
		
		
	}
	works.waitClose();
	
	mainForm.btnStart.disabled = false;
	mainForm.btnPause.disabled = true;
	mainForm.btnStop.disabled = true;
}

//暂停任务
mainForm.btnPause.oncommand = function(id,event){
	//mainForm.msgbox( mainForm.btnPause.text );
	if( mainForm.btnPause.text == "暂停"){
		mainForm.btnPause.text = "继续";
		works.suspend();
	}else{
		mainForm.btnPause.text = "暂停";
		works.resume();
	}	
}
//结束任务
mainForm.btnStop.oncommand = function(id,event){
	//mainForm.msgbox( mainForm.btnStop.text );
	//判断线程是否暂停状态
	if( mainForm.btnPause.text == "继续" ){
		mainForm.btnPause.text = "暂停";
		works.resume();
	}
	tab.set("ispass", false);
	mainForm.btnStart.disabled = false;
	mainForm.btnPause.disabled = true;
	mainForm.btnStop.disabled = true;
	
}

mainForm.show();
return win.loopMessage(); 

QQ截图20150730104113.png

回复

使用道具 举报

14

主题

172

帖子

595

积分
交易币
0

编程三段

Rank: 4

发表于 2015-7-30 11:00:23 | 显示全部楼层
好像是edit的字符长度有限制,所以没显示出来
回复 支持 反对

使用道具 举报

4

主题

14

帖子

37

积分
交易币
0

新手入门

Rank: 1

 楼主| 发表于 2015-7-30 11:17:44 | 显示全部楼层
micksoft 发表于 2015-7-30 11:00
好像是edit的字符长度有限制,所以没显示出来

应该不是吧,如果是字符长度有限制,不应该线程也全部停止了。
回复 支持 反对

使用道具 举报

4

主题

14

帖子

37

积分
交易币
0

新手入门

Rank: 1

 楼主| 发表于 2015-7-30 15:17:19 | 显示全部楼层
本帖最后由 壹毛 于 2015-7-30 16:10 编辑

[aardio] 纯文本查看 复制代码
import win.ui;
/*DSG{{*/
mainForm = ..win.form(text="多线程任务分派";right=599;bottom=399)
mainForm.add(
btnPause={cls="button";text="暂停";left=134;top=9;right=242;bottom=35;z=2};
btnStart={cls="button";text="开始";left=9;top=9;right=117;bottom=35;z=1};
btnStop={cls="button";text="停止";left=259;top=9;right=367;bottom=35;z=3};
edit={cls="richedit";left=-1;top=40;right=599;bottom=399;multiline=1;vscroll=1;z=4}
)
/*}}*/
import thread.works;
import thread.command;
var listener = thread.command();
listener.print = function(...){
        mainForm.edit.print(...);
}
//线程共享表
import thread.table;
var tab = thread.table("table")
tab.set("ispass", true);

io.open();
//线程多任务分派
var works = thread.works(10, 
        function(title){
                import win;
                import thread.command;
                import thread.table;
                
                var tab = thread.table("table");
                
                for(i=1;100;1){
                        thread.command.print(title, "________线程运行位置【"++i++"】");
                        win.delay(100);
                        if( !tab.get("ispass") ){
                                thread.command.print(title, "-------------本次任务被停止---------------");
                                return ; 
                        }
                }
                thread.command.print(title, "++++++++++本次任务完成+++++++");
        }, 100
);

mainForm.btnPause.disabled = true;
mainForm.btnStop.disabled = true;

//开始任务
mainForm.btnStart.oncommand = function(id,event){
        //mainForm.msgbox( mainForm.btnStart.text );
        mainForm.btnStart.disabled = true;
        mainForm.btnPause.disabled = false;
        mainForm.btnStop.disabled = false;
        [color=#000][font=Consolas,]tab.set("ispass",true);[/font][/color]
        for(i=1;100;1){
                if( works.queueCount() > 5 ){
                        mainForm.edit.print("===============等待中==============");
                        win.delay(100);
                        works.wait();
                }
                
                if( !tab.get("ispass") ){
                        break ;
                }
                
                mainForm.edit.print("任务派发中...");
                works.push("工作线程【"++ i ++ "】");
                win.delay(100);
        }
        works.wait();
        
        mainForm.btnStart.disabled = false;
        mainForm.btnPause.disabled = true;
        mainForm.btnStop.disabled = true;
}

//暂停任务
mainForm.btnPause.oncommand = function(id,event){
        //mainForm.msgbox( mainForm.btnPause.text );
        if( mainForm.btnPause.text == "暂停"){
                mainForm.btnPause.text = "继续";
                works.suspend();
        }else{
                mainForm.btnPause.text = "暂停";
                works.resume();
        }        
}
//结束任务
mainForm.btnStop.oncommand = function(id,event){
        //mainForm.msgbox( mainForm.btnStop.text );
        //判断线程是否暂停状态
        if( mainForm.btnPause.text == "继续" ){
                mainForm.btnPause.text = "暂停";
                works.resume();
        }
        tab.set("ispass", false);
        mainForm.btnStart.disabled = false;
        mainForm.btnPause.disabled = true;
        mainForm.btnStop.disabled = true;
}
mainForm.show();
return win.loopMessage(); 


重新完善了一下,改用“richedit”控件,显示正常任务分派正常。
出现一个新的问题:任务被停止后要想再开始任务,开启不起来了。是不是又要重新thread.works线程。

####问题全部解决####
回复 支持 反对

使用道具 举报

2

主题

45

帖子

384

积分
交易币
0

编程二段

Rank: 3Rank: 3

发表于 2015-7-30 16:36:27 | 显示全部楼层
收起来备用了!!!
回复 支持 反对

使用道具 举报

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

本版积分规则



GMT+8, 2021-4-15 01:50 , Processed in 0.073901 second(s), 28 queries .

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

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