2013-03-11 3 views
1

У меня есть концептуальный вопрос о многопоточности:Работа с потоками с DCOM

в приложении с помощью RPC через DCOM, с многопоточной конфигурации, кухня объединена с основной формой замерзает.

1 - Если CriticalSession создается при инициализации устройства, код в критическом сеансе будет выполняться в контексте основного потока?

2 - Когда вы вызываете метод для выполнения задачи:
Тема 1 создана. (DCOM Thread)
Резьба 1 создает нить 2.
Тема 1 WaitFor Thread 2.
Резьба 2 создает 4 потока, чтобы быстрее выполнять задачу.
Резьба 2 петли спать 2 секунды до конца 4 потоков. В этих процессах основная форма должна быть обновлена, чтобы отобразить процент выполненных действий. Сообщение отправляется в основной поток формы с процентом, но ничего не происходит, и основная форма замораживается.

3 - Вместо синхронного() метода лучше всего синхронизировать внутри одного из 4 потоков, когда им нужно создать объекты CRUD (Create Read Update Delete) в Thread 2?

4 - 4 темы имеют более высокий приоритет, а основной поток - это проблема? Когда это станет проблемой?

Изображение ниже, представляют архитектуру системы:

System Architecture

+0

Это nitpick, но я бы рекомендовал немного изменить теги, возможно, что-то вроде DCOM, а затем многопоточность, тогда остальное может не понадобиться, поскольку DCOM (теоретически) не выполняется на каком языке клиент и сервер используются. Если это что-то особенное для delphi, можете ли вы добавить дополнительную информацию об этом? Или это просто «вот язык, который я использую, если это имеет значение»? – jrh

+1

@jrh это просто «вот язык, который я использую, если это имеет значение», что-то вроде – EProgrammerNotFound

ответ

4

1: Нет Используя cricital раздел, вы гарантируете, код выполняется в только один нить в то время; на практике любой поток, который вызывает Enter, будет повесить там, пока ни один другой поток, который также запускает этот код, не попадает в вызов Leave. Но это не означает, что он будет работать в основном потоке (проверьте с помощью GetCurrentThreadID)

2: Вы упомянули конфигурацию квартиры, но какая модель резьбы по квартире? Это определяет, когда (D) COM будет сделать синхронизацию потоков для вас. На практике COM будет работать с прокси-заглушками и сортировать за кулисами до траверс границы квартиры (и сети), если вы не выбрали многопоточную квартиру, и в этом случае COM предположит, что компоненты сами позаботятся о проблемах с потоками.

Если я правильно понимаю, основная форма замерзает на «Thread 1 WaitFor Thread 2». Вместо вызова WaitFor вам будет лучше использовать событие OnTerminate в Thread2.

3: Я не уверен, что вы подразумеваете под «объектами CRUD в Thread 2». Если не важно знать, в каком порядке заканчивается 4 потока, я бы предложил вызвать WaitFor по потокам в последовательности. Если это так, вы должны проверить WaitForMultipleObjects.

4: Различные приоритеты не должны быть проблемой. Это может быть проблемой, когда слишком много высокоприоритетных потоков выполняют слишком много работы, поэтому потоки с нормальным приоритетом, выполняющие внутреннюю связь, не могут идти в ногу, но в этом случае вам следует просмотреть, как рабочие потоки сообщают о своей работе.

+0

теперь лучше объяснить? Crud = (создать чтение и удаление), и это MultiThread Apartment. – EProgrammerNotFound

+0

как в доступе к базе данных? Для 4 потоков потребуется соединение с базой данных, или вы не получите повышения производительности, в зависимости от используемой вами базы данных. Мой ответ все еще стоит. –

+0

Не база данных, ха-ха ... Доступ к объектам памяти, я просто использовал аббревиатуру, чтобы упростить ее ввод ... – EProgrammerNotFound