AS3 Worker DEMO

说实话,不知为何AS3 Worker DEMO的从使用,与API命名,感觉都是与统传的计算机中的线程的概念,名称,都很不同,初次使用,如果不写个DEMO,真的不知道怎么用;

AS3 Worker DEMO项目

Sender 与 Receiver的合并使用

testWorker.as是文档类用于:Sender 与 Receiver的合并使用;
建议不这么用,因为createMessageChannel的用法,很容易混淆Sender, Receiver;
(只能说API设计得不用好)

分开的Sender类与Receiver类的使用

Worker1.as 与 Worker2.as 分别是,主线程类,与后台线程类的用例;
这样对MessageChannel的理解上会好很多;

其次还有那个:ByteArray.shareable属性的功能,可以共享该bytes内存;
在Worker1.as与Worker2.as下分别断点信息:可以看到send(bytes), bytes = receive() as ByteArray,前、后者的bytes的断点变量地址是不一样的(这个原因是:所在的ApplicationDomain不一样,而表达式视图中,显示的:变量的地址(@xxxxxx)的就会不一样),但在整个进程程序中,他们的内存是一样的,具体看Worker1.as与Worker2.as的用例吧;

功能上与别的一些语言的线程用法、灵活度、功能,是没法比的;
将就一下使用吧。

参考官方Worker 通讯 的在线说明

快速look look大概用上的API简单说明


// worker domain
var workerDomain:WorkerDomain;
var newWorker:Worker = workerDomain.createWorker(null); // 以指定的swf的loaderInfo.bytes来创建,可以是当前主文档类的bytes,但这样写的话,就需要在代码中加这样的判断:Worker.current.isPrimordial来区别是否当前执行时是主线程
var workerList:Vector. = workerDomain.listWorkers(); // 提供对 WorkerDomain 中当前正在运行的 worker(Worker 实例的 state 属性为 WorkerState.RUNNING)集的访问。
WorkerDomain.isSupported; // 判断当前是否支持多线程
WorkerDomain.current; // 对代表代码当前正在其中运行的实例的引用

        // worker
        var worker:Worker = Worker.current; // 对代码当前正在其中运行的 Worker 的引用
        worker.isPrimordial; // 是否主线程
        worker.state == WorkerState.NEW; // 刚刚新建,未运行
        WorkerState.RUNNING; // 运行中
        WorkerState.TERMINATED; // 已结束
        worker.setSharedProperty("testObj", {"test":"TestValue"}); // 设置
        var obj:* = worker.getSharedProperty("testObj");
        worker.start(); // 开始
        worker.terminate(); // 结束
        worker.addEventListener(Event.WORKER_STATE, function(e:Event):void{}); // 为worker的state变化添加监听事件(callback)

        // message channel
        var messageChannel:MessageChannel = worker.createMessageChannel(worker);
        messageChannel;
        var messageChannelState:String = MessageChannelState.OPEN; // 已打开,正在使用
        MessageChannelState.CLOSED; // 已关闭
        MessageChannelState.CLOSING; // 关闭中,但还有剩余的数据正在传输中
        messageChannel.send("test"); // 对接收方式的worker的messagechannel发送数据
        var testStr:String = messageChannel.receive(); // 对发送方的数据接收
        messageChannel.messageAvailable; // 判断当前是否有效数据;
        messageChannel.close(); // 关闭
        messageChannel.addEventListener(Event.CHANNEL_MESSAGE, function(e:Event):void{}); // 当该channel收到数据时触发
        messageChannel.addEventListener(Event.CHANNEL_STATE, function(e:Event):void{}); // 当该channel的state发生变化时触发


        // using Embed swf, create background worker
        /*
        // Embed the SWF file
        [Embed(source="../swfs/BgWorker.swf", mimeType="application/octet-stream")]
        private static var BgWorker_ByteClass:Class;

        private function createWorker():void
        {
            // create the background worker
            var workerBytes:ByteArray = new BgWorker_ByteClass();
            var bgWorker:Worker = WorkerDomain.current.createWorker(workerBytes);

            // listen for worker state changes to know when the worker is running
            bgWorker.addEventListener(Event.WORKER_STATE, workerStateHandler);

            // set up communication between workers using 
            // setSharedProperty(), createMessageChannel(), etc.
            // ... (not shown)

            bgWorker.start();
        }
        */

        // using urlLoader swf, create bgworker
        /*
        // load the SWF file
        var workerLoader:URLLoader = new URLLoader();
        workerLoader.dataFormat = URLLoaderDataFormat.BINARY;
        workerLoader.addEventListener(Event.COMPLETE, loadComplete);
        workerLoader.load(new URLRequest("BgWorker.swf"));

        private function loadComplete(event:Event):void
        {
            // create the background worker
            var workerBytes:ByteArray = event.target.data as ByteArray;
            var bgWorker:Worker = WorkerDomain.current.createWorker(workerBytes);

            // listen for worker state changes to know when the worker is running
            bgWorker.addEventListener(Event.WORKER_STATE, workerStateHandler);

            // set up communication between workers using 
            // setSharedProperty(), createMessageChannel(), etc.
            // ... (not shown)

            bgWorker.start();
        }
        */

demo版本所展示的部分功能: 1、创建窗口 2、设置窗口宽高,标题 3、拖拽边缘缩放窗口,拖拽窗口 4、双击顶端的标题栏,最大化和缩放 5、实现不同的窗口机制 等等……………… core核心包结构初略讲解: IWindow接口:定义所有窗口,并且Window实现了该接口 Module类:模块基类 PopModule类:弹出型环境类,继承Module PopWindow类:弹出型窗口,继承Window Window类:窗口基类 WindowEvent类:窗口事件类 WindowsManager类:窗口管理基类 core核心包实现讲解: 凡是flash cs3中继承Module的元件,都可以直接在元件的第一帧撰写代码,并且在编译的过程中会自动把代码编译出来并继承Module类,在第一帧所拽写的代码可以通过实例化后来访问,比如下面贴出的"控制台源码"就是如此写的 如果需要提供特殊环境等,可以继承Module撰写,比如PopModule,控制台的父类就是PopModule,在控制台的源码中,我们可以看得到他直接访问了window属性,得到的就是控制台所在的窗口对象 Window类实现了基本窗口操作,比如拖拽,关闭,显示等,与WindowManager是配套使用 如果需要更复杂的窗口,可以继承Window类撰写,比如PopWindow,FixedWindow类的父类就是PopWindow,在FixedWindow中,我们只需要把PopWindow的状态和模式定死在window和fixed就可以了,而PopWindow本来就是一个普通的窗口,因此创建Create窗口的时候,直接使用PopWindow即可创建一个普通的窗口,在PopWindow中,默认窗口的状态和模式都为window 核心包是另外一个公司做的。核心代码是反编译过来的。代码经过测试能正常运行。 此代码仅供学习,请勿传播。 flash版窗体系统demo观看地址:http://www.xiaos8.com/uploads/flash/window.swf
### PHP pthreads 的示例代码 PHP 中的 `pthreads` 扩展允许开发者编写多线程应用程序。以下是一个简单的例子,展示了如何使用 `Pool` 类来管理多个线程并获取其返回的结果。 #### 示例:使用 `Pool` 类进行多线程处理 在这个例子中,我们将创建一个线程池,并让每个线程计算一组数据的平方值。最终收集所有线程的计算结果。 ```php <?php class WorkerThread extends Threaded { private $data; public function __construct($data) { $this->data = $data; } public function run() { if ($this->data) { return array_map(function($value) { return pow($value, 2); }, $this->data); } } } // 创建要分配给线程的数据集 $dataSets = [ range(1, 5), range(6, 10), range(11, 15) ]; // 初始化线程池 $pool = new Pool(3, null, []); foreach ($dataSets as $index => $dataSet) { // 将工作负载提交到线程池 $workers[] = new WorkerThread($dataSet); $pool->submit($workers[$index]); } // 关闭线程池并等待所有线程完成 $pool->shutdown(); // 收集所有线程的结果 $results = []; foreach ($workers as $worker) { $results[] = $worker->work(); } print_r($results); ?> ``` 这段代码定义了一个名为 `WorkerThread` 的类,它继承自 `Threaded` 并实现了自己的业务逻辑&mdash;&mdash;即对输入数组中的每一个整数求平方[^1]。我们还创建了一个大小为 3线程池 (`Pool`) 来并发执行这些任务。最后,主线程会等待所有子线程完成后,再逐一提取它们的工作成果。 --- #### 另外一个重要提示 为了编译带有 `pthread_create` 功能支持的应用程序(如果是在 C/C++ 层面考虑),可以通过调整 VSCode 配置文件 task.json 实现链接库 `-lpthread` 或者单独指定参数 `-l pthread` 进行连接[^2]。不过这通常不直接影响 PHP 脚本本身,而是涉及到底层环境配置部分。 --- ### 注意事项 - 上述代码片段仅适用于 CLI 版本下的 PHP 解析器。 - 在实际项目里应用之前,请确认服务器操作系统以及 PHP 安装版本均满足条件。 - 对于 Web 应用场景而言,由于 Apache/Nginx 等 HTTP Server 架构原因,直接引入原生多线程机制并非最佳实践;此时建议探索异步框架或者队列服务作为替代解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值