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

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(使用前将#替换为@)

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

随机推荐

  • 下单后如何获取盈透证券(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