Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поток и ShowModal (Delphi2009)


Страницы:   1 2

NatashaZ ©   (2012-05-31 20:29:00) 

Здравствуйте!
Почему при вызове из неосновного потока форма вызывается по Showmodal, но не закрывается потом по нажатию на [X] или кнопку Exit (Button1), на клике которой процедура Close. Если вызывать ту же форму из основного потока программы, то форма закрывается нормально и так и так. Я слышала, что из потоков лучше не работать с визуальными объектами и может из-за этого проблема, но может есть какой-то обход данной проблемы?


ProgRAMmer Dimonych   (2012-06-05 11:13:00) [1]

> [37] Германн ©   (05.06.12 01:35)
>
> > Но поскольку на протяжении жизни формы меняться оно не
> будет
>
> Ещё как будет! Сделай поиск в исходниках VCL вызовов функции
> RecreateWnd.

Кроме Dock() ничего опасного не нашёл: когда форма уже отображена, менять BorderStyle и т.п. минимум странно.

Хотя, повторяюсь, прекрасно понимаю, что отстаиваю право на жизнь для грязного трюка, который работает только при многих "если". И классика жанра с одним GUI-потоком для меня всегда была в приоритете.


Германн   (2012-06-05 01:35:00) [2]


> Но поскольку на протяжении жизни формы меняться оно не будет

Ещё как будет! Сделай поиск в исходниках VCL вызовов функции RecreateWnd.


Leonid Troyanovsky   (2012-06-05 00:20:00) [3]


> ProgRAMmer Dimonych ©   (04.06.12 12:58) [35]

> Но поскольку на протяжении жизни формы меняться оно не будет

Оно ж не факт. Готов к оному?

--
Regards, LVT.


ProgRAMmer Dimonych   (2012-06-04 12:58:00) [4]

> [32] Anatoly Podgoretsky ©   (01.06.12 11:18)

> [33] Давайте будем жрать!   (01.06.12 11:21)

В теории-то понятно. И что реализация может поменяться со всеми последствиями - тоже ясно. И что нехорошо - очевидно.

Но поскольку на протяжении жизни формы меняться оно не будет, после её создания GetHandle() выполняет присваивание с проверкой условия, которое всегда будет истинным, - без синхронизации этого конкретного обращения всё работает отлично. Т.е. делать неправильно, но можно, если понимать, на каком расстоянии от ноги летит пуля. Зато количество навесного кода сокращается - и намного легче рассмотреть синхронизацию там, где это действительно критично: операции записи, создание/удаление экземпляров.


Dennis I. Komarov   (2012-06-03 11:52:00) [5]


> Давайте будем жрать!   (01.06.12 10:33) [30]

упс, я сюда посмотрел: SendMessage( MainFormHandle, MyMessage, 0, 0);, пардона примите... :-[


Давайте будем жрать!   (2012-06-01 11:21:00) [6]


> когда форма уже создана и в ближайшее время удаляться не
> будет
...то в самом примитивном варианте она передаёт свой хэндл потоку, который хэндл копирует и использует по своему усмотрению.


> почему нет
Потому что хэндл — не поле, а свойство, то бишь замаскированный вызов функции. Последствия непредсказуемы.


Anatoly Podgoretsky   (2012-06-01 11:18:00) [7]

> ProgRAMmer Dimonych  (01.06.2012 10:53:31)  [31]

А не вешать смерть


ProgRAMmer Dimonych   (2012-06-01 10:53:00) [8]

> [30] Давайте будем жрать!   (01.06.12 10:33)

Некрасиво, конечно, но когда форма уже создана и в ближайшее время удаляться не будет, а доступ только для чтения - почему нет? Вешать синхронизацию на всё подряд - это не жизнь.


Давайте будем жрать!   (2012-06-01 10:33:00) [9]

Вызов vcl'ной функции TЧтоТоТам.GetHandle из потока — атата. Мог бы и сам догадаться.


Dennis I. Komarov   (2012-06-01 00:52:00) [10]


> > Такая конструкция разве допускается в потоке SendMessage(Form1.
> > Handle,...)
> Не допускается.
>

Почему?


NatashaZ   (2012-05-31 22:55:00) [11]


> Synchronize forever!

Спасибо, я тоже что-то уже склоняюсь к этому варианту.

Всем спасибо за помощь!


Leonid Troyanovsky   (2012-05-31 22:47:00) [12]


> NatashaZ ©   (31.05.12 22:07) [26]

Synchronize forever!

--
Regards, LVT.


NatashaZ   (2012-05-31 22:07:00) [13]


> куда ввести? в первом сообщении не было ни о каком вводе

Я написала подробности в сообщении №12. Просто не знала, что они так важны в моем вопросе.


NatashaZ   (2012-05-31 22:05:00) [14]

Может я не так выразилась, но под глобальной переменной я имела в виду переменные объявленные так:
type
 TForm1 = class(TForm)
...
 protected
...
 private
 { Private declarations }
 public
 { Public declarations }
// variables
pA, pB, pC, iX, iZ,:integer;
...
end;

var...

implementation...


Давайте будем жрать!   (2012-05-31 22:03:00) [15]


> На счет хэндла подумаю еще, поэкспериментирую.
Подумать нелишне, но SendMessage в данном случае неактуален.


> а должны поменяться аж 5 штук переменных, объявленных ранее
> и используемых потом в других потоках и юнитах программы
Нужно создать объект, который будет инкапсулировать эти данные и записывать в который будет только модальная форма (ну, или код, выполняемый после закрытия формы), а читать все остальные. Плюс почитать, что такое singleton.


Max   (2012-05-31 22:00:00) [16]


> Ввести числовое значение надо, толку тут с месаджбокса?

куда ввести? в первом сообщении не было ни о каком вводе


NatashaZ   (2012-05-31 21:58:00) [17]


> Windows.MessageBox

Не подходит, потому что

> Ввести числовое значение надо


NatashaZ   (2012-05-31 21:57:00) [18]

На счет хэндла подумаю еще, поэкспериментирую.
Спасибо за ссылку по поводу переменных. Но уменя такая ситуация, что после отработки потока должны поменяться аж 5 штук переменных, объявленных ранее и используемых потом в других потоках и юнитах программы. Как в таком случае использовать  изолированные переменные в потоке или той же формы ввода, если потом переменные еще гда-то понадобятся, причем сразу 3 штуки в одной функции, которая в свою очередь должна будет вернуть 2 переменных? То же вычисление корней квадратного уравнения - как далее использовать полученные корни в других функциях без записи их значений в объявленные заранее глобальные переменные?


Давайте будем жрать!   (2012-05-31 21:55:00) [19]

Ввести числовое значение надо, толку тут с месаджбокса?


Max   (2012-05-31 21:53:00) [20]


> Сергей М

опередил :)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо