问题标签 [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 回答
7976 浏览

delphi - Delphi TThread.CurrentThread 和 EAccessViolation - 这是一个错误还是我的无能..?

在 Delphi 2009 中,我发现每当我在应用程序中使用 TThread.CurrentThread 时,应用程序关闭时都会收到如下错误消息:

除非它只是我的机器,否则您可以在几秒钟内复制它:创建一个新的 Delphi Forms 应用程序,向表单添加一个按钮,并为按钮的事件处理程序使用如下内容:

在我的 Vista 机器和 XP 机器上,我发现如果我点击按钮一切都很好,但如果我点击按钮,当我关闭应用程序时会收到上述错误消息。

所以......我想知道这是否是一个错误,但同时我认为我很可能只是不了解关于你应该如何在 Delphi 中使用 TThreads 的一些非常基本的东西。恐怕我有点像德尔福新手。

像这样使用 TThread.CurrentThread 有什么明显的问题吗?

如果没有,并且你有 Delphi 2009,如果你实现我的简单示例项目,你会遇到同样的问题吗?


更新:正如弗朗索瓦在下面指出的,这实际上是 Delphi 2009 中的一个错误 - 你可以在这里投票


更新:此错误已在 Delphi 2010 中修复。

0 投票
6 回答
7742 浏览

c++builder - 如何将 Borland C++ builder 的代码移植到 Linux?

我有一个用 C++ 编写并使用 Visual Component Library 的 Windows DLL 的源代码。现在我的任务是将它移植到 Linux,但我没有 VCL 本身的源代码或任何类型的文档(而且我从未使用过 Borland C++;在我的 Windows 时代,我使用 MFC)。

这应该不是那么难,因为我的 DLL 没有任何 GUI:据我所知,它主要使用 VCL 进行多线程处理。我遇到了一个继承自 TThread 的类,这就是我卡住的地方。我在互联网上进行了一些搜索,但到目前为止没有找到 VCL 的文档。我想避免购买有关 Borland C++ Builder 的书,因为我没有时间等待它从亚马逊上来。我不能考虑购买适用于 Windows 的软件包,因为在工作中我只有一个 Linux 机器。

有什么建议么?

0 投票
2 回答
12029 浏览

delphi - 销毁 TThread 对象的正确方法

这个问题可能看起来微不足道,但我希望你不要忽视它。
在销毁 TThread 对象之前,通常需要等到调用 TThread.Execute() 方法的线程完成,因为只有这样我们才能确定,例如,在类的析构函数中销毁的对象不再被访问。因此需要调用 Terminate 来设置线程必须检查是否退出的 Terminated 标志,然后调用 WaitFor() 方法。

因为线程可能被挂起,我认为在调用WaitFor之前恢复它比较好,否则调用线程会死锁。而且因为线程可以被挂起多次,它应该被恢复相同的次数,对吧?

如果创建的线程是挂起的,我们不必担心当我们恢复线程只是为了终止它时会调用 TThread.Execute() 方法——它不会(如果我错了,请纠正我)。

我所说的建议对每个被释放的 TThread 对象使用以下代码行:

不幸的是,当我们销毁创建了多个线程的应用程序时,为每个被销毁的 TThread 对象编写这样一段代码会不必要地使代码变得很长,甚至可能不透明。

因此,我得出一个结论,所有这些都可以放在 TThread 类的重写析构函数中,这足以调用 MyThread.Free (如果设置了 MyThread.FreeOnTerminate 则调用 MyThread.Terminate )而不关心是否被破坏object 是否为 TThread 对象:

请原谅我问了这么一个基本的问题。但是,我想了解您对这种销毁 TThread 对象的方式(我希望是一种通用方式)的看法。我问这个问题是因为我从同事的代码中了解到,他们通常使用第一个代码示例来销毁此类对象,但他们从未使用过检查正在等待的线程是否没有被挂起,如果线程我认为有点危险可能会暂停在代码中的某处。因此,我试图找到一种销毁此类对象的通用方法,这将使代码更清晰、更安全。我希望我没有让事情变得更糟——你怎么看?

提前感谢您的建议。

0 投票
3 回答
6472 浏览

delphi - delphi - 在关闭应用程序时终止所有线程(TThread)

我的应用程序是一个 tcp/ip 服务器,主线程只创建一次并一直在监听。当新客户端连接时,主线程创建TClientThread类型的新线程。但是没有正在运行的客户端线程列表,因为这会使我的应用程序有点复杂......有没有办法在所有线程上执行“终止”方法,即使线程很忙(在我的情况下是“忙”意味着它正在等待数据,其中超时设置约为 30 秒......所以无论如何我都必须杀死它,而不是等待。)?简单的关闭应用程序似乎没有在线程上运行“终止”方法,最终导致 FastMM 报告内存泄漏......

0 投票
1 回答
1127 浏览

c++ - C++ Builder - 即时生成 TThreads

我正在寻找生成线程或函数的能力,以便它立即返回到调用行并继续执行程序,但继续执行线程工作。

例如,如果您调用 Form.ShowDialog(),它将创建一个具有自己的 UI 线程的无模式表单。

有没有办法做到这一点(没有形式)而不必声明一个 TThread 类?我想有点像匿名线程,如果它甚至存在的话。

0 投票
4 回答
5845 浏览

delphi - 我应该用什么 delphi 代码替换对已弃用的 TThread 方法 Suspend 的调用?

以前有人问过,但没有完整的答案。这与所谓的著名“'致命线程模型!'”有关。

我需要用安全的东西替换对 TThread.Suspend 的调用,当终止或恢复时返回:

原始答案含糊地暗示“TMutex、TEvent 和关键部分”。

我想我正在寻找 TThreadThatDoesntSuck。

以下是带有 Win32Event 的 TThread 衍生示例,供大家参考:

0 投票
2 回答
3098 浏览

delphi - Delphi中的线程消息循环挂起

我正在开发一个简单的 Delphi 程序,在该程序中我试图使用线程将程序的功能与其 GUI 分开,并在更长的任务等期间保持 GUI 响应。基本上,我有一个“控制器”TThread 和“视图”TForm。视图知道控制器的句柄,它用来通过PostThreadMessage. 过去,我将这种模型用于非主表单的表单没有问题,但由于某种原因,当我尝试将这种模型用于主表单时,线程的消息循环就退出了。

这是我的线程消息循环代码:

要设置控制器,我这样做:

为了处理主窗体的消息,我尝试使用这两个Application.Run循环和以下循环(紧接着Controller.Resume

我被困在这里 - 任何帮助将不胜感激。

0 投票
3 回答
4760 浏览

delphi - 在 Delphi 的单独线程中运行 WebService 的问题

我从来没有在任何社区问过问题,因为我总是自己解决问题或者可以在网上找到问题。但是有了这个,我走到了死胡同,需要帮助!说得很清楚——我转换了一个简单的应用程序,在别处找到,使它使用 Tthread 对象。这个想法很简单——应用程序使用 web 服务在线检查,通过 THTTPRIO 组件,天气并将结果放在 Memo1 行中。

单击 Button1,我们以标准方式完成它——使用放在 Form1 上的 THTTPRIO(它在此处称为 htt,就像在原始应用程序中一样)并使用主线程和唯一线程。

点击 Button2——我们使用 TThread 类

在 WeatherThread1 单元中的执行过程中,我输入了以下代码:

...和 ​​GetForecast 代码:

过程 ShowWeather 在 Form1.Memo1 中显示结果。现在有一个问题:在主线程中,单击 Button1,一切正常。当然,当 HTTPRIO 组件进行通信时,它会冻结表单。

使用 Button2,我将代码放在单独的线程中,但它不想工作!奇怪的事情发生了。当我启动应用程序并单击 Button2 时,使用 HTTPRIO 组件时出现错误。但是当我点击 FIRST Button1 和 AFTER Button2 时它可以工作一段时间(但它可以工作一段时间,只点击 5-7 次)。我想我做错了什么,但无法弄清楚问题出在哪里以及如何解决它。看起来线程单元中的代码不是线程安全的,但它应该是。请帮助如何使 HTTPRIO 在线程中工作!!!

您可以在此处找到压缩后的完整代码。

0 投票
3 回答
1602 浏览

multithreading - 对 TThread 的一些帮助(Terminate、FreeOnTerminate 和线程领域的其他冒险)

我正在尝试实现以下目标(使用Delphi7):登录到我的程序后,用户获得控制权,但在后台一个单独的线程从互联网下载文件以检查当前许可证密钥是否被列入黑名单。如果是,用户会收到提示并且程序终止。

所以我创建了一个单独的 TThread 类,它使用 InternetOpenURL/InternetReadFile 从网络下载黑名单。

我的问题如下:

如果用户在后台下载完成之前退出我的程序,则许可证管理器线程应由主线程终止。

如果线程完成了它的工作,它应该自动终止。

如果我使用 FreeOnTerminate := true 我不能从主线程终止线程。但除此之外,我怎样才能让线程在完成其工作后释放其资源?

我的另一个问题是:

如果许可证密钥被列入黑名单,我会使用 Synchronize 对应用程序主窗体的某些资源进行处理。

但是我怎么知道用户是否已经关闭了应用程序并且程序是否在主窗体的 FormDestroy 中?如果我在错误的时间同步,可能会导致访问冲突......

谢谢!

0 投票
5 回答
5794 浏览

multithreading - 自动或手动释放 TThread

我的程序中有一个主线程和一个单独的线程。如果单独的线程在主线程之前完成,它应该自动释放自己。如果主线程首先完成,它应该释放单独的线程。

我知道 FreeOnTerminate,而且我读过你必须小心使用它。

我的问题是,下面的代码是否正确?