Страница: 1 |
Страница: 1 |
Вопрос: ActiveX.exe и UserControl
Добавлено: 06.09.06 18:32
Автор вопроса: Nash Bridges
А как делать и юзать UserContol'ы в таком типе EXE ?
т.е. не создается объект в отдельном треде, если есть загруженная форма с UserControl'ом на борту...
UserControl находится в этом же проекте.
Знаю, LOL давно с ActiveX EXE эксперементирует... Как успехи?
Ответы
Всего ответов: 15
Номер ответа: 1
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #1
Добавлено: 06.09.06 18:54
Знакомая тема. Фича в том, что если ты в основном треде просто создаешь форму, то активикс сервер не считает её за объект. Т.е. при создании другого экземпляра класса он подымется в том же потоке.
Я делал по-другому. В основном треде создавал класс базового потока, из которого уже подымал форму (только не в конструкторе, инача абзац - out of memory). В таком случае все работает корректно.
Насчет юзерконтролов - хм... Создать его в другом потоке напрямую будет непросто, потому как сервер создает потоки только для объектов, создаваемых извне. Но можно попробовать написать паблик класс-обертку для контрола, поднимать его в новом потоке и из него создавать контрол динамически. Должно сработать, но на деле надо пробовать...
Понятное дело, это относится к тем контролам что не создаются при помощи CreateObject. С этими должно быть реально проще. Завтра будет время - попробую.
Номер ответа: 2
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #2
Добавлено: 06.09.06 20:36
Т.е. у меня вот что.
Про потоки все понятно. Все создается и работает. У меня весь пользовательский интерфейс в основном потоке, и просто объект в новом треде. Все работает. ТредАйди везде разные.
Если же я на форму в основном потоке помещаю UserControl, то соответственно при создании объекта по CreateObject возникает ошибка типа "Класс не правильно зарегистрирован.". Т.о. получается что нельзя иметь поток на объект и пользоваться UserControl в одном проекте.
При этом как попробывать добавить юзерконтрол динамически тоже не очень понятно, Controls.Add ошибку выдает на "ProjectName.UserControl1". А в VB5 я так понял вообще нет Add у Controls.
Номер ответа: 3
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #3
Добавлено: 07.09.06 12:09
Скорее всего это ошибка кастинга. Для большинства визуальных контролов через CreateObject ты можешь создать только его объект, но не сам элемент управления. Т.е. ты не можешь его прицепить на форму, отобразить, присвоить соотвествующего типа переменной и т.п. Ну а с Controls.Add че-то у тебя глюкануло, должно все работать. Единственный вопрос - в контексте какого потока этот контрол будет создан - в потоке, его создающем, или в потоке формы, для которой вызывается Controls.Add. Попробую проверить.
ЗЫ Ты случаем не в IDE тестируешь? Там такая схема вообще работать не будет.
Номер ответа: 4
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #4
Добавлено: 07.09.06 12:19
1. Как выянилось, Controls.Add нету в VB5. Ну не в этом суть.
2. Я не создаю контрол через CreateObject. Я кладу его на форму в дизайнере. Как создавать и юзать контрол через CreateObject - это отдельная песня.
3. Контрол принадлежит форме, соответственно, контект основного потока. В объекте-треде НЕТ ВИЗУАЛЬНЫХ ЭЛЕМЕНТОВ ИНТЕРФЕЙСА.
4. НЕТ, НЕ В IDE
И так еще раз вопрос.
Есть форма, на ней юзерконтрол из этого же проекта. По кнопке пытаюсь создать объект в новом потоке по CreateObject. Т.о. НЕ СОЗДАЕТСЯ ОБЪЕКТ В НОВОМ ПОТОКЕ. Вообще, не создается по CreateObject, вываливает ошибку на CreateObject.
Номер ответа: 5
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #5
Добавлено: 07.09.06 13:28
Ааа... Ну тада понятно Извини, не так понял.
1. Положить свой ВБшный контрол в дизайнере ты сможешь ТОЛЬКО в SingleThreaded модели. В противном случае дизайнер тебе это не позволит.
2. В SingleThreaded проекте нельзя создавать новые потоки. Это должно быть понятно из определения.
Динамически такой контрол тоже добавить не выйдет - поскольку контрол однопоточный тебе вылезет ошибка о неверном типе контрола.
Насколько я понял, если после добавления контрола в настройках выставить ThreadPerObject - компилятор эту настройку просто игнорирует.
Тут думать нада...
Номер ответа: 6
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #6
Добавлено: 07.09.06 13:33
Пардон, был неправ. Все получилось.
Создал свой UserControl (на базе тупого TextBox), создал новый поток который в него инфу выводит - и все ок. В общем, обманул компилятор. Насколько надежно это - не знаю, пока глюков не видел.
Номер ответа: 7
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #7
Добавлено: 07.09.06 13:36
В общем, ищи ошибку в другом месте. Где-то че-то ты недосмотрел )
ЗЫ А вообще первоначальное мое понимание темы (посты 1 и 3) заинтересовало. Надо поэкспериментировать
Номер ответа: 8
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #8
Добавлено: 07.09.06 13:40
посмотри у тебя ТредАйди получились одинаковыми, у объекта и у формы.
Номер ответа: 9
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #9
Добавлено: 07.09.06 13:44
Разные. Если бы они были одинаковыми - смогли бы форма и рабочий поток работать параллельно? Как ты сам думаешь?
Номер ответа: 10
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #10
Добавлено: 07.09.06 13:50
пришли посмотрю set собак starnet.ru
Номер ответа: 11
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #11
Добавлено: 07.09.06 13:55
Вроде ушло. Там тупой проектик без всяких обработок и синхронизации, поэтому после закрытия основной формы рабочий поток продолжает кочегарить. Это следует учесть.
Номер ответа: 12
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #12
Добавлено: 07.09.06 14:07
спасиб, получил. я тоже мьютексы использую под это дело.
да реально вроде работает, спсиб еще раз.
видимо фишка в том, что ты форму тоже из объекта показываешь.
сейчас буду приводить в соотсетствие...
Номер ответа: 13
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #13
Добавлено: 07.09.06 14:17
Ну ты даешь... Я же тебе в первом же посте писал
Фича в том, что если ты в основном треде просто создаешь форму, то активикс сервер не считает её за объект. Т.е. при создании другого экземпляра класса он подымется в том же потоке.
Я делал по-другому. В основном треде создавал класс базового потока, из которого уже подымал форму (только не в конструкторе, инача абзац - out of memory). В таком случае все работает корректно.
Ну, всегда пожалуйста
Номер ответа: 14
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #14
Добавлено: 07.09.06 14:34
да чего-то не понял я тебя
Номер ответа: 15
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #15
Добавлено: 07.09.06 15:30
Да, я тебя тоже сначала не до конца понял. А самый юмор - UserControl к этой проблеме не имеет вообще никакого отношения )
А вот по поводу создания UC в отдельном потоке - это уже интереснее... Но, боюсь, на VB будет довольно проблемно.