Несколько вопросов о Threading, COM + и STA квартиры - PullRequest
1 голос
/ 13 марта 2011

У меня есть служба Windows, которая создает 10 потоков + тот, который создает список задач.

Каждый из этих 11 потоков входит в STA, вызывая CoInitialize (nil).

  1. Список задач создается одним потоком, другие получают элемент, обрабатывают его и освобождают ....

a) Может ли другой поток использовать объект, созданный другим потоком? (Это похоже на работу, но ..) б) Может ли другой поток освободить память, выделенную другим потоком? (Кажется, это не работает ...)

Должен ли я каким-то образом маршалировать указатель между потоками? Или я должен, по крайней мере, получить элемент, обработать его, но позволить ему быть "владельцем" потока, который его создал?

  1. В своих службах Windows я создал функциональность, которую я могу использовать для запуска / остановки служб (приостановка и возобновление потоков).

Однако у меня проблема с потоком, который на самом деле собирает данные и делает это в интервале. Когда поток загружает элементы для обработки, после этого он переходит в состояние сна на 5 минут. Как я могу прекратить такую ​​тему безопасно? Как прервать состояние сна?

Заранее спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 13 марта 2011

Возможно, вам придется маршалировать интерфейсы между потоками. Здесь вы можете найти пример C ++, и в этих же статьях показаны три метода, которые вы можете использовать (oMarshalInterThreadInterfaceInStream / CoMarshalInterface / Global Interface Table (GIT)).Более подробную информацию о них вы можете найти в MSDN.

Чтобы поток ожидал, но смог прекратить его до завершения сна, используйте WaitForSingleObject () с правильным значением времени ожидания и, например, событие Windows для ожидания,Когда функции выходят, он сообщает, вышел ли он из-за истечения времени ожидания или установки события.Чтобы выйти из функции ожидания до истечения времени ожидания, просто установите событие.Таким образом, вы можете выбрать, вводить ли еще один цикл ожидания или выйти.

2 голосов
/ 13 марта 2011

Чтобы маршалировать указатель объекта STA между потоками STA, используйте CoMarshallInterThreadInterfaceInStream и CoGetInterfaceAndReleaseStream.

Поток STA ДОЛЖЕН прокачивать сообщения, так как потоки STA используют COM, используя сообщения Windows.Т.е. вы должны вызвать GetMessage / TranslateMessage / DispatchMessage.Вероятно, ваша структура имеет простую функцию обработки сообщений, которую вы можете использовать для этого.

Чтобы отменить состояние сна на 5 минут, выполните несколько снов для более коротких интервалов и установите флажок «следует отказаться».Установите флажок mustquit в главной службе.

...