问题标签 [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 投票
1 回答
1385 浏览

delphi - Delphi webbrowser获取tthread对象中的所有链接

我无法在 tthread 对象中运行我的代码。它应该遍历 twebbrowser 中的所有链接,然后如果 url 包含“http://www.ebay.com/itm/”,则将其复制到备忘录中。该代码在 mainform 中完美运行,但在 tthread 对象中不起作用。

我的代码:

我得到的错误

模块 mshtml.dll 中地址 xxxxxx 的访问冲突

感谢阅读和所有回复。

0 投票
1 回答
803 浏览

c++ - 在非阻塞模式下的 TThread 中使用 TClientSocket 时,OnConnect 事件未触发

我正在尝试TClientSocket在多线程 C++ Windows 应用程序中以非阻塞模式使用 Borlands 组件。我正在创建多个线程(派生自 的类TThread),每个线程都创建自己的TClientSocket对象。然后我分配线程类的成员函数作为套接字的OnConnect,OnDisconnect和事件的事件处理程序。OnSocketError我在这里遇到的问题是,每当我TClientSocket::Open()从函数内部调用TThread::Execute()函数时,OnConnect事件都不会触发。但是,当我在调用Open()函数之前从 VCL 线程调用函数时TThread::Execute(),所有事件都会触发,我可以根据需要使用线程-套接字组合。现在我还没有在文档中读到任何内容TClientSocket在线程内使用时不应在非阻塞模式下使用,但在我看来,我尝试使用此类的方式在概念上可能存在问题。Borland 文档在这个主题上相当糟糕,这些组件现在已被弃用,因此很难获得可靠的信息。尽管已被弃用,但我必须使用它们,因为我拥有的 Builder 6 包中没有其他选择。任何人都可以告诉我是否有正确/错误的使用方式TThread和非阻塞TClientSocket组合。我从来没有在使用它作为 VCL 线程的一部分时遇到过问题,也从来没有遇到过使用 TServerSocket 的问题,我真的不明白为什么有些事件没有触发。

0 投票
1 回答
558 浏览

c++ - 使用多个 TClientSocket 实例导致 Windows 句柄泄漏的 C++ 应用程序

TClientSocket我在使用 Borland/Embarcadero组件时遇到了明显的手柄泄漏。我有一个创建多个TThread实例的应用程序,每个实例TClientSocket动态创建一个对象,连接到它的目标发送一些消息,然后被删除。然后TThread删除实例(使用FreeOnTerminate = true)设置。我知道这效率低下,但它完美地满足了应用程序的需求——TThread能够同时存在的最大实例数限制为 32。我看到的问题是我可以看到一个明显的 windows 句柄泄漏问题通过任务管理器。为了隔离问题,我在单线程意义上应用了相同的问题,只是动态创建了一个TClientSocket对象并在主 VCL 线程中的单个循环内完成后再次删除它。这表现出相同的手柄泄漏问题。我知道该组件已被弃用,并且我知道我正在做的事情效率低下,但我不明白为什么会有句柄泄漏。在删除对象之前是否需要对对象执行任何操作TClientSocket以消除此句柄泄漏,或者这是组件中的错误?我在非阻塞模式下使用套接字并将事件处理程序分配给OnConnect OnDisconnectOnSocketError

0 投票
4 回答
4799 浏览

delphi - 使用 FreeOnTerminate = True 对 TThread 进行 Delphi 单元测试

当 FreeOnTerminate = True 时,为 TThread 后代编写 Delphi DUnit 测试的最佳方法是什么?TThread 后代返回一个我需要测试的引用,但我不知道如何等待线程在测试中完成......

任何想法都会受到欢迎。

德尔福 2010。

0 投票
3 回答
7412 浏览

delphi - 为什么 MessageBox 不会阻塞同步线程上的应用程序?

据我了解并知道 TThread 类的方法,如果您同步代码,它实际上会在主应用程序线程中执行(就像计时器/按钮单击/等)我一直在玩耍并注意到一个MessageBox 不会阻塞主应用程序,但是 sleep 会按预期进行。这是为什么?

0 投票
2 回答
993 浏览

multithreading - 终止线程变量并将其设置为 NULL

TThread后代一起工作时,我基本上有一个选择:

  • 设置FreeOnTerminatetrue删除我的TThread后代对象但不将其设置为NULL
  • 手动完成并自己完成删除它的所有麻烦

我基本上需要的是一种确定线程是否正在运行的方法,所以我做了以下事情:

此代码按原样工作。我的问题是:

  • 有没有办法简化这个?完成后我需要设置MyThread为 NULL,以便在下次调用启动/重新启动之前该对象不存在?这不能通过FreeOnTerminate设置为 true 来完成,因为它会删除对象。我只能尝试访问然后生成异常的对象(我可以捕获但它是愚蠢的)。在初始化或重新启动之前,我真的只需要知道 MyThread 是否已完成执行。

  • 我可以在不终止线程的情况下重新启动线程吗(在程序完成之前我真的不需要删除对象) - 如果我启动线程,我会得到“无法在正在运行或挂起的线程上调用启动”异常。

0 投票
1 回答
680 浏览

delphi - 使用 TThread 构造函数释放 Pascal 2.6.2 错误

Free Pascal 2.6.2 编译器(使用 Delphi 模式)抱怨

带有此错误消息:

我用

这似乎是由 2.6.2 中的更改引起的,TThread 现在有一个带有可选第二个参数的构造函数声明:

0 投票
1 回答
933 浏览

delphi - 线程未在打开的非模态表单上执行

以下是“进度”表单的部分代码。
除了 ProgressBars(从代码中删除)之外,它还有一个 TLabel (LblDots),我想更改其中的标题(点数增加)。
在 FormShow/FormClose 中,TDotterThread 被创建和销毁。

问题:
我看到 Synchronize(DoUpdate) 过程仅在程序不做繁重工作时才调用更新标签。

这是进度表:

该表单的调用和创建方式如下:

我究竟做错了什么?
TIA

0 投票
2 回答
318 浏览

multithreading - 我什么时候需要在 TThread 中同步?

我知道您需要synchronize (yourprocedure)设置例如标签的文本。但是关于:

  1. 阅读标签的文本。
  2. 切换/设置标签的启用属性。
  3. 调用其他标签程序/函数(例如 onclick 事件)。

当我需要使用时,是否有一个简单的规则可以知道/记住synchronize

PS.: 同步类似于 PostMessage/SendMessage 吗?

0 投票
1 回答
518 浏览

multithreading - Multiple TThread Instances

I have a TThread Class that can run independently and terminates and frees itself after it's done. I considered the termination and everything works. The problem is, that I would like to add a feature that the user can select and choose how many SYNCHRONOUS threads should be active at the same time. An example would be:

  • The program has to do 100 total tasks!
  • The user chooses 3 Threads should be running at the same time to complete all the tasks.

The first step I did was to create 3 instances of my TThread Class and the resume them in a for loop. So 3 threads are running. After the first thread is done (or terminated), another new instance needs to be created and resumed.

I get stuck on this point and I wonder how I can realize this. Any advice would be helpful.

Edit: Some Code