Другие языки программирования и технологии

[ delphi] почему виснет Form вовремя выполнения задач в другом потоке?

почему у меня форма программы виснет? если я все дела запускаю в другом потоке. .
может изза того что я в execute процедуру запускаю через Synchronize?
Synchronize выполняет метод В ГЛАВНОМ потоке, а не в том, из которого ты его вызвал. А главный поток нужно подождать. Иными словами ты не получишь прироста скорости от использования потоков, вызывая их через Synchronize. Выдержка из справки делфи (хоть иногда её читай :)):

Когда вы используете объекты из иерархии классов, их свойства и методы не гарантируется потокобезопасными. То есть, доступ к свойствам и методам выполнения может выполнять некоторые действия, которые используют память, которая не защищена от действий других потоков. В связи с этим, основной поток отводится для доступа к VCL и CLX объектов. Это поток, который обрабатывает все окна сообщений, полученных компонентов приложения.

Если все объекты, доступ к их свойствам и выполнять свои методы в этом одном потоке, вам не нужно беспокоиться о безопасности ваших объектов мешая друг другу. Для использования основного потока, создать отдельную программу, которая выполняет необходимые действия. Назовите этот отдельную процедуру из вашего метода синхронизации потока. Например:

procedure TMyThread.PushTheButton;
begin
Button1.Click;
end;
procedure TMyThread.Execute;
begin
...
Synchronize(PushTheButton);
...
end;

Синхронизация ждет главный поток, чтобы войти в цикл обработки сообщений, а затем выполняет переданные методом.

Внимание

Поскольку синхронизация использует цикл обработки сообщений, она не работает в консольных приложений. Вы должны использовать другие механизмы, такие как критические секции, для защиты доступа к VCL или CLX объектов в консольных приложений.

Вам не всегда нужно использовать основной поток. Некоторые объекты потока известно. Опуская использованием метода синхронизации, когда вы знаете методы объекта являются потокобезопасными улучшить производительность, поскольку вам не нужно ждать, пока поток VCL или CLX, чтобы войти в цикл обработки сообщений. Вам не нужно использовать синхронизацию метод для следующих объектов:

Компоненты доступа к данным являются потокобезопасными следующим образом: Для BDE с поддержкой данных, каждый поток должен иметь свой собственный компонент сессии базы данных. Единственное исключение составляет случай, если вы используете Microsoft Access драйверов, которые строятся с использованием библиотеки Microsoft, которая не поточно-ориентированными. Для DBExpress, до тех пор, как в библиотеке поставщика клиент потокобезопасными, DBExpress компоненты будут потокобезопасными. ADO и InterBaseExpress компонентами являются потокобезопасными.
При использовании компонентов доступа к данным, вы все равно должны обернуть все вызовы, которые связаны с базами данных управления в синхронизации методом. Так, например, необходимо синхронизировать вызовы, которые связывают данные контроля данных, установив свойство DataSet объекта источника данных, но вам не нужно синхронизировать доступ к данным в поле набора данных.

Для получения дополнительной информации об использовании базы данных сессий с потоками в BDE-приложений см. в разделе Управление несколькими сессиями.
Управление не поточно-ориентированными.
Графические объекты являются потокобезопасными. Вам не нужно использовать основные VCL или CLX поток доступ TFont, TPen, TBrush, TBitmap, TMetafile (VCL только) , TDrawing (CLX только) , или TIcon. Холст объекты могут быть использованы за пределами синхронизация метода блокировки их.

В то время как список объектов, не потокобезопасными, вы можете использовать поточно-версии, TThreadList вместо TList.

Вызовите CheckSynchronize рутинной периодически в основном потоке приложения, так что фоновые потоки можно синхронизировать их выполнение с основным потоком. Лучшее место, чтобы позвонить CheckSynchronize, когда приложение находится в режиме ожидания (например, от OnIdle обработчик события) . Это гарантирует, что это безопасно, чтобы вызовы методов в фоновом потоке.
НЛ
Николай Лукашов
12 779
Лучший ответ
Видимо синхронизируешь криво.. . А посмотри с помощью ProcExp, какой тред отжирает ресурсы, и что у него в стэке)
Анчугин Олег
Анчугин Олег
69 854