Синхронизация форм

vbnet2000
Дата: 22.05.2006 20:11:36
В MDI-приложении VS2005 есть вызовы форм
........
Dim Form1 As New frNxFirmMap
Form1.MdiParent = MDI
Form1.Show
........
'обработка выбора юзера на форме
Надо докрутить какой-то свой синхронизатор, чтобы .SHOW работало как .SHOWDIALOG, но естественно ВСЕ MDI-приложение неохота вешать - это ведь не ввод пароля на вход в приложение - там ведь еще десятки независимых цепочек форм...
Чисто мультипоточные решения тут наверное не пойдут, ведь MDI - это не многопоточность, а какая-то псевдомультипоточность, совершенно не видимая на уровне THREAD. Я вообще-то пишу мультипоточные решения и тут меня видимо просто переклинивает - не могу понять как засинхронизировать все это в ОДНОМ ПОТОКЕ, ведь и форма FORM1 и код модуля - это один поток....
Как правильно остановить поток в таком модуле - чтоб он ждал сообщения из FORM1_CLOSE?
Только с циклом и периодическим опросом флажка - спасибо, такой подсказки не надо...
Sa
Дата: 23.05.2006 07:18:04

vbnet2000

ведь MDI - это не многопоточность, а какая-то псевдомультипоточность, совершенно не видимая на уровне THREAD.

MDI даже концептуально не имеет отношение к "tread"

vbnet2000

Надо докрутить какой-то свой синхронизатор, чтобы .SHOW работало как .SHOWDIALOG, но естественно ВСЕ MDI-приложение неохота вешать - это ведь не ввод пароля на вход в приложение - там ведь еще десятки независимых цепочек форм...

А зачем ? не могу найти этому практическое применение. Первое впечатление что то с проектированием приложения не получилось.

uid = Sa

Posted via ActualForum NNTP Server 1.3

Vw
Дата: 23.05.2006 08:29:19
Кстати очень интересная тема.У меня тоже такая идея была
вызывать MDI формы в диалоговом режиме. Правда насчет реализации ещё не думал.
vbnet2000
Дата: 23.05.2006 13:55:35
MDI даже концептуально не имеет отношение к "tread"
Позвольте не согласится. Это некая форма мультипоточности, только организованная без Threading.Thread. Вот я ща из ОДНОГО потока(модуля) двадцать форм загружу и каждая будет слушать пользовательский ввод даже после завершения стартующего потока. Это и называется MDI. Другое дело эти же двадцать форм можно запустить каждую в своем потоке system.threading.thread

НО ПО ВНЕШНЕМУ ПОВЕДЕНИЮ ПРИЛОЖЕНИЯ ВЫ ПРАКТИЧЕСКИ НЕ ОПРЕДЕЛИТЕ РАЗНИЦУ (если конечно хватает процессорного времени и обработки прерываются). Это я и называю псевдомультипоточность. Ну термин может и кривой, мною самим выдуманный, но смысл от этого не меняется. По внешнему виду приложения вы не отличите обычное MDI от настоящего мультипоточного приложения.

А зачем ? не могу найти этому практическое применение. 
Первое впечатление что то с проектированием приложения не получилось.
Привожу конкретный пример. В администраторе интернет магазина делается десятки разнообразных задач. Одна проблема - сформировать скажем правильно наценку, вторая - экспортировать итоговый прайс, третья - начислить менеджерам проценты. Всего около семидесяти форм. Некоторые задачи - это цепочки вызовов последовательных форм. Те надо сначала допустим проверить список уволенных менеджеров, а потом только начислять им проценты, потом ЗП. Каждый последующий шаг без итогов предыдущего - абсолютно бессмысленный. Те загрузку последующей формы надо приостанавливать до результата из предыдущей формы. Но зачем же подвешивать ВСЕ приложение. Там ведь решаются еще десятки задач (каждая в своей независимой цепочке форм) - ну например, приходование чего-то на склад. Отчего же это должно подвешиваться из-за того, что идет обработка уволенных менеджеров??? Надеюсь я понятно обьяснился....

Кстати очень интересная тема.У меня тоже такая идея была
вызывать MDI формы в диалоговом режиме. Правда насчет реализации ещё не думал.
Безусловно. Но я просто пишу всякие сетевые-многопоточные вещи, ну типа, скажем чатов, прокси-серверов и тут меня просто клинит. Не понимаю как все эти механизмы прикрутить к MDI. Но что такое маршалинг в поток формы - понимаю, такое пишу постоянно. Вот ща застрял, как подвешивать некие отдельные цепочки задач, НЕ ПОДВЕШИВАЯ ВСЕ ПРИЛОЖЕНИЕ. Ну и чтобы это не раскрывалось на весь экран, а было чисто MDI-формой. Буду благодарен за правильную подсказку...
Sa
Дата: 23.05.2006 14:23:29

vbnet2000

Привожу конкретный пример. В администраторе интернет магазина делается десятки разнообразных задач. Одна проблема - сформировать скажем правильно наценку, вторая - экспортировать итоговый прайс, третья - начислить менеджерам проценты. Всего около семидесяти форм. Некоторые задачи - это цепочки вызовов последовательных форм. Те надо сначала допустим проверить список уволенных менеджеров, а потом только начислять им проценты, потом ЗП. Каждый последующий шаг без итогов предыдущего - абсолютно бессмысленный. Те загрузку последующей формы надо приостанавливать до результата из предыдущей формы. Но зачем же подвешивать ВСЕ приложение.

а почему нельзя назвать совокупность этих форм, образующих цепочку, каким то подходящим названием и дисциплинированно, последовательно заставить пользователя выполнять необходимые шаги, двигаясь к конечной цели?

uid = Sa

Posted via ActualForum NNTP Server 1.3

vbnet2000
Дата: 23.05.2006 23:07:26
Да уж куда больше дисциплинировать задачу - как последовательностями модальных форм. В этом и заключается вопрос топика.
Как в NET2005 ПРАВИЛЬНО СОЗДАТЬ последовательности модальных форм внутри MDI-приложения.
Только ShowModal кривое решение - во первых, потому что БЛОКИРУЕТСЯ ВСЕ MDI-приложение, а это абсолютно неприемлимо.
Альтернативное решение с простой модальной формой, раскрываемой на все окно, что тоже абсолютно неприемлимо.

Следовательно нужен элементарный механизм синхронизации форм, о котором я и задал вопрос в это топике.
Опять же простой опрос в цикле флажка, который взводится по FORM_CLOSE - тоже неприемлимое решение.
Sa
Дата: 24.05.2006 06:41:55

vbnet2000

Да уж куда больше дисциплинировать задачу - как последовательностями модальных форм

дак никто не предлагает Вам последовательность модальных форм.

Попробуйте использовать user control. Wizzard-форма с совокупностью этих User Control'ов - один из вариантов решения задачи.

uid = Sa

Posted via ActualForum NNTP Server 1.3

vbnet2000
Дата: 24.05.2006 10:33:48
Да, В ПРИНЦИПЕ, решение типа WIZARD возможно. Только оно проигрывает собственному механизму синхронизации по нескольким причинам:

1.Все формы массшабируемые, те сожержат горы вот такого кода:
    Private Sub frNxFirmMap_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
        FirmGridView.Height = Me.Height - 165
        TovarGridView.Height = Me.Height - 60
        TovarGridView.Width = Me.Width - 210
        TovarGridView.Columns(4).Width = TovarGridView.Width - 170
    End Sub
Не радует все это переписывать. Да и вообще шевелить отлаженные формы нет желания.

2.Не все формы в последовательности модальные. Много простых, которые можно использовать для справки. Выпрыгивание их вне окна визарда - тоже выглядит крайне убого.

3.Уже написан некий движок по последовательностям форм, позволяющий вызывать НЕОБЯЗАТЕЛЬНЫЕ формы в цепочке решения задачи ОПЦИОНАЛЬНО для решения каждой конкретной проблемы. (галочками на рисунке). Только увы ОБЯЗАТЕЛЬНЫЕ (модальные) формы вешают в нем ВСЕ MDI-приложение, что совершенно неприемлимо, тк автономных цепочек проблем получаются десятки и вешать допустим перевод денег из-за приходования на склад - это ж просто маразм. Кроме того, бывает надо что-то справочно посмотреть совсем в другой цепочке.

Вот почему все и уперлось в собственный механизм синхронизации форм. А как ни кручу - он все кривее и кривее получается. Если свежих идей не будет - просто придется флажок в цикле опрашивать. Это решение взамен полностью модальных форм уже отладил - выглядит гораздо лучше, только кривизна решения смущает...
Sa
Дата: 24.05.2006 12:41:14

vbnet2000

Все формы массшабируемые, те сожержат горы вот такого кода
....

а это нафига, есть же свойства Dock, Anchor, класс TableLayoutPanel наконец.

vbnet2000

....
Выпрыгивание их вне окна визарда - тоже выглядит крайне убого.
....

а сейчас как?

vbnet2000

....
А как ни кручу - он все кривее и кривее получается.
....

когда к этому все сводится, и тем более существует попытка прикрутить что то к чему что явно не предназначено для того чтобы это что то прикручивали - это ошибка проектирования. Да и не MDI у вас уже получился.
Нчего не навязываю, не зная предметной области, не могу предложить что то альтернативное.

P.S. Попробуйте найти "удачную" программу-аналог и повторить проверенную идею.

uid = Sa

Posted via ActualForum NNTP Server 1.3

vbnet2000
Дата: 24.05.2006 15:23:51
1. Юзер растягивает форму - как обычно требуется перепозиционировать все контролы на форме, и сетки естественно должны растянутся ТОЛЬКО в нужных столбцах. Не понимаю причем тут вообще "Dock, Anchor, класс TableLayoutPanel". Как вы этими перечисленными свойствами добиваетесь растягивания сеток и растягивания ТОЛЬКО нужных столбцов внутри сеток? Может такие свойства и есть, а я просто не знаю? Как указанными свойствами вы добиваетесь например, чтоб следующий контрол по горизонтали отступал на 10 Twip от конца предыдущего?

2.а сейчас как? Увы, классического MDI ну никак у меня не получается. Многие окна выпрыгивают за границы MDI. Кстати ВСЕ КЛАСИЧЕСКИЕ МОДАЛЬНЫЕ ОКНА уходят за границы MDI - да еще и блокируют ВСЕ MDI-приложение. Я вообще не понимаю для чего их можно применить в таком виде кроме как для ввода логина-пароля для входа в MDI-приложение. Почему и встал вопрос о своем синхронизаторе форм, чтоб делать это на немодальных формах, которые нормально позиционируются внутри MDI-окна, только запускающий псевдопоток (мой термин) нужно останавливать до завершения работы формы, чтобы следующая форма стартовала имея уже результаты работы предыдущей формы. Те как бы модальность, но НЕ ПОДВЕШИВАЮЩАЯ ВСЕ MDI-приложение, а лишь конкретную цепочку форм, например приходование товара на склад, ну или там начисление процентов менеждерам. А сами цепочки форм независимы друг от друга и подвешиваться естественно одна из другой не должны.

3.Одна прога-аналог с мощным синхронизатором форм в несколько тысяч строк у меня есть. Все формы внутри MDI грузятся как немодальные, там ведутся массивы (я массивов вообще не перевариваю и вообще никогда не использую - пишу типизированные спец-коллекции) загруженных экземпляров форм, а модальность там создается поверх немодальности неким искуственным образом и в сущности все сводится к отлову событий FORM.ACTIVATE. Это все я внимательным образом просмотрел и сделал вывод - писал этот синхронизатор еще более глючный программер, чем я. Если есть пример ХОРОШЕГО синхронизатора форм внутри MDI-приложения дайте ссылку - посмотрю с удовольствием.

4.У меня еще есть много окон вот такого типа:
System.Diagnostics.Process.Start(New System.Diagnostics.ProcessStartInfo(System.IO.Path.GetTempPath))
Их я тоже никак не могу удержать в границах окна MDI-приложения. С ними получается еще хуже, чем просто с модальными окнами. Они просто живут отдельной жизнью (в отдельных потоках) и сохранить их в границах MDI-приложения у меня тоже никак не получается.