- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将 Delphi 应用程序从 Indy 9 更新到 Indy 10。
这非常痛苦,因为显然发生了很多变化。
我被困在一步了。
这是旧代码(适用于 Indy 9):
创建一个线程池,并初始化并启动池中的每个线程。各个线程创建一个 indy http 客户端(但这并不重要)。
TUrlThread = class(TIdThread)
...
var
i: Integer;
begin
// create the Pool and init it
Pool := TIdThreadMgrPool.Create(nil);
Pool.PoolSize := Options.RunningThreads;
Pool.ThreadClass:= TUrlThread;
// init threads and start them
for i := 1 to Options.RunningThreads do
begin
with (Pool.GetThread as TUrlThread) do
begin
Index := i;
Controler := Self;
Priority := Options.Priority;
Start;
end;
end;
TIdThreadMgrPool 类在 Indy 10 中消失了。
我正在寻找替代品,TIdSchedulerOfThreadPool 看起来像是赢家,但我无法让它运行。
这是修改后的(Indy 10)代码:
TUrlThread = class(TIdThreadWithTask)
...
var
i: Integer;
begin
// create the Pool and init it
Pool := TIdSchedulerOfThreadPool.Create(nil);
Pool.PoolSize := Options.RunningThreads;
Pool.ThreadClass:= TUrlThread;
// init threads and start them
for i := 1 to Options.RunningThreads do
begin
with (Pool.NewThread as TUrlThread) do
begin
Index := i;
Controler := Self;
Priority := Options.Priority;
Start;
end;
end;
我在这里遇到访问冲突异常(这是 indy 代码):
procedure TIdTask.DoBeforeRun;
begin
FBeforeRunDone := True;
BeforeRun;
end;
FBeforeRunDone 为零。
最佳答案
您认为 TIdSchedulerOfThreadPool
是 Indy 10 中 TIdThreadMgrPool
的替代品是正确的。但是,您没有考虑到 TIdScheduler
架构与 TIdThreadMgr
架构有很大不同。
在 Indy 10 中,TIdThreadWithTask
本身不运行。顾名思义,TIdThreadWithTask
执行一个 Task,它是 TIdTask
派生的对象(例如 TIdContext
,这是 Indy 10 中与线程关联的 TIdPeerThread
的替代品。您正在运行线程而不给它们执行任务,这就是您遇到崩溃的原因。为了手动调用 Start()
,您需要首先创建一个基于 TIdTask
的对象并将其分配给 TIdThreadWithTask.Task
属性。 TIdTCPServer
通过调用 TIdScheduler.AcquireYarn()
来创建链接到 TIdThreadWithTask
对象的 TIdYarn
对象来处理该问题,然后创建一个 TIdContext
对象并将其传递给 TIdScheduler.StartYarn()
,后者使用 TIdYarn
访问 TIdThreadWithTask
code> 分配其 Task
属性,然后再调用 Start()
。
但是,一切并没有失去。在 Indy 9 和 10 中,您确实不应该一开始就手动调用 TIdThread.Start()
。 TIdTCPServer
在接受新的客户端连接、从其 ThreadMgr
/Scheduler
获取线程并将客户端连接与该线程关联之后,为您处理该问题。您可以根据需要初始化线程属性,而无需立即实际运行线程。这些属性将在线程第一次开始运行时生效,稍后再运行。
试试这个:
TUrlThread = class(TIdThread)
...
var
i: Integer;
begin
// create the Pool and init it
Pool := TIdThreadMgrPool.Create(nil);
Pool.PoolSize := Options.RunningThreads;
Pool.ThreadClass:= TUrlThread;
Pool.ThreadPriority := Options.Priority;
// init threads and start them
for i := 1 to Options.RunningThreads do
begin
with (Pool.GetThread as TUrlThread) do
begin
Index := i;
Controler := Self;
end;
end;
.
TUrlThread = class(TIdThreadWithTask)
...
var
i: Integer;
begin
// create the Pool and init it
Pool := TIdSchedulerOfThreadPool.Create(nil);
Pool.PoolSize := Options.RunningThreads;
Pool.ThreadClass:= TUrlThread;
Pool.ThreadPriority := Options.Priority;
// init threads and start them
for i := 1 to Options.RunningThreads do
begin
with (Pool.NewThread as TUrlThread) do
begin
Index := i;
Controler := Self;
end;
end;
话虽如此,还有最后一件事需要注意。在 Indy 9 和 10 中,线程完成后可能不会放回池中,并且在初始化代码运行后新线程可能会添加到池中。 PoolSize
是池中保留的最小线程数,而不是绝对计数。超过 PoolSize
数量的客户端可以连接到服务器,并且它会在需要时为它们创建更多线程,从而绕过您的初始化代码。在这两个版本中,初始化线程的最佳位置是在 TUrlThread
构造函数中。将您的 Controler
指针存储在构造函数需要时可以访问的地方。而且为每个线程分配 Index
是没有意义的,因为池中线程的顺序会随着时间的推移而动态变化。
事实上,由于另一个原因,您的手动初始化代码在两个版本中实际上都是错误的方法。 TIdThreadMgrPool.GetThread()
和 TIdSchedulerOfThreadPool.NewThread()
根本不会将新线程添加到池中。在 Indy 9 和 10 中,当线程停止运行并且有空间保存线程以供重用时,线程才会添加到池中,此外,在 Indy 10 中,仅当 TIdTCPServer
启动时才将线程添加到池中。因此,您实际上创建的线程实际上没有执行任何操作,也没有被池跟踪。更有理由在这两个版本中重新设计初始化代码,以便线程在正常情况下创建时自行初始化,而不是侵入体系结构手动创建它们。
关于delphi - 使用 Delphi 从 Indy 9 迁移到 10,TIdSchedulerOfThreadPool 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14514810/
我最近开始从事一个 Sails 项目。它目前在迁移表下具有以下格式的迁移。 20160826122004-create_users_table.js 'use strict'; module.expo
当我尝试迁移时 doctrine:migrations:migrate ,我收到此异常:“元数据存储不是最新的,请运行 sync-metadata-storage 命令来解决此问题。”。这仅在尝试在生
我在 ec2 linux 7 上有一个 MarkLogic 服务器。我想将它迁移到 linux 6。我将 ebs 移动到新的 linux 6 并将其安装在 /var/opt/MarkLogic . 我
我对 OpenID 很好奇。虽然我同意统一凭证的想法很棒,但我有一些保留意见。什么是防止 OpenID 提供商发疯并持有他们拥有的 OpenID 帐户直到您支付 n 美元?如果我决定不喜欢这个提供商,
使用 SQL 很容易做到这一点,但我需要编写一个我不熟悉的 Knex 迁移脚本。以下代码在 order 表中行的末尾添加了 order_id 列。我想在 id 之后添加 order_id。我该怎么做?
使用 SQL 很容易做到这一点,但我需要编写一个我不熟悉的 Knex 迁移脚本。以下代码在 order 表中行的末尾添加了 order_id 列。我想在 id 之后添加 order_id。我该怎么做?
我想通过在 Yii2 中的迁移添加一个新列,使用以下代码: public function up() { $this->addColumn('news', 'priority', $this-
我正在尝试在 SQLDelight 的表中添加更多列。我做了一个迁移文件 1.sqm .在迁移文件中,它给出了找不到表的错误。 我的 build.gradle.kts: sqldelight {
我有一个与 Flyway DB 迁移相关的问题。通常如何管理处理相同 DB 模式的多个项目(微服务)。每个项目中的 Flyway 迁移脚本如果被其他项目修改,则不允许启动。他们是否有任何文档或最佳实践
我是 Laravel 的新手。我做了一份待办事项申请作为一项学校作业。我们必须使用迁移来创建我们的数据库。 我使用迁移创建了 2 个表。我的问题是:如果你第一次在你的电脑上运行这个项目,有没有办法自动
我正在尝试在 Laravel 中创建外键,但是当我使用 artisan 迁移表时,出现以下错误: [Illuminate\Database\QueryException] SQLSTATE[HY000
我从 Django 1.7 升级到 Django 1.9。我有多次迁移。升级后我无法再创建新的数据库。 问题是“django manage.py migrate”运行检查。检查导入应用程序 URL。这
我在创建数据迁移方面遇到了困难。我的应用程序使用两个数据库。我在 settings.py 中配置了数据库,并创建了一个像 Django docs 中一样的路由器. # settings.py DB_H
我有一个像这样的sql结构: CREATE TABLE resources ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, created_at
我正在尝试使用模式构建器向表添加枚举选项(不丢失当前数据集)。 我真正能够找到的关于列更改的唯一信息是 http://www.flipflops.org/2013/05/25/modify-an-ex
我尝试转移到一些 CMake 程序中,并且有一个从 xml 生成头文件的函数。 生成文件.am adaptor_glue.hpp: dbus_introspect.xml $(DBUSXX_X
我想将文件移至我的 iOS 应用程序的 CoreData 存储 ../Library/Application Support/MyApp/ 至 ../Documents/Stores/ 我可以使用 N
有没有人对数据迁移进出 NetSuite 有丰富的经验?我必须将 DB2 表导出到 MySQL,处理数据,然后导出到一个 CSV 文件中。然后获取帐户的 CSV 文件并再次操作数据以使帐户从我们的旧系
我正在尝试在 Django 上建立一个博客。我已经走到了创建模型的地步。他们在这里: from django.db import models import uuid class Users(mode
我最近使用 bluehost 上的 AutoSSL 工具将网站迁移到 HTTPS。我在内容中看到一些失真,例如缺少背景颜色、表格位移、缺少_logos 等。 有谁知道 HTTPS 迁移效果如何影响样式
我是一名优秀的程序员,十分优秀!