delphi 多线程问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 多线程问题相关的知识,希望对你有一定的参考价值。
是这样的,我有一循环任务,但我只开20个线程,每个线程结束后自动去找下一个任务,现在我想通过一个按钮,把所有正在运行的线程都安全结束掉,如何做?
有可能有这种情况,1-20号的线程,15号最先结束了,那么正在运行的线程号为 1-8 9-14 16-20 21
是DELPHI语言
作为所有线程跳出循环的条件之一。
主界面按钮对开关变量进行赋值。 参考技术A 设一公共的信号就好,设置成true循环就退出
while (not bquite) do
begin
end;
主线程设置bquite := true ;
Delphi 多线程应用程序内置在 vista 中,无法在 XP 中运行
【中文标题】Delphi 多线程应用程序内置在 vista 中,无法在 XP 中运行【英文标题】:Delphi multithreaded application built in vista and won't run in XP 【发布时间】:2011-03-26 23:48:51 【问题描述】:我真的很难过。
我在 vista 上运行 delphi 2007。我已经构建了许多应用程序并在 XP 中毫无问题地运行它们。这个最新的应用程序必须使用线程。我很确定我的代码是正确的。它在 Vista 上运行良好,但是当我在 XP(尝试多台 PC)上运行它时,我的程序似乎滞后(操作系统的 32 位,XP sp3 和 Vista sp1,dotnet v2)。最好的例子是,如果我拔掉串口,我的 coms 将继续运行等等。
我在我的 xp 机器上安装 delphi,并在 delphi 运行时运行我的程序。正如我从vista内置的exe运行它一样。那时它运行良好。关闭delphi,comport又开始卡顿了。
如果我拔下并重新插入闪存驱动器,coms 会再次赶上。
我想在我的基于 xp 的机器上构建应用程序,但有大约一百万个第三方组件,这使它成为一个真正的设置任务。
哦,仅供参考,我只用主线程和一个 comport 线程构建了一个简单的应用程序。同样的问题。 comthread 所做的就是从 comport 中获取数据。甚至没有显示它,我在后台使用了一个串口监视器来检查延迟。
欢迎提出任何建议。
OK 快速编辑:XP 电脑是全新构建的。我打开了msn messenger,程序运行正常。我显然错过了一些设置......
【问题讨论】:
您是以固定间隔轮询端口还是使用重叠 I/O?如果轮询你使用什么样的计时器? 【参考方案1】:如果您在线程中使用Sleep
(因此我对您的问题的评论/查询),您应该使用timeBeginPeriod
来表明您想要的解决方案。正如您已经发现的那样,在哪里调用它并不重要。可以是主线程,甚至可以是完全不同的应用程序。
在 embarcadero 论坛上查看 thread,当然还有在 MSDN 上查看 documentation(备注)。
【讨论】:
您好抱歉耽误了我的回复,昨天是公共假期。这解决了它。在初始化时,我只是说 timePeriodBegin(1),它在我所有的操作系统上运行。我有点担心我是否应该使用睡眠。但正如他们所说,如果它有效,请不要修复它。再次感谢 @larry - 不客气!不要忘记'timeEndPeriod'。 :)【参考方案2】:您的操作系统是否安装在两台不同的 PC 上? 我猜你的一台电脑有一个真正的双核处理器(XP 的那个),而另一台(Vista 的那个)有一个单核处理器。有时,多线程应用程序在真正的多核处理器上运行时会暴露他们的问题。 Delphi 调试器有时会更改 CPU 关联性,因此它可以在调试器上工作,但不能在调试器之外工作。 另一种检查方法:在 XP 下尝试您的软件,并将关联设置为仅一个 CPU。 我以前见过。但这可能是另外一回事,因为您说您已经在多台 PC 上尝试过您的软件。
【讨论】:
以上是关于delphi 多线程问题的主要内容,如果未能解决你的问题,请参考以下文章