Конфигурирование формы данными получаемые из БД ассинхронно
От: Hamlet Армения  
Дата: 19.09.10 19:42
Оценка:
Привет.
Есть проект в котором обрашение к БД осушествляется ассинхронно через стронную библиотеку.
При создании формы нужно на основе данных из БД добавить определенные контролы на форму.
Как правильно синнхронизировать потоки, чтобы форма была сконструировано до показа формы?
Re: Конфигурирование формы данными получаемые из БД ассинхро
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.09.10 19:49
Оценка:
Здравствуйте, Hamlet, Вы писали:

H>Привет.

H>Есть проект в котором обрашение к БД осушествляется ассинхронно через стронную библиотеку.
H>При создании формы нужно на основе данных из БД добавить определенные контролы на форму.
H>Как правильно синнхронизировать потоки, чтобы форма была сконструировано до показа формы?

Бесконечная рекурсия detected...

Видимо тебе нужен Control.Invoke
Re[2]: Конфигурирование формы данными получаемые из БД ассин
От: Hamlet Армения  
Дата: 19.09.10 20:03
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Бесконечная рекурсия detected...


G>Видимо тебе нужен Control.Invoke


Недумаю что поможет. Упрошенно,я могу обратится к БД только с помощью метода
void QueryDB(string query, DataRetrivingFinishedCallBack callBack).
Re[3]: Конфигурирование формы данными получаемые из БД ассин
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.09.10 20:04
Оценка:
Здравствуйте, Hamlet, Вы писали:

H>Здравствуйте, gandjustas, Вы писали:


G>>Бесконечная рекурсия detected...


G>>Видимо тебе нужен Control.Invoke


H>Недумаю что поможет. Упрошенно,я могу обратится к БД только с помощью метода

H>void QueryDB(string query, DataRetrivingFinishedCallBack callBack)

и?
Re[4]: Конфигурирование формы данными получаемые из БД ассин
От: Hamlet Армения  
Дата: 19.09.10 20:09
Оценка:
Здравствуйте, gandjustas, Вы писали:


G>и?


и..... вопрос из первого поста....
Как правильно синнхронизировать потоки, чтобы форма была сконструировано до показа методом Show?
Ведь пока я получу данные в колбеке, UI поток может добежать до канадской границы...
Re[5]: Конфигурирование формы данными получаемые из БД ассин
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.09.10 20:11
Оценка: +2
Здравствуйте, Hamlet, Вы писали:

H>Здравствуйте, gandjustas, Вы писали:



G>>и?


H>и..... вопрос из первого поста....

H>Как правильно синнхронизировать потоки, чтобы форма была сконструировано до показа методом Show?
H>Ведь пока я получу данные в колбеке, UI поток может добежать до канадской границы...

в коллбеке вызвать Show для формы через Invoke.
Re[6]: Конфигурирование формы данными получаемые из БД ассин
От: Hamlet Армения  
Дата: 19.09.10 20:14
Оценка:
Здравствуйте, gandjustas, Вы писали:


G>в коллбеке вызвать Show для формы через Invoke.


О_О ..... и никак иначе?
Re[7]: Конфигурирование формы данными получаемые из БД ассин
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.09.10 20:19
Оценка:
Здравствуйте, Hamlet, Вы писали:

H>Здравствуйте, gandjustas, Вы писали:



G>>в коллбеке вызвать Show для формы через Invoke.


H>О_О ..... и никак иначе?


Ну есть еще способы, но они примерно так же работают.

А что тебя в этом не устраивает? Control.Invoke специально придумал чтобы маршалить вызовы в UI поток.
Re[8]: Конфигурирование формы данными получаемые из БД ассин
От: Hamlet Армения  
Дата: 19.09.10 20:29
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Ну есть еще способы, но они примерно так же работают.


G>А что тебя в этом не устраивает? Control.Invoke специально придумал чтобы маршалить вызовы в UI поток.


Думал сделать ивнт в классе формы на завершение загрузки данных а в создающей форму классе подписаться
и вызвать Show. Но както непонравился. И еще,если нужно запросить данные в Load-е то как тогда быть?
Re[9]: Конфигурирование формы данными получаемые из БД ассин
От: Jolly Roger  
Дата: 20.09.10 04:32
Оценка:
Здравствуйте, Hamlet, Вы писали:

H>и вызвать Show. Но както непонравился. И еще,если нужно запросить данные в Load-е то как тогда быть?


В каком Load'e? Вообще говоря, решение зависит от реализации QueryDB — нужен-ли ей message loop и использует-ли она Invoke для вызова DataRetrivingFinishedCallBack, то есть в каком потоке вызывается этот CallBack. Если нет, то можно просто взвести в callback'e EventWaitHandle, а основным потоком сначала его дождаться, и потом уже создавать форму и вызывать Application.Run. Ну или вариации вокруг этого.
"Нормальные герои всегда идут в обход!"
Re[10]: Конфигурирование формы данными получаемые из БД асси
От: Hamlet Армения  
Дата: 20.09.10 05:56
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>В каком Load'e?

В обработчике события Load формы.

Вообще говоря, решение зависит от реализации QueryDB — нужен-ли ей message loop и использует-ли она Invoke для вызова DataRetrivingFinishedCallBack, то есть в каком потоке вызывается этот CallBack.

QueryDB реализован через BackgroundWorker, тоесть DataRetrivingFinishedCallBack вызывается в потке UI.

Если нет, то можно просто взвести в callback'e EventWaitHandle, а основным потоком сначала его дождаться,

можно поподробнее,как грамотно это организовать?
Re: Конфигурирование формы данными получаемые из БД ассинхро
От: Undying Россия  
Дата: 20.09.10 08:05
Оценка:
Здравствуйте, Hamlet, Вы писали:

H>Есть проект в котором обрашение к БД осушествляется ассинхронно через стронную библиотеку.

H>При создании формы нужно на основе данных из БД добавить определенные контролы на форму.
H>Как правильно синнхронизировать потоки, чтобы форма была сконструировано до показа формы?

Самый простой вариант это висеть в конструкторе формы (в while — thread.sleep) до тех пор пока от базы данных не придет ответ.
Re[2]: Конфигурирование формы данными получаемые из БД ассин
От: Hamlet Армения  
Дата: 20.09.10 09:54
Оценка:
Здравствуйте, Undying, Вы писали:

U>Здравствуйте, Hamlet, Вы писали:


H>>Есть проект в котором обрашение к БД осушествляется ассинхронно через стронную библиотеку.

H>>При создании формы нужно на основе данных из БД добавить определенные контролы на форму.
H>>Как правильно синнхронизировать потоки, чтобы форма была сконструировано до показа формы?

U>Самый простой вариант это висеть в конструкторе формы (в while — thread.sleep) до тех пор пока от базы данных не придет ответ.


Если я буду висеть в конструкторе ожидая получении данных из БД скажем так
while( !bRetrived )
    Thread.Sleep(500);

то небудет проблемы с Invoke(DataRetrivingFinishedCallBack)?
Re[11]: Конфигурирование формы данными получаемые из БД асси
От: Jolly Roger  
Дата: 20.09.10 10:51
Оценка:
Здравствуйте, Hamlet, Вы писали:

H>QueryDB реализован через BackgroundWorker, тоесть DataRetrivingFinishedCallBack вызывается в потке UI.


H> Если нет, то можно просто взвести в callback'e EventWaitHandle, а основным потоком сначала его дождаться,


H>можно поподробнее,как грамотно это организовать?


Никак. Если коллбэк вызывается в UI потоке, то event не годится. В WinApi есть MsgWaitForMultipleObject, но её аналог в NET мне не известен. Но можно вывести сплэш на время получения данных, а уже потом создавать главную форму.
"Нормальные герои всегда идут в обход!"
Re[3]: Конфигурирование формы данными получаемые из БД ассин
От: Undying Россия  
Дата: 20.09.10 10:55
Оценка:
Здравствуйте, Hamlet, Вы писали:

H>Если я буду висеть в конструкторе ожидая получении данных из БД скажем так

H>
H>while( !bRetrived )
H>    Thread.Sleep(500);
H>

H>то небудет проблемы с Invoke(DataRetrivingFinishedCallBack)?

Не знаю. Но я не совсем понимаю, зачем функции обращения к базе нагружать работой с ГУИ? Код обращающийся к базе должен вернуть данные, которые мы и ждем вися в цикле, а затем на основании этих данных уже что-то добавляем на форму. Соответственно все работа с ГУИ идет из главного потока и никаких проблем не может возникнуть в принципе.
Re[2]: Конфигурирование формы данными получаемые из БД ассин
От: Hamlet Армения  
Дата: 20.09.10 11:02
Оценка:
Здравствуйте, Undying, Вы писали:

U>Здравствуйте, Hamlet, Вы писали:


H>>Есть проект в котором обрашение к БД осушествляется ассинхронно через стронную библиотеку.

H>>При создании формы нужно на основе данных из БД добавить определенные контролы на форму.
H>>Как правильно синнхронизировать потоки, чтобы форма была сконструировано до показа формы?

U>Самый простой вариант это висеть в конструкторе формы (в while — thread.sleep) до тех пор пока от базы данных не придет ответ.


Если я буду висеть в конструкторе ожидая получении данных из БД скажем так
while( !bRetrived )
Thred.Sleep(500);
то у ммнея разве небудет проблемы

Псмотрим код:

public Ctor()
{
   QueryDBAsync(query, DataRetrivingFinishedCallBack);
   while( !bRetrived )
    Thred.Sleep(500);
   ConfigureFormDependedOnRetrivedData();
} 
private void QueryDBAsync(string query, FinishedEventHandler dataRetrivingFinishedCallBack)
{
    BackgroundWorker bgWorker = GetConfiguredBGWorker();
    bgWorker.RunWorkerAsync(new Arguments(Query = query, Handler = dataRetrivingFinishedCallBack))
}

private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
    Arguments arg = e.Argument as Arguments;
    arg.Result = QueryDB(query);
    e.Result = arg;

    bRetrived = true;
}


private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    Arguments arg = e.Result as Arguments;

    if (arg.Handler != null)
    {
          arg.Handler(arg.Result);
    }
}


Так bgWorker_RunWorkerCompleted совсем невызывается, думаю потому, что при вызове в потоке UI он спит в то вреям.

Попрвьте меня если неправ. буду благодарен.
Re[3]: Конфигурирование формы данными получаемые из БД ассин
От: Hamlet Армения  
Дата: 20.09.10 12:14
Оценка:
Неужели все так безнадежно?
Re[4]: Конфигурирование формы данными получаемые из БД ассин
От: Jolly Roger  
Дата: 20.09.10 16:39
Оценка:
Здравствуйте, Hamlet, Вы писали:

H>Неужели все так безнадежно?


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

static class Program
{
    /// <summary>
    /// Главная точка входа для приложения.
    /// </summary>

    class SplashForm : Form
    { }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var appCtx = new ApplicationContext();
        var splash = new SplashForm();
        QueryDB(query, (...)=> {CreateMainForm(appCtx, splash);});
        splash.Show();
        Application.Run(appCtx);
    }

    static void CreateMainForm(ApplicationContext ctx, Form splash)
    {
        splash.Dispose();
        splash = null;
        ctx.MainForm = new Form1();
        ctx.MainForm.Show();
    }
}
"Нормальные герои всегда идут в обход!"
Re[5]: Конфигурирование формы данными получаемые из БД ассин
От: Hamlet Армения  
Дата: 20.09.10 17:40
Оценка:
Здравствуйте, Jolly Roger, Вы писали:


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


Нет, так нелзя, так как Show должно вузватся извне класса.
Тоесть
MyForm _form  = new MyForm();
_form.Show();
Re[6]: Конфигурирование формы данными получаемые из БД ассин
От: Jolly Roger  
Дата: 21.09.10 00:23
Оценка:
Здравствуйте, Hamlet, Вы писали:

H>Нет, так нелзя


Ну нельзя, так нельзя. Спросите у того, кто запретил, как можно.
"Нормальные герои всегда идут в обход!"
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.