![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поток и ShowModal (Delphi2009)
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]
> Сергей М
опередил :)