почему у меня форма программы виснет? если я все дела запускаю в другом потоке. .
может изза того что я в execute процедуру запускаю через Synchronize?
Другие языки программирования и технологии
[ delphi] почему виснет Form вовремя выполнения задач в другом потоке?
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 обработчик события) . Это гарантирует, что это безопасно, чтобы вызовы методов в фоновом потоке.
Когда вы используете объекты из иерархии классов, их свойства и методы не гарантируется потокобезопасными. То есть, доступ к свойствам и методам выполнения может выполнять некоторые действия, которые используют память, которая не защищена от действий других потоков. В связи с этим, основной поток отводится для доступа к 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 обработчик события) . Это гарантирует, что это безопасно, чтобы вызовы методов в фоновом потоке.
Видимо синхронизируешь криво.. . А посмотри с помощью ProcExp, какой тред отжирает ресурсы, и что у него в стэке)
Похожие вопросы
- C++ легче Delphi? Почему те кто несмог освоить Delphi идут на кресты
- Есть программу выполнения задачи в Паскале, нужны объяснения, комментарии к каждой строчке программы, а то не все понятно
- а у всех программистов такое - перебор разных вариантов выполнения задачи приносит душевные муки?
- Почему мне на работе дают задачи на подобии этой.
- Почему в ИТ вузе мы изучаем интегрирование всем потоком уже 1.5 курса в сумме? Где это используется?
- Почему практически все уроки и задачи на с/с++ в основном на арифметику и работу со строками и файлами?
- Задача на Delphi. Аааа решите пожалуйста :'(
- Помогите составить задачу в Delphi
- программисты помогите срочно задача на Delphi
- Delphi. Зависает при выполнении цикла