使用线程时,'invoke'用于避免'交叉线程'(1)
但是,有时'计时器对象'被用来避免'CrossThread'(2)
像这样(例如)
public partial class Form1 : Form
{
private bool bCheckState = false;
public Form1()
{
InitializeComponent();
}
//Button Click
private void btnWork_Click(object sender, EventArgs e)
{
Thread m_Thread = new Thread(new ThreadStart(Work));
m_Thread.Start();
}
private void Work()
{
bCheckState = true;
// not use invoke
}
private void timer_Tick(object sender, EventArgs e)
{
if (bCheckState)
{
//tbxDisplay is winform's textBox control - printing data
tbxDisplay.Text = bCheckState.ToString();
bCheckState = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
哪一个更有效?'(1)和(2)之间'
如果我们在"计时器事件"中检查后在"线程"中分散处理的数据,而不使用"调用"或其他方法,是否会出现问题?(我们听说在打印'thread'中处理的数据时要避免'Cross-Thread',在'timer event'中散布带有附加'timer object'的数据经常被使用,因为它既不有益也无害.
我刚开始学习MFC,我正在编写一个基于对话框的应用程序,以便更好地理解多线程.
主对话框有一个进度条,一个开始按钮和一个取消按钮.
单击开始按钮,我正在创建一个工作线程来进行一些处理(通过API调用),主线程负责进度条.
我已经定义了几个Windows消息来更新并停止进度条状态
WM_UPDATE_CONTROL
WM_STOP_CONTROL
Run Code Online (Sandbox Code Playgroud)
下面是我到目前为止创建的代码
HWND* phObjectHandle;
CWinThread* thread;
void CprogCtrlDlg::OnBnClickedStart() {
phObjectHandle = new HWND; // Set object handle for Worker thread
*phObjectHandle = GetSafeHwnd();
// create worker thread
if(NULL == (thread = AfxBeginThread(ThreadFunc, phObjectHandle))) {
EndDialog(IDCANCEL);
}
AfxMessageBox(L"Thread started");
// Set Progress bar to marquee
}
void CprogCtrlDlg::OnBnClickedCancel() {
// kill the Worker thread
}
UINT CprogCtrlDlg::ThreadFunc(LPVOID pParam) {
HWND *pObjectHandle = static_cast<HWND *>(pParam);
CprogCtrlImpDlg* threadDlg = (CprogCtrlImpDlg*) pParam;
return threadDlg->ThreadFuncRun(pObjectHandle);
}
UINT CprogCtrlDlg::ThreadFuncRun(HWND* pObjectHandle) { …Run Code Online (Sandbox Code Playgroud) 我正在尝试在node.js.
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
// This code is executed in the main thread and not in the worker.
// Create the worker.
const worker = new Worker(__filename);
// Listen for messages from the worker and print them.
worker.on('message', (msg) => { console.log(msg); });
} else {
// This code is executed in the worker and not in the main thread.
// Send a message to the main thread.
parentPort.postMessage('Hello world!'); …Run Code Online (Sandbox Code Playgroud) 我有一个运行Express服务器的Node.js应用程序和一个定期执行某些操作的工作线程。
当服务器停止时,我需要清理与工作线程启动时打开的外部系统的连接。
我试图在进程上为SIGTERM和SIGINT信号添加一个处理程序,但这没有用,工作线程中的处理程序函数未调用,当父进程接收到SIGINT或SIGTERM时,它会立即以退出代码1退出。父进程也有这些其中的处理程序不被调用。
这是重现此问题的简单代码示例:
start.js
const http = require("http");
const express = require("express");
const path = require("path");
const { Worker } = require("worker_threads");
let myWorker = null;
process.on("SIGTERM", stop);
process.on("SIGINT", stop);
const app = express();
const server = http.Server(app);
myWorker = new Worker(path.join(__dirname, "./worker.js"));
myWorker.on("exit", code => console.info(`Worker exited with code ${code}`));
server.listen(3000);
function stop() {
console.log("Main process: stop()");
process.exit(0);
}
Run Code Online (Sandbox Code Playgroud)
worker.js
process.on("SIGTERM", stop);
process.on("SIGINT", stop);
setInterval(() => console.log("beep"), 1000);
function stop() {
console.log("Worker process: stop()"); …Run Code Online (Sandbox Code Playgroud) 首先让我开始说是的,我已经在google和stackoverflow专门搜索了这个,我找到了很多答案,并尝试了所有.在这一点上,我相信我唯一的资源是自己发布问题,即使情景重复,请尽量善于帮助.
情况非常基本,在Ubuntu桌面10.04上,我根据本指南及其衍生产品通过Synaptic和Php5设置了apache .此时,如果我继续使用命令行并调用php脚本,它可以工作,例如:
php test.php
Run Code Online (Sandbox Code Playgroud)
输出我的问候世界没有任何问题.但是,如果我去firefox并指向test.php它将显示403错误禁止...
我已将/ var /,/ var/www /和/var/www/test.php的所有权更改为我能想到的每个变量(www-data [apache以此用户身份运行],purefan [我的普通用户],root )它没有任何区别,我也多次更改权限777,0777(只是为了安全),644,755,没有变化.从CLI我把phpinfo放到一个文件中并在这里添加它.
如果我没有弄错,那么当Apache调用php解释器时就会发生问题,就像我去http://localhost/index.php那样,它显示了apache的默认"It Works!" 页面,但如果我将php内容添加到该文件,它只是被忽略,但没有显示错误(也检查错误日志和syslog).
所以,如果你有任何建议让我知道,这不是一个生命或死亡的事情,但真的想建立使用工人而不是prefork.
感谢您的时间
我有一个电子应用程序,我试图将一些 CPU 密集型任务推送到工作线程。当我使用启动应用程序时,这效果很好npm start,但是在打包应用程序(使用带有 --asar 的电子打包器)后,工作线程似乎停止工作。我正在加载工作线程,如下所示:
const workerThread = new SharedWorker(path.join(__dirname, "JS/JS_MainWindow/worker.js"));
Run Code Online (Sandbox Code Playgroud)
我很困惑是什么原因导致了这个问题,但有可能是 appl 被打包到 ASAR 文件夹中吗?我非常有信心我有正确的路径来加载工作文件,因为我正在加载具有相同路径的其他几个图像。
我一直认为 JS 是一种单线程语言,这使得它对于 CPU 密集型任务效率低下。我最近遇到了工作线程以及它如何通过创建“一个进程下的多个工作线程”来解决这个低效率问题。进程和线程有什么区别?为什么 JS 突然能够产生多个工作线程来帮助主 JS 线程并与之交互以实现并发?你能帮我通俗地理解这个话题吗?谢谢
javascript multithreading single-threaded worker-thread node.js
我最近阅读了 Node 的“worker_threads”模块,该模块允许在多个线程中并行执行 Javascript 代码,这对于 CPU 密集型操作非常有用。(注意:这些不是 Chrome 在浏览器中制作的网络工作者)
我正在构建一个功能,我需要在不阻止浏览器的情况下执行大量 Postgres INSERT。
问题是:在我实例化 worker 的 Javascript 文件中,我不允许导入任何内容,包括本机 Node 模块或 NPM 库,如执行数据库查询所必需的 Knex.js。我收到一条错误消息:文件一执行,就不能在模块外使用 import 语句。
我试过将工作代码放在另一个文件中,顶部有一个导入语句(同样的错误)。我尝试将 Knex 对象提供给 workerData,但它无法克隆非本地 JS 对象。
我没有想法 - 如果我们不能导入任何 NPM 库,有没有人知道如何在工作线程中与数据库交互?!?!
// mainThread.js
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
import knex from 'knex'; // --> *** UNCAUGHT EXCEPTION: Cannot use import statement outside a module ***
if (isMainThread) {
module.exports = async function runWorker (rowsToInsert = []) {
return new …Run Code Online (Sandbox Code Playgroud) worker-thread node.js import-module node-cluster node-worker-threads
目前我正在开发一个包含数学分析的桌面应用程序.我使用qt进行GUI和用c ++编写的项目.当用户开始分析时,我打开一个工作线程并启动一个进度条.到目前为止一切正常,当用户取消操作时问题开始.操作很复杂,我使用了几个函数和对象,我在几个分配/解除分配内存我想知道如何在取消操作中恢复.因为可能存在内存泄漏.我应该使用哪种模式或方法来强制安全地取消操作?
我的想法是抛出异常,但操作真的很复杂,所以我应该把try-catch放到我的所有函数中,还是有更通用的方式,模式..
编辑:问题是我的对象在范围之间转移,所以shared_ptr或auto_ptr不能解决我的问题,Flag的想法可以,但我认为它需要这么多代码,应该有一个简单的方法.
当 Node.js 进程启动时,top 命令显示有 7 个线程附加到该进程。所有这些线程都在做什么?此外,随着 API 负载的增加,请求处理程序本身会异步等待其他上游 API 调用,Node 是否会产生额外的工作线程?我在顶部看到它确实做到了这一点。但我认为这只发生在文件 I/O 上。为什么需要这些额外的工作线程?
worker-thread ×10
javascript ×5
node.js ×5
apache2 ×1
c# ×1
c++ ×1
electron ×1
fastcgi ×1
memory-leaks ×1
mfc ×1
node-cluster ×1
php ×1
qt ×1
visual-c++ ×1
winforms ×1