HTML5的多线程技术:Shared Worker的使用示例

Shared Worker 与普通的 Web Worker 类似,但不同之处在于它可以被多个浏览器窗口、标签页或者iframe共享,使得这些上下文之间能够相互通信。下面是一个使用 Shared Worker 的完整示例。
共享Worker脚本(sharedWorker.js)
self.addEventListener('connect', function(event) {
    var port = event.ports[0];
    port.onmessage = function(e) {
        console.log('Received message:', e.data);
        if (e.data.type === 'broadcast') {
            port.postMessage({ type: 'broadcast', data: e.data.message, origin: e.origin });
        } else if (e.data.type === 'ping') {
            port.postMessage({ type: 'pong', data: 'Pong from Shared Worker!', origin: e.origin });
        }
    };

    port.start();
    port.postMessage({ type: 'ready', message: 'Shared Worker is ready!', origin: location.origin });
});
HTML 页面1(page1.html)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Page 1</title>
</head>
<body>
    <h2>Page 1</h2>
    <button onclick="sendPing()">Ping Shared Worker</button>
    <div id="response"></div>

    <script>
        if (navigator.userAgent.indexOf("Trident") !== -1) {
            alert("Internet Explorer does not support Shared Workers.");
        } else {
            var worker = new SharedWorker('sharedWorker.js');
            worker.port.start();

            worker.port.onmessage = function(e) {
                if (e.data.type === 'ready') {
                    document.getElementById('response').innerText = e.data.message;
                } else if (e.data.type === 'pong') {
                    document.getElementById('response').innerText = 'Received: ' + e.data.data;
                } else if (e.data.type === 'broadcast') {
                    document.getElementById('response').innerText += '\nBroadcast from ' + e.data.origin + ': ' + e.data.data;
                }
            };

            function sendPing() {
                worker.port.postMessage({ type: 'ping', message: 'Ping from Page 1' });
            }
        }
    </script>
</body>
</html>
HTML 页面2(page2.html)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Page 2</title>
</head>
<body>
    <h2>Page 2</h2>
    <button onclick="broadcastMessage()">Broadcast Message</button>
    <div id="response"></div>

    <script>
        if (navigator.userAgent.indexOf("Trident") !== -1) {
            alert("Internet Explorer does not support Shared Workers.");
        } else {
            var worker = new SharedWorker('sharedWorker.js');
            worker.port.start();

            worker.port.onmessage = function(e) {
                if (e.data.type === 'ready') {
                    document.getElementById('response').innerText = e.data.message;
                } else if (e.data.type === 'broadcast') {
                    document.getElementById('response').innerText += '\nBroadcast from ' + e.data.origin + ': ' + e.data.data;
                }
            };

            function broadcastMessage() {
                var message = prompt("Enter a message to broadcast:");
                if (message) {
                    worker.port.postMessage({ type: 'broadcast', message: message });
                }
            }
        }
    </script>
</body>
</html>

在这个例子中,sharedWorker.js作为一个Shared Worker,能够接收来自多个页面的消息,并根据消息类型执行不同的操作。page1.html可以向Shared Worker发送ping请求并接收pong响应,同时也能接收其他页面通过Worker广播的消息。page2.html则可以输入消息并广播给所有连接到该Shared Worker的页面。这样,多个页面可以通过Shared Worker实现数据的共享和通信。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多线程环境下,使用 `std::promise` 返回 `std::any` 时需要注意线程安全。可以使用 `std::shared_ptr` 来确保多个线程可以访问同一个 `std::promise` 和 `std::future` 对象。 例如,可以创建一个 `std::shared_ptr`,并将其传递给多个线程。每个线程都可以通过该 `std::shared_ptr` 访问 `std::promise` 和 `std::future` 对象,然后在 `std::promise` 中设置值,最后在 `std::future` 中获取值。 下面是一个示例代码: ```c++ #include <iostream> #include <thread> #include <future> #include <any> class MyAny { public: MyAny(std::any value) : value_(std::move(value)) {} std::any getValue() { return value_; } private: std::any value_; }; void worker(std::shared_ptr<std::promise<MyAny>> p) { std::any value = 42; MyAny myValue(value); p->set_value(myValue); } int main() { std::shared_ptr<std::promise<MyAny>> p = std::make_shared<std::promise<MyAny>>(); std::future<MyAny> f = p->get_future(); std::thread t(worker, p); MyAny result = f.get(); std::any resultValue = result.getValue(); std::cout << std::any_cast<int>(resultValue) << std::endl; t.join(); return 0; } ``` 在上面的示例代码中,我们首先创建一个 `std::shared_ptr`,然后将其传递给一个线程和 `std::promise` 对象。线程可以通过该 `std::shared_ptr` 访问 `std::promise` 对象,并在其中设置一个值。主线程可以通过 `std::future` 对象获取该值,并通过 `MyAny` 类的方法获取 `std::any` 类型的值。需要注意的是,在主线程中获取值之前,必须确保线程已经完成并设置了该值。在本例中,我们使用 `std::thread::join` 等待线程完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值