【问题标题】:Synchronization from class DelphiDelphi 类的同步
【发布时间】:2013-01-19 13:03:19
【问题描述】:

我有一个关于 Delphi 中的多线程的问题。 假设,我有一个线程,我有一个类,它做一些工作并且必须有同步。我怎么能做到? 我做这个程序(在 ThreadClass 中):

procedure TThreadClass.SynchProc(P: TProc);
begin
 ...
 Synchronize(TThreadProcedure(P));
 ...
end;

我在课堂上调用它,在 Thread 中运行,但是...... 在过程中,符号“同步”是 TThread 的一种方法,即对象“(Self as TThread)”,但是当我从我的类中调用它时,变量“Self”不包含我的 ThreadClass 对象(我不知道,它被包含,可能是第二类的对象,在线程中运行)。分别该程序不起作用。 我搜索其他变体(我将我的 threadClass 对象传递给第二类对象并尝试从第二类的过程中调用“同步”过程,但编译器不想编译它)。

你能帮帮我吗?将不胜感激任何帮助

来自乌克兰的问候 PS对不起我的英语不好

【问题讨论】:

  • 现代德尔福有Synchronize的类过程版本。你甚至需要Synchronize?这在主线程上运行代码。总是可以选择使用锁进行序列化。你应该告诉我们TThreadClass 是什么。
  • 我从程序的主线程调用我的线程,因为我需要执行(可能是英文中的“执行”)许多操作。但我也需要使用表单的组件——查看操作进度等。我需要专注于编辑向用户询问一些事情,等待用户回答并继续执行。没有同步,这是无法实现的,恕我直言。
  • 如果您需要同步到主线程,那么是的,您需要调用 TThread.Synchronize。如果您确实要创建一个线程,那么您就可以这样做。
  • 我可以从 Thread 执行此操作(调用我的 SynchProc),但不能从其他类的对象(即 ThreadClass 对象)执行此操作。这是我的问题。

标签: multithreading delphi class


【解决方案1】:

我不是 100% 确定我理解,但我认为你有这样的情况。你有一个TThread 的后代,比如TMyThread。而该类又使用另一个名为TThreadClass 的类,它不是TThread 的后代。您想从TThreadClass 的方法调用Synchronize

这里有一些选项:

  1. TThread 实例传递给TThreadClass。这是一个相当残酷的解决问题的方法。现在TThreadClass 可以对线程做任何事情,而它只想调用Synchronize
  2. 将引用Synchronize 方法的过程变量传递给TThreadClass。这使TThreadClass 能够做它需要做的事情,而不是更多。
  3. 调用TThread.Synchronize类方法传递nil作为第一个参数。

其中,最后一个选项是最简单的。你可以这样做:

procedure TThreadClass.SynchProc(P: TThreadProcedure);
begin
  TThread.Synchronize(nil, P);
end;

请注意,根据问题中的代码传入TProc 并转换为TThreadProcedure 不是一个好主意。强制调用者传入正确类型的过程变量。在这种情况下,演员阵容是良性的,但您应该始终避免演员阵容。

【讨论】:

  • 感谢您的回答。我创建了一个简单的程序,实现了它并且它成功地工作。我将搜索一些错误或......其他阻碍在我的主程序中执行此操作的内容。感谢帮助。如果我没有找到解决方案,我会回到你的选项来解决问题。否则 - 我会写下为什么无法制作
  • 您是否可以使您的程序工作超出了问题的范围。您只是询问了如何从 TThread 实例方法以外的其他地方调用 Synchronize。
  • 感谢您的回答。我的错误是我在对象中声明了我的第二个类,它在程序的主线程中运行(它在那里创建,这个对象是 Form 的属性)。我想将我的第二类的方法与 Synch 一起使用,但这不是必需的 - 第二类的 obj 在主线程中!但是...有时我的程序运行良好,但在 sec 课程中的循环(必须延迟程序)没有做到!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 2011-09-28
相关资源
最近更新 更多