Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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 如果主线程不空闲,如何阻止其他线程使用同步?_Multithreading_Delphi - Fatal编程技术网

Multithreading 如果主线程不空闲,如何阻止其他线程使用同步?

Multithreading 如果主线程不空闲,如何阻止其他线程使用同步?,multithreading,delphi,Multithreading,Delphi,我有一个主窗体(线程)的TListView和许多其他线程,它们使用同步方法从列表中添加/删除项。但是主线程也有一个修改列表项的方法,我希望该方法不会被希望在主线程中执行代码的其他线程中断。这可能吗?你有证据表明你担心的事情正在发生吗?你不应该,因为这不可能发生。这就是同步的目的。在主线程中执行的方法必须完成,然后主线程才能为消息队列提供服务,以处理通过工作线程Synchronize发送的工作项,这样您就不用担心了 当工作线程使用Synchronize时,它实际上只是向主线程发布一条消息,告诉它有

我有一个主窗体(线程)的TListView和许多其他线程,它们使用同步方法从列表中添加/删除项。但是主线程也有一个修改列表项的方法,我希望该方法不会被希望在主线程中执行代码的其他线程中断。这可能吗?

你有证据表明你担心的事情正在发生吗?你不应该,因为这不可能发生。这就是同步的目的。在主线程中执行的方法必须完成,然后主线程才能为消息队列提供服务,以处理通过工作线程
Synchronize
发送的工作项,这样您就不用担心了

当工作线程使用
Synchronize
时,它实际上只是向主线程发布一条消息,告诉它有工作要做。如果主线程正忙于执行另一个方法,那么工作线程将简单地阻塞,直到主线程完成,随后处理消息队列,拾取工作项,执行它,然后将工作已完成的消息发回工作线程(让工作线程空闲,然后继续)


当然,这是假设主线程中的方法没有调用
应用程序.ProcessMessages()
CheckSynchronize()
(或者您正在使用一个复杂的组件来执行此操作,或者类似的操作,而您不知道它->请参见:)

您是否有证据表明您担心的事情正在发生?你不应该,因为这不可能发生。这就是同步的目的。在主线程中执行的方法必须完成,然后主线程才能为消息队列提供服务,以处理通过工作线程
Synchronize
发送的工作项,这样您就不用担心了

当工作线程使用
Synchronize
时,它实际上只是向主线程发布一条消息,告诉它有工作要做。如果主线程正忙于执行另一个方法,那么工作线程将简单地阻塞,直到主线程完成,随后处理消息队列,拾取工作项,执行它,然后将工作已完成的消息发回工作线程(让工作线程空闲,然后继续)


当然,这是假设主线程中的方法没有调用
Application.ProcessMessages()
CheckSynchronize()
(或者您正在使用一个复杂的组件来执行此操作,或者类似的操作,而您不知道它->请参见:)

主线程只能在您让它被中断的情况下被中断。你在这样做吗?只有让主线程被中断,它才能被中断。你这样做了吗?那么,你是说当工作线程调用Synchronize时,只有当主线程完成了它正在做的事情时,代码才会在主线程中执行?主线程或多或少只是在等待消息并处理它。在Delphi中,任何形式的事件都只是为了响应处理消息而调用的。搞乱这些事情的一个简单方法是在这样一个事件中调用Application.ProcessMessages,因此应该避免或最好禁止它。@marusnebunu是的。主线程一次只能做一件事。如果它正在执行您的方法,那么它不能同时检查告诉它线程有工作要做的消息。它在当前工作完成时执行此操作(这就是为什么它被称为消息循环-检查工作?->执行工作->检查工作?->执行工作->等等)
Application.ProcessMessages
将导致问题,因为这会明确指示主线程在继续已在执行的工作之前检查工作(并执行)。如果您没有调用
ProcessMessages
,您就没事了。那么,您是说当工作线程调用Synchronize时,只有当主线程完成了它正在做的事情时,该代码才会在主线程中执行?主线程或多或少只是在等待一条消息并对其进行处理。在Delphi中,任何形式的事件都只是为了响应处理消息而调用的。搞乱这些事情的一个简单方法是在这样一个事件中调用Application.ProcessMessages,因此应该避免或最好禁止它。@marusnebunu是的。主线程一次只能做一件事。如果它正在执行您的方法,那么它不能同时检查告诉它线程有工作要做的消息。它在当前工作完成时执行此操作(这就是为什么它被称为消息循环-检查工作?->执行工作->检查工作?->执行工作->等等)
Application.ProcessMessages
将导致问题,因为这会明确指示主线程在继续已在执行的工作之前检查工作(并执行)。如果您没有调用
ProcessMessages
,您就没事了。