Каким образом SyncForm работает в треаде?
От: AlexNek  
Дата: 26.08.11 21:25
Оценка:
Если глянуть на вызов SyncForm, то немодальная форма создается из треада.
Janus\Core\Synchronization\UI\SyncForm.cs
Janus\Core\Synchronization\Synchronizer.cs (PerformSyncSession)
Janus-Common\Synchronization\SyncHelper.cs (DoAsyncSync)
Каким образом все работает, если в дополнительном треаде нет DoEvents?

Спрашиваю потому, что перестало работать и целый вечер искал без толку.
Может это какой то побочный эффект от CreateUIAsyncOperation(), потому как непонятно для чего она там нужна.
avalon 1.0rc3 rev 419, zlib 1.2.3
Re: Каким образом SyncForm работает в треаде?
От: Буравчик Россия  
Дата: 26.08.11 23:19
Оценка:
Здравствуйте, AlexNek, Вы писали:

AN>Может это какой то побочный эффект от CreateUIAsyncOperation(), потому как непонятно для чего она там нужна.


Да, это именно оно.

CreateUIAsyncOperation() создает асинхронную операцию "под управлением" GUI потока. С помощью этой операции можно выполнить код в потоке UI. Для этого нужно вызвать Post или PostOperationCompleted у этой операции и передать в эти методы код, который необходимо выполнить.

В методе DoAsyncSync (Janus-Common\Synchronization\SyncHelper.cs) присутствует код:
provider.GetRequiredService<IUIShell>()
   .CreateUIAsyncOperation()
   .PostOperationCompleted(state => syncFinishedHandler(syncPerformed, stats), null);


Здесь происходит запрос на выполнение в потоке GUI кода syncFinishedHandler(syncPerformed, stats). В свою очередь syncFinishedHandler — метод переданный извне.
Например в методе SyncForums (Janus.Rsdn\Subscription\SubscribeForm.cs) он выглядит так:
(syncPerformed, stats) =>
                {
                    if (syncPerformed)
                        RefreshForm();
                }


Вот и получается:
1. GUI делает запрос на синхронизацию (SyncForums) и передает в качестве параметра syncFinishedHandler нужный код (в данном случае RefreshForm).
2. Создается новый (второй) поток и начинает синхронизацию сообщений (он также знает про syncFinishedHandler)
3. По окончании своей работы второй поток создает операцию для вызова кода в потоке GUI (System.ComponentModel.AsyncOperation через CreateUIAsyncOperation). Потом с помощью этой операции выполняет в потоке GUI код, запомненный в syncFinishedHandler, т.е. фактически обновляет формы.

Вот как-то так.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Best regards, Буравчик
Re[2]: Каким образом SyncForm работает в треаде?
От: AlexNek  
Дата: 27.08.11 10:32
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б> AN>Может это какой то побочный эффект от CreateUIAsyncOperation(), потому как непонятно для чего она там нужна.


Б> Да, это именно оно.


Б> CreateUIAsyncOperation() создает асинхронную операцию "под управлением" GUI потока. С помощью этой операции можно выполнить код в потоке UI. Для этого нужно вызвать Post или PostOperationCompleted у этой операции и передать в эти методы код, который необходимо выполнить.

Ну прямо писатель , спасибки, я там потом увидел SynchronizationContext и понял откуда ветер дует. Теперь бы еще понять отчего перестало работать, окошко просто морозится и всё.

Кстати, помнишь ты писал про синхронизацию потоков при создании базы, так повтор DoEvents приводит к исчезновению контекстного меню в трее. Я этот цикл случайно всегда выполнял (и у меня выход там есть через 10 секунд).
То бишь после первого старта с созданием базы будет отсутствовать контекстное меню.
avalon 1.0rc3 rev 419, zlib 1.2.3
Re: Каким образом SyncForm работает в треаде?
От: AlexNek  
Дата: 27.08.11 11:22
Оценка:
Здравствуйте, AlexNek, Вы писали:

AN> Спрашиваю потому, что перестало работать и целый вечер искал без толку.

Винда, что ли у меня дуреет, сейчас запустил все работает.
avalon 1.0rc3 rev 419, zlib 1.2.3
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.