![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Петрович |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
Ну вот. Не прошло и полгода как я вернулся
Нет. Увы, ты совершил довольно распространенную ошибку! Эту ошибку впервые я увидел в статье какого-то горе программиста. Жаль что она была прочитана многими. Суть ошибки в следующем. Как указано в описании метода Synchronize, тело метода переданного в качестве параметра, выполняется в контексте основного потока программы. Теперь, если посмотреть твой код, то вся работа выполняется в методе MemoAdd. А он, в свою очередь, и был передан как параметр при вызове Synchronize. Следовательно, вся работа будет выполняться в контексте основного потока. Т.е. весь смысл использования дополнительного потока теряется! На самом деле, вся трудоемкая работа должна выполняться в Execute. А Synchronize вызываться только для доступа к методам и свойствам VCL-компонентов. Правильный код будет выглядеть так:
Это правильный метод, рекомендуемый Borland. Однако, как всегда не единственный. Например, есть одна интересная особенность процедуры SendMessage. Дело в том, что эта процедура обеспечивает "синхронный" вызов соответствующей оконной процедуры для обработки посылаемого сообщения. А тонкость в том, что вызов оконной процедуры осуществляется в контексте потока создавшего окно, вне зависимости от контекста потока вызвавшего SendMessage. Обеспечивается это самой Windows. Если же знать что все формы Delphi программа создает в контексте основного потока, то этим можно воспользоваться. Вот что мы можем получить в результате:
В данном примере я специально не использовал тип tThread дабы продемонстрировать использование потоков через WinAPI. Обратите внимание на следующее: 1. Функция потока это именно function которая может возвращать результат. Кроме того, она имеет один параметр, и использует способ передачи параметров stdcall 2. Хендл потока возвращаемый CreateThread должен обязательно закрываться как только становится не нужным. Иначе, будут теряться ресурсы системы, естественно в рамках вашего процесса. В общем, я затронул лишь один из аспектов многопоточных приложений. Белее подробно, рекомендую ознакомиться со статьей: Многопоточность - как это делается в Дельфи. (Перевод статьи "Martin Harvey. Multithreading - The Delphi Way." сделанный Борисом Новгородовым) Это просто ОТЛИЧНАЯ статья. Добавлено @ 09:41 Да, кстати. Совсем забыл. Под Delphi, вместо лучше CreateThread использовать BeginThread Это сообщение отредактировал(а) Girder - 26.7.2005, 16:10 -------------------- Все знать невозможно, но хочется |
||||||
|
|||||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |