![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| z-END |
|
|||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: 11 Всего: 102 |
собственно есть поток, в нем создается форма, нужна ли для этой формы синхронизация при доступе к ней из самого потока?
У меня все сделано через синхронизацию, но я вот тут подумал, а нужна ли она вообще здесь?! -------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
По идее ничего страшного не произойдет, если сделать так.
Но если нужна гарантия, то лучше послать форме WM_SETTEXT. Добавлено @ 11:36 Посмотрел код. Не зачем возиться с WM_SETTEXT. Присвоение капшена и так его вызывает. Можешь смело присваивать. |
|||
|
||||
| z-END |
|
|||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: 11 Всего: 102 |
Snowy, я нетолько про кэпшен хотел узнать
а вобщем, можно ли обращаться к форме созданной в потоке, атакже ко всем контролам на ней (из самого потока) без синхронизации? -------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
z-END, она нужна в том случае, если кто то в этот момент будет читать твой Caption.
Добавлено @ 12:01
Не советую, т.к. форма же довольно активное создание -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| z-END |
|
|||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: 11 Всего: 102 |
тоесть я правильно понимаю что форма созданная во вторичном потоке приложения "живет" всеравно в основном? -------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Все формы живут в основном.
А вот что у формы можно менять из внешнего потока, а что нельзя, нужно выяснять по коду VCL. По крайней мере параметры окна (положение, текст и т.п. можно менять.) |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Snowy, представь, что ты начал менять Caption формы из вторичного потока и успел написать туда "По" (а хотел "Поток") и в этот момент его выполнение прекращается и главный поток пишет строку "Форма", после чего возобновляется выполнение вторичного потока и он дописывает остаток "ток". В результате получаем "Фоток". Это желаемый результат?
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
<Spawn>, Представь, что ты посылаешь из другого приложения сообщение WM_SETTEXT.
Главный поток получает это сообщение и производит обновление заголовка. Пока он это не сделает, ничего другого он делать не будет. Присваивание Caption'a не присваивает значение переменной. А вызывает Perform(WM_SETTEXT). Получение Caption'a не берет данные из какой-то переменной, а делает WM_GETTEXT. Все это делает главный поток. Вторичный поток замирает, ожидая, когда основной поток завершит действия и вернет управление. Добавлено @ 12:51 Поэтому я и говорю, что некоторые действия можно делать вполне безболезненно. |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
Имхо если все ф-ции формы, будут пренадлежать потоку, то и сообщения от формы будут обрабатыватся в потоке,
и если с формой кроме тя никто работать не будет то можно и без синхронизации, но имхо лучше с ней, "береженого бог бережет , - сказала монашка натягивая. ... " (с) Анектод -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Snowy, да, в данном случае оно так, видимо, и будет, но в случае изменения какой либо строки или массива (в общем то строка это и есть массив
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| z-END |
|
|||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: 11 Всего: 102 |
Snowy, <Spawn>, спасибо=) ну вобщемто так и думал что нельзя...
-------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Отчего ж нельзя. Можно, но не все.
Для гарантии лучше конечно делать все в синхронизации. Но многие вещи доступны и без нее. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Нельзя создать и работать с формами в дополнительном потоке. Увы, такова технология VCL-форм. Работать безопасно можно только с окнами, созданными на чистом Win32API.
Не стоит даже пытаться работать с формами. достаточно просто посмотреть на модуль Forms.pas изнутри. Можно даже по ключевому слову Application. -------------------- |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
И что там такого страшного ? Как это относится к работе с формой ? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Относится напрямую. Формы в Delphi неразрывно связаны с TApplication. Любая форма работает только в основном потоке. Добавлено @ 10:00 На основной вопрос топика, естсетвенно, ответить нельзя. Потому что нельзя создавать формы в дополнительном потоке. При желании можно, конечно. Но это если хочется проблем. -------------------- |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
где это выражено? Добавлено @ 10:14 пример код плз и место откуда он -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Создавать можно. Создание - всего лишь выделение памяти. А она общая.
А вот работать оно все равно будет в основном потоке, т.к. всем рулит главное окно - Application. А оно в главном потоке. |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
Давайте разберемся , что есть форма? Это обычное окно виндов + дополнительные прибамбасы. Я прав?
Если да, то что есть окно - это графическое окно + ф-ция обработки сообщений этого окна, прав? Если да , то кто мешает эту ф-цию засунуть в поток? ( Я так понимаю что все что мы кидаем в метод Exectute класса Tthread это и есть ф-ция которая выполняется отдельно от основного потока, да? Тогда прямо в этом методе можно обозначить ф-цию типа WndProc, и юзать форму отдельно от апликейшена, если я не прав поправьте где? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Демо |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Добавлено @ 11:00
Я бы сказал, что не совсем.
Весь смысл в том, что куды бы ты ни засунул эту функцию, все сообщения будут обрабатываться в основном потоке. Прежде всего. Добавлено @ 11:06
Предлагаю попробовать на практике этот метод. Сразу скажу, что придется 1. владельцем сделать Desktop 2. Все(абсолютно все!) сообщения обрабатывать вручную, от всех контролов на форме, которые хочется видеть. 3. По существу, это будет (почти) обычное окно WinAPI. НО! От TApplication никуда не денешься, а он НЕ ПОТОКОБЕЗАПАСЕН. Обрати внимание на использование TApplication. ИСпользуется без всякой сипнхронизации в недрах VCL. Хочу добавить, что этот вопрос я специально изучал. Ответ по использованию форм в отдельных потоках однозначно отрицательный. Честно - просто не хочу повторяться и переливать из пустого в порожнее. Предлагаю попробовать и самому убедиться. И опять же отошлю к Forms.pas - там все видно прекрасно, как и где используются переменные и классы. Это сообщение отредактировал(а) Демо - 28.2.2006, 11:00 -------------------- |
||||
|
|||||
| Romikgy |
|
||||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
Плз с объяснениями Обратно же почему? Если имеется связь по родительскому окну, то
Это имхо самое правильное замечание Добавлено @ 11:13
Хоть одну ссылку дай на метод? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||||
|
|||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Для TForm эта функция находится в Application. Именно он получает сообщения, а потом раздает их нужным формам. Именно поэтому TForm нельзя засунуть в отдельный поток. Вот, если отказаться от VCL, то можешь выбрать другую процедуру обработки сообщений. Я для TForm она предопределена. |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
А перегрузить нельзя?
не проканает -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Грузи не грузи... Принцип действия такой.
TForm при создании регистрируется у Application. Application получает за нее все сообщения, смотрит кому они адресованы и передает в оконную процедуру нужной формы. То есть окна формы получают сообщения не сами - им их передает Application. Тут тесная взаимосвязь с Application и я не представляю, как ее можно разорвать. Если только код VCL править... Добавлено @ 11:34 Отсюда и действие Application.ProcessMesages. Именно Application разгребает все сообщения, а не формы. Поэтому в длинных циклах виснут все окна, а не одно, если не делать ProcessMessages. Так устроен VCL. Такова его архитектура... Не скажу, что это минус - "умные существа делали". Но ограничений добавляет. |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
Ну подожди , апликейшен это тоже VCL и тоже окно имеющий свой хендл, и имхо сообщения передаются от родительского окна к дочернему, так ?
ЗЫ да и кстати , уходим мы от темы сообщения то вооще то не зависят от потока Да и обработка будет Добавлено @ 11:42
Это понятно , если все выполняется в одном потоке И мне так никто и не показал где в коде форм есть привязка к апликейшену -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Тебе весь Forms.pas выложить сюда? Посмотри классы TScreen, TApplication, TCustomForm. Практически везде используются, во всех методах. БЕЗ учета многопоточности. -------------------- |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
нет , только ссылку где TCustomForm юзает TApplication, и все -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Да почти первая попавшаяся ссылка - procedure TScreen.AlignForms(AForm: TCustomForm; var Rect: TRect); Много где используются TForm/TCustomForm. -------------------- |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Вот VCL заказывает строгую иерархию - от Application формам и т.д. Сообщения нет. А их обработка да. А все и выполняется в одном потоке. Application ловит сообщение и передает принятое сообщение форме. Не посылает, а передает. В своем потоке. |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
где здесь
Или я не правильно вопросы задаю или ..... Добавлено @ 12:23 Кто мешает поменять заказ? Это вызывает соответсвующую ф-цию? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Это не Form юзает Application, а наоборот.
Ты готов сам ловить все сообщения и передавать их во внутренней структуре VCL? Учитывая, что она может поменяться в следующей версии? Учитывая, что после всех трудов это может вообще не заработать? Учитывая, что вероятность получения глюков - 90%? Если готов - пробуй. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Исходи из того, что не TCustomForm использует, а наоборот, её юзают. -------------------- |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
||||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
Что я нашел в формах
Более об Application, упоминаний нет ( при создании окна) Добавлено @ 12:40 Тобишь сделать можно , но дабы не усложнять себе жизнь так не делают! Так правильно? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Теоретически можно все сделать.
Согласись, что проще делать синхронизацию, чем городить огород с отделением TForm от TApplication. Добавлено @ 12:48 Смотри код constructor TCustomForm.CreateNew(AOwner: TComponent; Dummy: Integer); в самом низу строка: Screen.AddForm(Self); Это и есть регистрация формы. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Нет, неправильно. TApplication и TScreen используют методы форм, созданных в приложении, без синхронизации. Я бы увеличил вероятность глюков дло 100% без всяких оговорок. -------------------- |
|||
|
||||
| Romikgy |
|
||||||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
почему теоретически?
Да на все 100% Добавлено @ 12:59 Демо,
Я так понимаю вы это имели ввиду, что апликейшен создает окно а не форм? но последнюю строку никто не отменял, и вызвав ее еще раз но с другим FObjectInstance, который будет в потоке, и все будет работать без проблем никому не хоцца
Это не регистрация для винды, FForms это список, это регестрация внутренней структуры -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||||||
|
|||||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Вот о том и речь, чтобы отрезать от TForm все взаимодействия с TScreen и TApplication. Теоретически это возможно. Но практически я бы даже и пытаться не стал бы. P.S. затянулась наша теоретическая дискуссия. Добавлено @ 13:03 Это регистрация у TApplication - чтобы она сообщения отдавала |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
почему? "Я бы изменил мир , но Бог исходники не дает" (с) не помню автора Согласен заворачиваем с этим -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
![]()
|
| Правила форума "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. |