问题标签 [tthread]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2396 浏览

delphi - 我可以从 TThread 的 OnTerminate 事件中引发异常吗?

我写了一个TThread后代类,如果引发异常,将异常的 Class 和 Message 保存在两个私有字段中

我以为我可以raise在事件中出现类似的异常OnTerminate,以便主线程可以处理它(这是一个简化版本):

我希望发生标准异常处理机制(一个错误对话框),但我得到的结果好坏参半:出现对话框但随后出现系统错误,或者(更有趣)出现对话框但调用线程的函数运行就好像从未引发异常一样。
我想问题出在调用堆栈上。
这是个坏主意吗?
是否有另一种方法可以将线程异常与主线程分离,但以标准方式重现它们?
谢谢

0 投票
1 回答
253 浏览

delphi - 如何在方法内将外部变量设置为 nil?

我想子类化TThread,以便有一个线程类,当 时FreeOnTerminate = True,设置nil为其引用变量。换句话说,我想做这样的事情:

消费者代码应该是这样的:

...然后我可以安全地测试Assigned(MyThread).

我看到如何FreeAndNil设法将无类型参数传递的引用对象设置为nil,但它在本地执行此操作。在我的情况下,我应该将它“保存”到一个类字段 ( FReferenceObj) 并在另一个地方 ( ) 使其为零DoTerminate

如何正确传递、存储和检索它?我可以考虑传递和存储 MyThread 的地址而不是 MyThread 本身,但我希望有更优雅的方式。

谢谢!

0 投票
1 回答
241 浏览

multithreading - TThread.FinishThreadExecution 的目的是什么,何时调用?

我一直在尝试实现一个在后台运行的线程,并每隔一秒左右更新一个进度条,并按照Delphi-timer inside thread generate AV的最佳答案中的示例进行操作。我注意到建议的解决方案有一个 TThread.FinishThreadExecution 的实现。我的 IDE 显示我的 delphi 版本支持该方法,但我一直无法找到任何关于它的文档(谷歌出现了 10 个点击,没有一个帮助,http://docwiki.embarcadero.com/没有列出TThread 下的那个方法。它是干什么用的,什么时候调用的?

0 投票
3 回答
1978 浏览

delphi - 在 TThread.OnTerminate 上设置/更改 TThread.FreeOnTerminate

我一直在尝试FreeOnTerminate程序中设置该属性,但似乎设置它为时已晚,或者它完全忽略了该程序。OnTerminatewrite

如何程序中设置/更改FreeOnTerminate属性?有什么解决方法吗?OnTerminate

一小段代码:

0 投票
1 回答
381 浏览

multithreading - Delphi XE5 - 需要奇怪的行为帮助

我正在研究 TLogger 类,它将我的应用程序日志记录到文件中......

我必须将日志从文件获取到 TMemo: 1. 将 TMemo 分配给 TLogger 类,然后将 True 分配给 DisplayInMemo 属性,然后调用 GetLogFromFile(); 2.调用GetLogsFromFile();然后 Self.Memo1.Text := TLogger.LogsResult;

下面...注释的解决方案工作正常...未注释的解决方案仅每 2 次单击按钮 4 有效

整个 TLogger 实现:

正如您所看到的,唯一的区别在于 LDisplayInMemo:如果是 True TMemo 会填充日志......什么时候是 False 我需要在按钮 4 上单击 2 次才能在 TMemo 中获得结果......

有任何想法吗?老实说,我不知道这两种解决方案工作不同的原因是什么:(我也在 Self.Memo1.Text := logger.LogsResult; 之后尝试了 ProcessMessages

0 投票
1 回答
541 浏览

c++builder - 完成的 Execute() 函数是否设置了 Terminated 属性

由于 C++ Builder 2010 似乎不包含我自己添加到线程中的CheckTerminated()函数,因此我需要从线程外部检查其状态。TThread

这工作正常,但我正在尝试查找有关是否让Exectue()线程完成的功能将Terminated属性设置为的信息,true或者我是否必须在Execute()方法结束时手动执行此操作,或者Terminate()在结束时运行Execute()方法。

0 投票
1 回答
57 浏览

c++builder - 保持运行线程数

在我的主应用程序 C++ 构建器中,当我在列表中有文件时,我创建线程(对象 TThread)来处理文件。同时,我需要保持运行线程的数量。

我不明白该怎么做?有什么建议吗?

谢谢你。

0 投票
1 回答
205 浏览

multithreading - 从线程内部实例化 TThread-descendent 是否安全?

我有一项任务,我必须做一些繁重的 CPU/RAM 工作。有了这个结果,我必须做一些数据库请求。所有这些我必须做几千次,所以我在后台线程中做。现在我正在考虑将每个任务分成两部分并将它们拆分为 2 个单独的线程,这样第一个线程就不必等待数据库请求完成。然后它可以为第二轮做 CPU/RAM 的工作,而第二个线程正在等待第一轮的数据库请求,一切都会加快。

现在,从第一个 TThread 后代中实例化第二个 TThread 后代是否安全?还是我需要从 MainThread 中实例化 TThread 后代?我可以两者都做,但在我的情况下,从第一个线程中实例化第二个线程会更容易,并且它将遵循 oop 范式,因为第二个线程对程序的其余部分是透明的。

0 投票
0 回答
277 浏览

multithreading - 使用 Delphi XE 多线程的奇怪结果

我正在尝试在 Delphi XE 中使用多线程。任务如下,我必须创建 4 个线程。每个线程在 Paintbox 中的预定义区域绘制彩色圆圈,例如 FIRST 线程仅在 Paintbox 的第一个引号中绘制红色圆圈,第二个线程仅在第二个引号中绘制黄色圆圈,依此类推。

我已经定义了以下课程

在主代码中,我执行以下操作:

线程 Create 和 Execute 方法定义如下:

结果,我在三个区域中得到了几个具有相同颜色的圆圈,并且在一个区域中得到了很多圆圈(相同颜色)。我做错了什么?

0 投票
1 回答
5204 浏览

multithreading - Using the Delphi XE7 Parallel Library

I have a time consuming routine which I'd like to process in parallel using Delphi XE7's new parallel library.

Here is the single threaded version:

There is really nothing complex going on. If the territory list variable is changed or set to false then the routine loops around all the sales territories and recreates the territory border (which is the time consuming task).

So here is my attempt to make it parallel:

I've replaced the for-loop with a parallel for-loop. The counter, 'i' is locked as it is incremented to show progress. I then wrap the OnCreateShapeProgress event in a TThread.Queue, which will be handled by the main thread. The OnCreateShapeProgress event is handled by a routine which updates the progress bar and label describing the task.

The routine works if I exclude the call to the OnCreateShapeProgress event. It crashes with an EAurgumentOutOfRange error.

So my question is simple:

Am I doing anything anything stupid?

How to do you call an event handler from within a TParallel.For loop or TTask?