Привет.
Есть проект в котором обрашение к БД осушествляется ассинхронно через стронную библиотеку.
При создании формы нужно на основе данных из БД добавить определенные контролы на форму.
Как правильно синнхронизировать потоки, чтобы форма была сконструировано до показа формы?
Re: Конфигурирование формы данными получаемые из БД ассинхро
Здравствуйте, Hamlet, Вы писали:
H>Привет. H>Есть проект в котором обрашение к БД осушествляется ассинхронно через стронную библиотеку. H>При создании формы нужно на основе данных из БД добавить определенные контролы на форму. H>Как правильно синнхронизировать потоки, чтобы форма была сконструировано до показа формы?
Бесконечная рекурсия detected...
Видимо тебе нужен Control.Invoke
Re[2]: Конфигурирование формы данными получаемые из БД ассин
Здравствуйте, Hamlet, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>Бесконечная рекурсия detected...
G>>Видимо тебе нужен Control.Invoke
H>Недумаю что поможет. Упрошенно,я могу обратится к БД только с помощью метода H>void QueryDB(string query, DataRetrivingFinishedCallBack callBack)
и?
Re[4]: Конфигурирование формы данными получаемые из БД ассин
и..... вопрос из первого поста....
Как правильно синнхронизировать потоки, чтобы форма была сконструировано до показа методом Show?
Ведь пока я получу данные в колбеке, UI поток может добежать до канадской границы...
Re[5]: Конфигурирование формы данными получаемые из БД ассин
Здравствуйте, Hamlet, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>и?
H>и..... вопрос из первого поста.... H>Как правильно синнхронизировать потоки, чтобы форма была сконструировано до показа методом Show? H>Ведь пока я получу данные в колбеке, UI поток может добежать до канадской границы...
в коллбеке вызвать Show для формы через Invoke.
Re[6]: Конфигурирование формы данными получаемые из БД ассин
Здравствуйте, gandjustas, Вы писали:
G>Ну есть еще способы, но они примерно так же работают.
G>А что тебя в этом не устраивает? Control.Invoke специально придумал чтобы маршалить вызовы в UI поток.
Думал сделать ивнт в классе формы на завершение загрузки данных а в создающей форму классе подписаться
и вызвать Show. Но както непонравился. И еще,если нужно запросить данные в Load-е то как тогда быть?
Re[9]: Конфигурирование формы данными получаемые из БД ассин
Здравствуйте, Hamlet, Вы писали:
H>и вызвать Show. Но както непонравился. И еще,если нужно запросить данные в Load-е то как тогда быть?
В каком Load'e? Вообще говоря, решение зависит от реализации QueryDB — нужен-ли ей message loop и использует-ли она Invoke для вызова DataRetrivingFinishedCallBack, то есть в каком потоке вызывается этот CallBack. Если нет, то можно просто взвести в callback'e EventWaitHandle, а основным потоком сначала его дождаться, и потом уже создавать форму и вызывать Application.Run. Ну или вариации вокруг этого.
"Нормальные герои всегда идут в обход!"
Re[10]: Конфигурирование формы данными получаемые из БД асси
Вообще говоря, решение зависит от реализации QueryDB — нужен-ли ей message loop и использует-ли она Invoke для вызова DataRetrivingFinishedCallBack, то есть в каком потоке вызывается этот CallBack.
QueryDB реализован через BackgroundWorker, тоесть DataRetrivingFinishedCallBack вызывается в потке UI.
Если нет, то можно просто взвести в callback'e EventWaitHandle, а основным потоком сначала его дождаться,
можно поподробнее,как грамотно это организовать?
Re: Конфигурирование формы данными получаемые из БД ассинхро
Здравствуйте, Hamlet, Вы писали:
H>Есть проект в котором обрашение к БД осушествляется ассинхронно через стронную библиотеку. H>При создании формы нужно на основе данных из БД добавить определенные контролы на форму. H>Как правильно синнхронизировать потоки, чтобы форма была сконструировано до показа формы?
Самый простой вариант это висеть в конструкторе формы (в while — thread.sleep) до тех пор пока от базы данных не придет ответ.
Re[2]: Конфигурирование формы данными получаемые из БД ассин
Здравствуйте, Undying, Вы писали:
U>Здравствуйте, Hamlet, Вы писали:
H>>Есть проект в котором обрашение к БД осушествляется ассинхронно через стронную библиотеку. H>>При создании формы нужно на основе данных из БД добавить определенные контролы на форму. H>>Как правильно синнхронизировать потоки, чтобы форма была сконструировано до показа формы?
U>Самый простой вариант это висеть в конструкторе формы (в while — thread.sleep) до тех пор пока от базы данных не придет ответ.
Если я буду висеть в конструкторе ожидая получении данных из БД скажем так
while( !bRetrived )
Thread.Sleep(500);
то небудет проблемы с Invoke(DataRetrivingFinishedCallBack)?
Re[11]: Конфигурирование формы данными получаемые из БД асси
Здравствуйте, Hamlet, Вы писали:
H>QueryDB реализован через BackgroundWorker, тоесть DataRetrivingFinishedCallBack вызывается в потке UI.
H> Если нет, то можно просто взвести в callback'e EventWaitHandle, а основным потоком сначала его дождаться,
H>можно поподробнее,как грамотно это организовать?
Никак. Если коллбэк вызывается в UI потоке, то event не годится. В WinApi есть MsgWaitForMultipleObject, но её аналог в NET мне не известен. Но можно вывести сплэш на время получения данных, а уже потом создавать главную форму.
"Нормальные герои всегда идут в обход!"
Re[3]: Конфигурирование формы данными получаемые из БД ассин
Здравствуйте, Hamlet, Вы писали:
H>Если я буду висеть в конструкторе ожидая получении данных из БД скажем так H>
H>while( !bRetrived )
H> Thread.Sleep(500);
H>
H>то небудет проблемы с Invoke(DataRetrivingFinishedCallBack)?
Не знаю. Но я не совсем понимаю, зачем функции обращения к базе нагружать работой с ГУИ? Код обращающийся к базе должен вернуть данные, которые мы и ждем вися в цикле, а затем на основании этих данных уже что-то добавляем на форму. Соответственно все работа с ГУИ идет из главного потока и никаких проблем не может возникнуть в принципе.
Re[2]: Конфигурирование формы данными получаемые из БД ассин
Здравствуйте, Undying, Вы писали:
U>Здравствуйте, Hamlet, Вы писали:
H>>Есть проект в котором обрашение к БД осушествляется ассинхронно через стронную библиотеку. H>>При создании формы нужно на основе данных из БД добавить определенные контролы на форму. H>>Как правильно синнхронизировать потоки, чтобы форма была сконструировано до показа формы?
U>Самый простой вариант это висеть в конструкторе формы (в while — thread.sleep) до тех пор пока от базы данных не придет ответ.
Если я буду висеть в конструкторе ожидая получении данных из БД скажем так
while( !bRetrived )
Thred.Sleep(500);
то у ммнея разве небудет проблемы