将参数传递给同步过程调用

2023-12-09

创建线程对象时,我想从应用程序中调用需要同步的代码。问题是我不知道怎么打电话Synchronize对于带有参数的应用程序函数。

说我们有

procedure ThreadObject.Execute;
var
  val1,val2:integer;
  Star:string;
begin
  Synchronize(funcyfunc); //how to pass val1,val2,star here?
end;

where funcyfunc定义如下

procedure OtherClass.funcyfunc(param1,param2:integer;spok:string);
begin
   letsCallFriends(spok,param1);
   letsCallFriends(spok,param2);
end;

现在奇怪的解决方案是在 ThreadObject private 中说

private
  star:string;
  val1,val2:integer;
  procedure starVal;

在实施过程中我们做

procedure ThreadObject.starVal;
begin
  funcyfunc(Star,val1,val2);
end;

在线程执行中我们更改为

procedure ThreadObject.Execute;
var
  val1,val2:integer;
  Star:string;
begin
  Synchronize(starVal); //how to pass val1,val2,star here?
end;

但这很麻烦,因为每个过程调用都必须有一个全局变量。有没有更好的办法?

code:

unit ThreadObject;

interface

uses
  Classes;

type
  TThreadObject= class(TThread)
  private
    star:string;
    val1,val2:integer;
    procedure starVal;
  protected
    procedure Execute; override;

    //assume we have a constructor that ini the star val1 val2.
  end;

implementation

{ TThreadObject }

procedure ThreadObject.Execute;
var
  val1,val2:integer;
  Star:string;
begin
  Synchronize(starVal); //how to pass val1,val2,star here?
end;

procedure ThreadObject.starVal;
begin
  funcyfunc(Star,val1,val2);
end;

end.

Use 匿名方法.

正如您可以在手册中阅读的那样TThread.Synchronize

Synchronize(
  procedure
  begin
    Form1.Memo1.Lines.Add('Begin Execution');
  end);

在上面的例子中引用变量 Form1有点像被复制并保存,直到程序被执行(称为变量捕获).

注意:David 反对“复制变量”的想法,他可能是对的。然而,讨论所有极端情况和实施细节将是一种矫枉过正。他与“全局变量”OTOH 的比较可能会在递归过程等方面遇到麻烦。所有易于理解的类比都非常粗糙,并且以某种方式倾斜 ISTM。

您的匿名过程应该使用您的变量val1 and val2然后他们也应该被抓获

http://docwiki.embarcadero.com/Libraries/XE5/en/System.Classes.TThread.Synchronize

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将参数传递给同步过程调用 的相关文章

  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Mac 上的 Delphi - 可能吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我负责一个 Delphi Win32 项目管理应用程序 我刚刚完成了向 Delphi 2009 的迁移
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 如何检查注册表项是否存在

    我不知道我的错误在哪里 它总是跳到else分支 但是密钥存在 我检查了几次 var reg TRegistry begin with TRegistry Create do try RootKey HKEY CURRENT USER Ope
  • TListView 中的中心子项目图像

    Is it possible to fix the drawing of subitem images in a TListView so that they are not cut off on the left hand side as
  • GCD 和线程

    我想了解一些有关 GCD 和线程的知识 我的视图控制器中有一个 for 循环 它要求我的模型执行一些异步网络请求 因此 如果循环运行 5 次 模型将发出 5 个网络请求 考虑到我正在使用 NSURLConnection 的 sendAsyn
  • 使用多线程使用rabbitmq消息队列(Python Kombu)

    我有一个带有单个队列的 RabbitMQ 交换 我希望创建一个运行多个线程并尽快通过该队列工作的守护进程 工作 涉及与外部服务的通信 因此每个消费者内部都会发生相当多的阻塞 因此 我希望有多个线程都处理来自同一队列的消息 我可以通过在主线程
  • ASP.NET MVC 多线程

    我想在我的 asp net mvc 应用程序中实现这样的逻辑 user clicks a button gt server executes some time consuming logic in 15 threads i get dat
  • 在 std::thread 创建的线程中调用 pthread_sigmask 是一个好习惯吗?

    1 我是 std thread 的新手 我想知道调用是否是一个好的做法pthread sigmask 阻止某些信号特别的线程创建者std thread 我不希望新线程接收SIGTERM SIGHUP等信号 因为主进程已经安装了这些信号的处理
  • 多线程环境下如何更好的使用ExecutorService?

    我需要创建一个库 其中包含同步和异步方法 executeSynchronous 等待直到有结果 返回结果 executeAsynchronous 立即返回一个 Future 如果需要 可以在其他事情完成后进行处理 我的图书馆的核心逻辑 客户
  • 可升级读锁的优点?

    我想知道使用可升级读锁与执行这些步骤相比有什么优势 获取读锁 检查条件以查看是否需要进行写锁定 释放读锁 采取写锁定 执行更新 释放写锁 与获取可升级读锁相比 执行上述步骤的一个明显缺点是 步骤 3 和步骤 4 之间存在一个时间窗口 其中另
  • 使用 AJAX 或多线程加速页面加载

    我的页面有 5 个部分 每个部分大约需要 1 秒来渲染 Page Load RenderSection1 1 sec RenderSection2 1 sec RenderSection3 1 sec RenderSection4 1 se
  • Java:使用 Java.util.concurrent 线程访问读取线程串行端口

    我正在尝试编写一个 Java 串行设备驱动程序并想使用 对我来说是新的 java util concurrent包裹 我有一种发送数据包然后等待 ACK 的方法 我打算有炭 接收在不同的线程中运行 如果接收线程收到 ACK 它应该使用发送数
  • 将delphi stringgrid导出到excel

    我正在尝试将数据从delphi 7 中的stringgrid 导出到microsoft excel 我一直在使用这段代码来做到这一点 objExcel TExcelApplication Create nil objExcel Visibl
  • TStream.Position 与 TStream.Seek 比较

    要移动 TStream 类中的 当前字节 指针 我们可以使用属性 Position 例如 MyStream Position 0 或使用 Seek 方法 例如 MyStream Seek 0 soFromBeginning 问题是 哪一个更
  • Delphi定时器比毫秒更精确

    我在 Delphi 中有一个程序 它以 25 赫兹 每秒 25 次 的速度从外部应用程序获取帧 然后通过创建 1 2 个额外帧将其转换为 60 赫兹 每秒 60 帧 我需要通过连续构建帧缓冲区并从单独的线程输出帧来输出这些额外的帧 问题是
  • 多线程中的 OpenCV CascadeClassifier C++ 接口

    我想在多个线程中使用 CascadeClassifier 对象运行 OpenCV C 接口 我的程序的工作方式是我的主线程将 some file xml 加载到 CascadeClassifier 对象中 生成三个或更多线程并向它们传递级联
  • JavaFX - 取消任务不起作用

    在 JavaFX 应用程序中 我有一个方法在大量输入时需要很长时间 我在加载时打开一个对话框 我希望用户能够取消 关闭该对话框并且任务将退出 我创建了一个任务 并将其取消添加到取消按钮处理中 但取消并没有发生 任务也没有停止执行 Task
  • 我可以在主线程上读取一个小 txt 文件,还是应该始终避免那里的 I/O?

    我正在读取一个小的 json 文件 其中有几行 它存储在用户设备的内部应用程序文件夹中 我所做的就是这样 JSONObject jsonObject new JSONObject MyUtils inputStreamToString My
  • Delphi XE2,vcl样式重新创建窗口句柄

    在运行时应用新样式后 我的应用程序的 MainForm 创建一个新的窗口句柄 有什么方法可以阻止此操作或重新分配句柄 因为我收到了大量以下错误 系统错误 代码 1400 无效的窗口句柄 有什么方法可以操纵强制分配新句柄的进程吗 我通过执行以

随机推荐

  • 下单后如何获取盈透证券(IBPY)的交易价格和佣金?

    http interactivebrokers github io tws api 也许是一个有用的链接 这张图片来自盈透证券的java API指南 我想要的数字是交易日志中的价格和佣金 from ib opt import Connect
  • Javascript 检测用户是否更改选项卡

    我正在编写一个用于在线测验的网页 我的基本要求是 如果用户更改选项卡或打开新闻窗口 即使没有最小化其浏览器 即如果该人试图从其他窗口 选项卡查看答案 它也必须触发一个事件 停止测验 我怎样才能做到这一点 Note 尽量避免在您的答案中包含前
  • 如何让 Google Cloud Functions 保持温暖?

    我知道这可能会错过使用 Cloud Functions 的初衷 但在我的具体情况下 我使用 Cloud Functions 是因为这是我将 Next js 与 Firebase Hosting 桥接的唯一方法 我不需要使其具有成本效益 等等
  • 放大和缩小按钮 - highcharts

    我在气泡图中有自定义缩放按钮 放大 缩小 当用户单击 放大 按钮时 应该在图表中从左到右进行缩放 类似地 缩小应该以这种方式发生 这与立即发生缩小的重置缩放功能相反 小提琴链接 https jsfiddle net abcdlearner
  • 将数据发布到 colorbox iframe?

    这是我正在使用的代码 从我见过的其他例子来看 这应该有效 但事实并非如此 并且已经确保我使用的是最新的彩盒 function updateFolderCate ID Type colorbox iframe true scrolling f
  • 如何使用 System.out.printf?

    我的老师希望我们在格式方法 在最底部 中显示我们的值 但问题是我们有一个子程序 她没有向我们展示如何使用它 而且我的老师也没有提供帮助 任何建议或帮助将不胜感激 public class SphereCalculations public
  • Android 增强现实应用程序从屏幕点转换列表位置

    我有问题 找不到解决方案 我制作了一个 Android 增强现实应用程序 在我的应用程序中 我有一个兴趣点列表 每个兴趣点都是一个位置 经度 纬度 海拔 我知道我的位置并且我有 相机的 方位角 现在我的问题是 如何在屏幕上绘制这些点 gps
  • pthread_create 并传递一个整数作为最后一个参数

    我有以下功能 void foo void i int a int i int main pthread t thread int i pthread create thread 0 foo void i 编译时 存在一些关于转换的错误 vo
  • 部署到 IIS 7 时诊断跟踪日志记录不起作用

    我正在将站点从 IIS 6 迁移到 IIS 7 但无法查看所有日志 我的system diagnostics配置如下
  • Java JTextPane + JScrollPane:取消/激活自动滚动

    我目前正在用 Java 编写一个简单的聊天 目前我陷入了这个问题 我希望我的输出 JTextPane 的行为就像您期望它从良好的聊天中获得的那样 即默认情况下 当新文本到达时文本会自动滚动 使用 outputfield setCaretPo
  • 如何在 Spark 中向分解结构添加列?

    假设我有以下数据 id 1 payload foo 1 lol 2 foo 2 lol 2 我想分解有效负载并向其中添加一列 如下所示 df df select id F explode payload alias data df df w
  • Codeigniter AOP [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要 Codeigniter PHP 框架的 AOP 范例的良好实现 你有什么建议我 面向方面的编程在 PHP 世界中还不是很普遍 我不确定 CI
  • 在 C# 中重用 HttpWebRequest 的连接

    我需要使用 Net 发出 POST 请求 我可以通过 GET 进行身份验证 因此我尝试在同一连接上发出 POST 请求以保持身份验证 问题是我收到 401 Not Authenticated 异常 这意味着连接尚未被重用 HttpWebRe
  • 在 Node js 8 中打印 libuv 线程池大小

    这个链接纯粹指定libuv提供一个线程池 可用于运行用户代码并在循环线程中获得通知 它的默认大小是 4 但是可以在启动时通过设置来更改它UV THREADPOOL SIZE环境变量为任意值 绝对最大值为 128 So in package
  • 在屏幕右下角打开 Chrome 应用程序窗口

    我希望我的 Chrome 应用程序能够打开 使其接触任务栏并恰好偏离屏幕右侧 我当前的代码 chrome app runtime onLaunched addListener function chrome app window creat
  • C编程动态初始化二维数组

    我在这里做了一些愚蠢的事情 但我无法确切地指出是什么 void init data double data int dim x int dim y int i j k data double malloc sizeof double dim
  • 为什么seaborn计数图和直方图以不同的方式显示相同的十六进制颜色?

    我试图在我的论文中保留单一的调色板 我注意到我的直方图的蓝色和我的计数图的蓝色色调略有不同 即使我将它们设置为完全相同的十六进制值 我是否缺少一个设置 或者这些不同的图不仅仅显示给定的十六进制 我尝试过使用计数图饱和度 但它与颜色不匹配 理
  • 在 Git 中编写一个预推送挂钩来 grep 正则表达式的所有文件,如果未找到正则表达式,则希望拒绝推送

    我有以下预推钩 理想情况下 我希望它遍历所有推送到我的存储库的文件 如果任何文件的内容与顶部定义的正则表达式不匹配 则拒绝推送 尝试循环访问文件时出现以下错误 未定义方法 each for String NoMethodError each
  • 共享首选项或 SQlite

    我正在开发一个 Android AppWidget 它显示从配置活动输入的简短文本 在存储数据时我有点困惑 我应该使用共享首选项还是 SQlite 数据库 Thanks 这完全取决于您想要存储的数据 共享偏好 小数据 非结构化 例如登录信息
  • 将参数传递给同步过程调用

    创建线程对象时 我想从应用程序中调用需要同步的代码 问题是我不知道怎么打电话Synchronize对于带有参数的应用程序函数 说我们有 procedure ThreadObject Execute var val1 val2 integer