Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在主线程中使用TAdsSettings对象,在其他线程中使用AdsQuery对象是否安全?_Multithreading_Delphi_Advantage Database Server - Fatal编程技术网

Multithreading 在主线程中使用TAdsSettings对象,在其他线程中使用AdsQuery对象是否安全?

Multithreading 在主线程中使用TAdsSettings对象,在其他线程中使用AdsQuery对象是否安全?,multithreading,delphi,advantage-database-server,Multithreading,Delphi,Advantage Database Server,我有一个Win CGI应用程序,目前正在转换为ISAPI 该应用程序将TDataset子体用于扩展系统Advantage数据库服务器 由于TAdsSettings对象只能有一个实例,因此必须 在主线程中 请求线程中需要TAdsQuery对象 这会起作用吗?也就是说,请求线程中的AdsQueries会起作用吗 从主菜单中的AdsSettings对象中选择全局设置 线程,这是线程安全的吗?如果工作线程和主线程不在主线程中,请确保AdsQueries使用Synchronize直接访问TADSSetti

我有一个Win CGI应用程序,目前正在转换为ISAPI

该应用程序将TDataset子体用于扩展系统Advantage数据库服务器

由于TAdsSettings对象只能有一个实例,因此必须 在主线程中

请求线程中需要TAdsQuery对象

这会起作用吗?也就是说,请求线程中的AdsQueries会起作用吗 从主菜单中的AdsSettings对象中选择全局设置
线程,这是线程安全的吗?

如果工作线程和主线程不在主线程中,请确保AdsQueries使用Synchronize直接访问TADSSetting(或使用消息传递系统在工作线程和主线程之间进行通信,而不是直接访问)(即
system.MainThreadID Windows.GetCurrentThreadID

确保AdsQueries使用Synchronize直接访问TAdsSettings(或使用消息传递系统在工作线程和主线程之间通信,而不是直接访问),如果它们不在主线程中(即
system.MainThreadID Windows.GetCurrentThreadID

是的,它可以工作。TAdsSettings组件修改Advantage Client Engine(ACE)中的设置,使用ISAPI将加载一个ACE实例,供所有线程使用

然而,我不推荐它。根据您正在更改的设置,直接调用ACE API更有意义。例如,如果您只设置日期格式,那么消除TAdsSettings组件并调用AdsSetDateFormat60就更有意义了,因为AdsSetDateFormat60接受一个连接句柄。摆脱TAdsSettings组件可以消除大量设置ACE全局设置的调用。这些调用中的许多都必须有一个sync对象,以便在更改全局时关闭所有连接。这将对性能产生负面影响,特别是在多线程应用程序(如web应用程序)中。而是在指定的连接句柄上进行操作的调用


您可以通过引用TAdsConnection.handle属性或调用TAdsQuery.GetAceConnectionHandle方法来获取连接句柄。

是的,它可以工作。TAdsSettings组件修改Advantage Client Engine(ACE)中的设置,使用ISAPI将加载一个ACE实例,供所有线程使用

然而,我不推荐它。根据您正在更改的设置,直接调用ACE API更有意义。例如,如果您只设置日期格式,那么消除TAdsSettings组件并调用AdsSetDateFormat60就更有意义了,因为AdsSetDateFormat60接受一个连接句柄。摆脱TAdsSettings组件可以消除大量设置ACE全局设置的调用。这些调用中的许多都必须有一个sync对象,以便在更改全局时关闭所有连接。这将对性能产生负面影响,特别是在多线程应用程序(如web应用程序)中。而是在指定的连接句柄上进行操作的调用


您可以通过引用TAdsConnection.handle属性或调用TAdsQuery.GetAceConnectionHandle方法来获取连接句柄。

我也在新闻组中问过这个问题:devzone.advantagedatabase.com,Advantage.Delphi

为了完整起见,我将添加该线程其余部分的进一步问题/答案:

问题(我):

线程中的许多查询当前未附加到 TAdsConnection对象。我正计划为每个人创建一个连接 线程用于这些“孤立”查询,但它是一个大型应用程序 这需要时间。我也很确定,唯一的非默认 TAdsSettings对象中的属性是服务器类型集,它可以 也可以在连接组件中设置,因此一旦完成所有查询 链接到连接时,不需要设置组件。我去看看 直接调用设置API作为替代方法

同时,我确实有一个关于线程和查询的问题 没有指定连接组件。我从帮助文件中注意到 如果多个线程中的查询共享一个连接对象,则 查询将以串行方式运行,而不是同时运行。用一个 每个线程中的连接对象,这不应该是问题,但我是 想知道没有连接对象的查询吗 分配。它们是否会被视为独立于 从多线程并发性的角度来看,它们是什么 被认为是在同一个连接上,因此必须屈服于每个连接 其他的

回答(杰里米):

你需要解决这个问题。他们将只搜索一个全局连接列表 找到一个具有相同路径的,他们将使用该连接。不好的 在多线程应用程序中


因此,根据Jeremy的回答,最好为每个线程创建至少一个TAdsConnection对象,并确保所有查询都附加到该对象,否则可能会发生序列化。

我在新闻组中也提出了这个问题:devzone.advantagedatabase.com,Advantage.Delphi

为了完整起见,我将添加该线程其余部分的进一步问题/答案:

问题(我):

线程中的许多查询当前未附加到 TAdsConnection对象。我正计划为每个人创建一个连接 线程用于这些“孤立”查询,但它是一个大型应用程序 这需要时间。我也很确定,唯一的非默认 TAdsSettings对象中的属性是服务器类型集,它可以 也可以在连接组件中设置,因此一旦完成所有查询 链接到连接时,不需要设置组件。我去看看 调用设置