所以这是我的问题,线程对我来说太混乱了,假设我有5个线程,50个或100个或更多站点。所以,就我学习线程而言,我可以创建构造函数create(link:string)并使用不同的链接启动新线程,但是我需要创建与我需要解析的链接数量一样多的线程。所以如何在线程之间共享变量链接,所以当线程一下载链接listbox1.items [0]时,它会告诉其他人下载数字0,下一个线程应该询问我应该下载什么链接并获得答案listbox1.items [1]和等等,直到他们终止时下载所有链接。 任何人都可以向我提供如何做到的简单示例。线程杀了我:(
答案 0 :(得分:4)
您可以拥有要处理的线程安全的URL列表,以及一个静态大小的工作线程池,每个工作线程一次从列表中获取未处理的URL,处理它(下载和解析)并添加任何找到的新URL只要列表中有任何未处理的项目,就可以循环显示列表。将完成的URL保留在列表中,只将其标记为已完成,以避免递归。
答案 1 :(得分:2)
听起来您只需要设置critical section。
这需要围绕读取下一个URL的代码段进行设置。为此,您通常会在代码的开头放置一个信号量,以便任何时候只有一个线程可以输入它。信号量在代码末尾重置。当每个新线程看到URL列表已过期时,它就会终止。
通常,信号量是布尔值,但它们可以是整数,例如,如果您希望允许特定数量的线程随时进入该区域。
在你的情况下,你可以简单地设置一个全局布尔变量(对所有线程都可见),比如“fSemaphore”。
在区域的开头,线程检查标志。如果为false,则将其设置为true并进入该区域(以获取下一个URL)。 如果是真的,那么它循环 - 例如重复睡眠(0)直到(不是fSemaphore)。 当它退出该区域时,它设置fSemaphore:= False;
显然你需要确保防范可能的无限循环场景......
答案 2 :(得分:1)
为请求URI,结果,错误消息以及Web查询所需的任何内容定义'TURI'类,但用于URI访问的组件除外。从TObject下降应该没问题。创建,初始化其中的100个并将它们推送到生产者 - 消费者队列上(TObjectQueue,TCriticalSection和信号量应该可以正常)。从循环的队列中挂起几个TThreads并处理TURI实例,直到队列为空,然后阻塞。
你没有说你需要对处理过的TURI采取什么行动 - 他们需要在某处释放。如果您希望通知主线程,请PostMessage完成的URI并将其释放到消息处理程序中。
终止线程?当然,如果你真的不得不这样做,那么排队一些对象,告诉他们自杀,(NIL可能 - 线程可以在弹出队列后检查'已分配')。当做这样的事情时,即使我不需要在应用程序运行期间处理任何更多的URI,我仍然会留下线程,这是不值得键入终止它们。
可悲的是,Delphi的例子,我担心,很多教科书,不会比暂停/恢复线程控制更进一步,(不要这样做),以及'TThread.Synchronize','TThread.WaitFor '和'TThread.OnTerminate'。如果你得到这样的教科书,把它带到外面烧掉它 - 你将学会无所不能。