As3多线程

As3可以使用多线程加载资源,要求11.4以上,需要导入easyWorker.swc。

下面的例子是子线程上捕获计算机的时间,并将其发送到主线程上并显示:

子线程:

package worker
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.net.registerClassAlias;
import flash.system.MessageChannel;
import flash.system.Worker;
import flash.utils.Timer;
import worker.vo.TimeVo;
/**
* ...
* @author me
*/
public class TimeWorker extends Sprite
{
private var _commandChannel:MessageChannel;
private var _returnChannel:MessageChannel;

public function TimeWorker()
{
init();
}

private function init():void
{
registerClassAlias("worker.vo.TimeVo", TimeVo);
_commandChannel = Worker.current.getSharedProperty("commandChannel") as MessageChannel;
_commandChannel.addEventListener(Event.CHANNEL_MESSAGE, onMessageChannel);
_returnChannel = Worker.current.getSharedProperty("returnChannel") as MessageChannel;
}

private function onMessageChannel(e:Event):void
{
if (!_commandChannel.messageAvailable)
{
return;
}
var message:Array = _commandChannel.receive() as Array;
if (message && message[0] == "start")
{
startTime();
}
}

private var _timer:Timer;
private function startTime():void
{
if (!_timer)
{
_timer = new Timer(1);
_timer.addEventListener(TimerEvent.TIMER, onTimer);
_timer.start();
}
}

private function onTimer(e:TimerEvent):void
{
var date:Date = new Date();
var timeVo:TimeVo = new TimeVo();
timeVo.fromDate(date);
_returnChannel.send(timeVo);
}
}

}

主线程:

package worker
{
import flash.display.Sprite;
import flash.events.Event;
import flash.net.registerClassAlias;
import flash.system.MessageChannel;
import flash.system.Worker;
import flash.system.WorkerDomain;
import flash.system.WorkerState;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.ByteArray;
import worker.vo.TimeVo;
/**
* ...
* @author me
*/
public class BaseWorker extends Sprite
{
[Embed(source = "E://HelloWorld/New Project/bin/TimeWorker.swf", mimeType = "application/octet-stream")]
private static var TimeWorkerSwf:Class;

private var _timeWorker:Worker;
private var _timeWorkerCommandChannel:MessageChannel;
private var _returnChannel:MessageChannel;
private var _timeTxt:TextField;

public function BaseWorker()
{
init();
}

private function init():void
{
registerClassAlias("worker.vo.TimeVo", TimeVo);
_timeWorker = WorkerDomain.current.createWorker(timeWorkerBytes);

_timeWorkerCommandChannel = Worker.current.createMessageChannel(_timeWorker);
_timeWorker.setSharedProperty("commandChannel", _timeWorkerCommandChannel);

_returnChannel = _timeWorker.createMessageChannel(Worker.current);
_returnChannel.addEventListener(Event.CHANNEL_MESSAGE, onMessageChannel);
_timeWorker.setSharedProperty("returnChannel", _returnChannel);

_timeWorker.addEventListener(Event.WORKER_STATE, onWorkerState);
_timeWorker.start();
}

private function initTxt():void
{
_timeTxt = new TextField();
_timeTxt.width = 200;
var tf:TextFormat = new TextFormat();
tf.font = "微软雅黑";
tf.size = 16;
_timeTxt.defaultTextFormat = tf;
_timeTxt.x = stage.stageWidth / 2 - 100;
_timeTxt.y = stage.stageHeight / 2;
addChild(_timeTxt);
}

private function onWorkerState(e:Event):void
{
if (_timeWorker.state == WorkerState.RUNNING)
{
_timeWorkerCommandChannel.send(["start"]);
}
}

private function onMessageChannel(e:Event):void
{
var vo:TimeVo = _returnChannel.receive() as TimeVo;
if (vo)
{
if (!_timeTxt)
{
initTxt();
}
_timeTxt.text = vo.toString();
}
}

private static function get timeWorkerBytes():ByteArray
{
return new TimeWorkerSwf();
}
}

}

TimeVo:

package worker.vo
{
import utils.NumTool;
/**
* ...
* @author me
*/
public class TimeVo
{
private var _year:int;
private var _month:int;
private var _day:int;
private var _hour:int;
private var _minuter:int;
private var _second:int;
private var _millSecond:int;

public function TimeVo(year:int = 0, month:int = 0, day:int = 0, hour:int = 0, minuter:int = 0, second:int = 0, millSecond:int = 0)
{
this.year = year;
this.month = month;
this.day = day;
this.hour = hour;
this.minuter = minuter;
this.second = second;
this.millSecond = millSecond;
}

public function get year():int
{
return _year;
}

public function set year(value:int):void
{
_year = value;
}

public function get month():int
{
return _month;
}

public function set month(value:int):void
{
_month = value;
}

public function get day():int
{
return _day;
}

public function set day(value:int):void
{
_day = value;
}

public function get hour():int
{
return _hour;
}

public function set hour(value:int):void
{
_hour = value;
}

public function get minuter():int
{
return _minuter;
}

public function set minuter(value:int):void
{
_minuter = value;
}

public function get second():int
{
return _second;
}

public function set second(value:int):void
{
_second = value;
}

public function get millSecond():int
{
return _millSecond;
}

public function set millSecond(value:int):void
{
_millSecond = value;
}

public function fromDate(date:Date):void
{
this.year = date.getFullYear();
this.month = date.getMonth() + 1;
this.day = date.getDate();
this.hour = date.getHours();
this.minuter = date.getMinutes();
this.second = date.getSeconds();
this.millSecond = date.getMilliseconds();
}

public function toString():String
{
return year + "." + NumTool.fill(month, 2) + "." + NumTool.fill(day, 2) + " " + NumTool.fill(hour, 2) + ":" + NumTool.fill(minuter, 2) + ":" + NumTool.fill(second, 2) + ":" + this.millSecond;
}
}

}

注意:先编译子线程生成TimeWorker.swf,再嵌入主线程中

转载于:https://www.cnblogs.com/chinayfhuang/p/7656031.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 多线程 M3U8 下载可以通过 `threading` 模块来实现。M3U8 是一种多媒体文件索引格式,用于切割和播放音视频流。使用多线程可以实现同时下载多个片段,提高下载速度。 首先,我们需要导入所需的模块: ```python import requests import threading ``` 接下来,我们可以定义一个下载函数,用于下载 M3U8 文件中的片段。在下载过程中,我们可以将每个片段保存到本地文件,然后再合并成完整的音视频文件。 ```python def download(url, filename): response = requests.get(url) with open(filename, 'wb') as file: file.write(response.content) ``` 然后,我们可以编写一个函数,用于解析 M3U8 文件,并获取其中的片段 URL。 ```python def parse_m3u8(m3u8_url): response = requests.get(m3u8_url) lines = response.text.split('\n') urls = [] for line in lines: if line.startswith('#EXTINF'): url = lines[lines.index(line) + 1] urls.append(url) return urls ``` 最后,我们可以使用多线程进行片段下载。我们可以创建多个线程,每个线程负责下载一个片段。 ```python def main(m3u8_url): urls = parse_m3u8(m3u8_url) threads = [] for i, url in enumerate(urls): filename = f'fragment_{i}.ts' thread = threading.Thread(target=download, args=(url, filename)) threads.append(thread) thread.start() for thread in threads: thread.join() print('文件下载完成!') ``` 调用 `main` 函数,并传入 M3U8 文件 URL 作为参数,即可开始多线程下载。 需要注意的是,多线程下载可能会带来一些问题,如网络不稳定、服务器限制等。因此,在实际使用时,我们可能需要对下载逻辑进行优化,以避免潜在的问题。 以上就是用 Python 实现多线程 M3U8 下载的简单介绍。希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值