Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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 будет довольно проблемно.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам