Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.87
Rusty
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
#1

Создание формы вторым потоком из ДЛЛ? - C++ Builder

22.09.2008, 13:40. Просмотров 3625. Ответов 18
Метки нет (Все метки)

Доброго времени суток.
Есть второстепенный поток. Туда подгружается библиотека. Есть ли возможность/способ создания формы этим потоком из этой библиотеки?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2008, 13:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Создание формы вторым потоком из ДЛЛ? (C++ Builder):

Использование формы рабочим (вторым) потоком
Добрый день. Запускаю рабочий поток, который производит расчеты и по их...

При перезапуске таймера он запускается вторым потоком
Господа, у меня возникла следующая трудность: я управляю состоянием...

C# Создание и использование длл
Пробую сделать длл на С# и на нём же к ней обратиться, но функция ничего не...

Запуск формы отдельным потоком
Доброго времени суток! С показом формы пользователю все просто ...

Фокус на TextBox внутри формы отдельным потоком
Доброй ночи, есть форма, внутри нее браузер. Допустим захожу на Вконтакте и...

Форма с фоновым потоком. Ошибка при закрытии формы
Всех приветствую! Есть приложение, состоящее из формы и фонового потока...

18
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
22.09.2008, 13:47 #2
Эм...ну так сделай в этой библиотеке функцию, создающую окно. Вызови.
0
Rusty
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
22.09.2008, 14:13  [ТС] #3
Цитата Сообщение от Vourhey Посмотреть сообщение
Эм...ну так сделай в этой библиотеке функцию, создающую окно. Вызови.
Проблема в том, что либо возникают ошибки доступа, либо если все нормально проходит, то при выходе происходит утечка памяти.

Чтобы были более понятны обстоятельства проблемы:
Существует проект на сибилдере, в проекте несколько второстепенных потоков. Один из потоков - консольный, туда подключен интерпретатор опенбейсик (ОБ). В ОБ подгружается библиотека с формой, которую собственно и надо вывести (желательно немодально), тут и начинаются проблемы.

Добавлено через 14 минут 13 секунд
Вот еще что...

На одном из форумов ответили:
"GUIовая часть VCL расчитанна на работу ТОЛЬКО из главного потока приложения, так что попытки создавать в ней что то из ниток обречены на провал с самого начала"

Это действительно так?
0
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
22.09.2008, 14:24 #4
Цитата Сообщение от Rusty Посмотреть сообщение
Добавлено через 14 минут 13 секунд
Вот еще что...

На одном из форумов ответили:
"GUIовая часть VCL расчитанна на работу ТОЛЬКО из главного потока приложения, так что попытки создавать в ней что то из ниток обречены на провал с самого начала"

Это действительно так?
Не верю, что классы vcl, относящиеся к гую могут работать только в главном потоке.
0
Rusty
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
22.09.2008, 15:19  [ТС] #5
Цитата Сообщение от Vourhey Посмотреть сообщение
Не верю, что классы vcl, относящиеся к гую могут работать только в главном потоке.
Собстно, это не было религиозным вопросом

Хотелось бы аргументов, а еще лучше фактов.

Вопрос здесь не о работе (потому как к вцл можно обращаться через синхронайз), а о возможности создания формы во второстепенном потоке в принципе.
0
oxotnik
1610 / 1087 / 71
Регистрация: 21.08.2008
Сообщений: 4,565
Записей в блоге: 1
22.09.2008, 15:54 #6
Цитата Сообщение от Rusty Посмотреть сообщение
Собстно, это не было религиозным вопросом

Хотелось бы аргументов, а еще лучше фактов.

Вопрос здесь не о работе (потому как к вцл можно обращаться через синхронайз), а о возможности создания формы во второстепенном потоке в принципе.
Помнится как то в теле потока вызвал ShowMessage, на что получил экзепшн, типа канвас не доступен...
хотя вот такая конструкция вроде не глючит:

Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    CreateThread(NULL, 0, Thread, NULL, NULL, NULL);

}
//---------------------------------------------------------------------------
DWORD WINAPI Thread (LPVOID pParam)
{
    TForm *Form2 = new TForm(Form1);
    Form2->ShowModal();
    delete Form2;
    return S_OK;

}
однако форма не модальная для основного потока получается, но модальная для своей нити.
1
Rusty
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
22.09.2008, 16:12  [ТС] #7
Цитата Сообщение от oxotnik Посмотреть сообщение
Помнится как то в теле потока вызвал ShowMessage, на что получил экзепшн, типа канвас не доступен...
хотя вот такая конструкция вроде не глючит:

Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    CreateThread(NULL, 0, Thread, NULL, NULL, NULL);

}
//---------------------------------------------------------------------------
DWORD WINAPI Thread (LPVOID pParam)
{
    TForm *Form2 = new TForm(Form1);
    Form2->ShowModal();
    delete Form2;
    return S_OK;

}
однако форма не модальная для основного потока получается, но модальная для своей нити.

Спасибо, попробую.

Сообщение "канвас недоступен" пропало после отключения "Build with runtime packages" в свойствах проекта.



Попробовал...
Вторая форма выводится без заголовка и содержимого.
0
Lord_Voodoo
Супер-модератор
8607 / 2228 / 133
Регистрация: 07.03.2007
Сообщений: 10,803
Завершенные тесты: 1
22.09.2008, 16:28 #8
так эту галку тебе в любом случае снимать надо будет, чтобы проект на тачках без билдера заработал...
0
Rusty
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
22.09.2008, 18:27  [ТС] #9
BCB help:
"... When using objects in the VCL or CLX, use the main thread to execute your code. Using the main thread ensures that the object does not indirectly access any memory that is also used by VCL or CLX objects in other threads. ... "

0
oxotnik
1610 / 1087 / 71
Регистрация: 21.08.2008
Сообщений: 4,565
Записей в блоге: 1
23.09.2008, 09:16 #10
Цитата Сообщение от Rusty Посмотреть сообщение
Попробовал...
Вторая форма выводится без заголовка и содержимого.
так если посмотреть внимательно, то она создается от некого "абстрактного" класса TForm и соответсвенно поля свойств типа Caption не заполнены.

Цитата Сообщение от Rusty Посмотреть сообщение
BCB help:
"... When using objects in the VCL or CLX, use the main thread to execute your code. Using the main thread ensures that the object does not indirectly access any memory that is also used by VCL or CLX objects in other threads. ... "

а что бы не было несанкционированного доступа к занятым участкам памяти, существует синхронизация
ИМХО ничего страшного если ВЦЛ объекты в разных потоках будут создаваться и работать, главное чтоб потоки, пересекаясь между собой не вызывали не валидные указатели.
0
Rusty
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
23.09.2008, 11:08  [ТС] #11
Цитата Сообщение от oxotnik Посмотреть сообщение
так если посмотреть внимательно, то она создается от некого "абстрактного" класса TForm и соответсвенно поля свойств типа Caption не заполнены.
То есть, необходимо динамически создавать все элементы формы и, соответственно, обработчики событий?


"...When using objects in the VCL or CLX, use the main thread to execute your code..."

Я понял это так, что "когда используете объекты в ВЦЛ или ЦЛХ, используйте главный поток для запуска вашего кода" (т.е. кода создания формы)

С использованием синхронайза все более-менее прозрачно.
0
oxotnik
1610 / 1087 / 71
Регистрация: 21.08.2008
Сообщений: 4,565
Записей в блоге: 1
23.09.2008, 11:21 #12
Цитата Сообщение от Rusty Посмотреть сообщение
То есть, необходимо динамически создавать все элементы формы и, соответственно, обработчики событий?
не обязательно ВСЕ делать динамически.
создается в дизайне Form2 с контролами и событиями на эти контролы (вобщем все как для обычного приложения, только в опциях проекта убираешь эту форму из автосоздаваемых в доступные) затем в потоке:
Код
TForm2 *Form2 = new TForm2(Owner);
Form2->Show()/ShowModal();
Цитата Сообщение от Rusty Посмотреть сообщение
"...When using objects in the VCL or CLX, use the main thread to execute your code..."

Я понял это так, что "когда используете объекты в ВЦЛ или ЦЛХ, используйте главный поток для запуска вашего кода" (т.е. кода создания формы)
Собственно дочерний поток всегда инициализируется из главного.
Не вижу причин не создавать ВЦЛ объекты в дочернем потоке при должной синхронизации .
0
Rusty
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
23.09.2008, 12:36  [ТС] #13
Цитата Сообщение от oxotnik Посмотреть сообщение
создается в дизайне Form2 с контролами и событиями на эти контролы (вобщем все как для обычного приложения, только в опциях проекта убираешь эту форму из автосоздаваемых в доступные) затем в потоке...
+

Код
DWORD WINAPI Thread (LPVOID pParam)
{
    TForm *Form2 = new TForm(Form1);
    Form2->ShowModal();
    delete Form2;
    return S_OK;
}
,где TForm(Owner) ---> TForm(Form1)

= No Effect

Цитата Сообщение от oxotnik Посмотреть сообщение
Не вижу причин не создавать ВЦЛ объекты в дочернем потоке при должной синхронизации .
Все надо пробовать и проверять.
0
oxotnik
1610 / 1087 / 71
Регистрация: 21.08.2008
Сообщений: 4,565
Записей в блоге: 1
23.09.2008, 13:48 #14
Код
DWORD WINAPI Thread (LPVOID pParam)
{
    TForm2 *Form2 = new TForm2(Form1); // TForm2 создаешь в дизайне
    Form2->ShowModal();
    delete Form2;
    return S_OK;
}
Owner тут не причем - это владелец, который автоматом при уничтожении очищает дочерние объекты
0
Rusty
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
23.09.2008, 14:24  [ТС] #15
Цитата Сообщение от oxotnik Посмотреть сообщение
Код
DWORD WINAPI Thread (LPVOID pParam)
{
    TForm2 *Form2 = new TForm2(Form1); // TForm2 создаешь в дизайне
    Form2->ShowModal();
    delete Form2;
    return S_OK;
}
Owner тут не причем - это владелец, который автоматом при уничтожении очищает дочерние объекты
No Effect.
Не работает в таком виде - форма выводится пустая. Хотя там и кнопки и едиты в дизайне. Может какие тонкости есть?
0
oxotnik
1610 / 1087 / 71
Регистрация: 21.08.2008
Сообщений: 4,565
Записей в блоге: 1
23.09.2008, 14:57 #16
а справка по-своему права: все дело в том что при вызове конструктора TForm2(Owner) сначала вызываются родительские конструкторы, начиная с TObject, и заканчивая TForm, таким образом, все объекты, которые в дизайне накиданы на форму в конструкторе TForm2 уже созданы и требуют Canvas для отрисовки, а т.к. мы это дело проворачиваем в отдельном потоке, то канва не успевает еще отриваться, поэтому эксепшн возникает.
Выходом будет либо до ShowModal пробедаться по всем объектам и каким то образом указать канву, либо такую операцию проделать в конструкторе TForm2
0
Rusty
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
23.09.2008, 17:02  [ТС] #17
Цитата Сообщение от oxotnik Посмотреть сообщение
... Выходом будет либо до ShowModal пробедаться по всем объектам и каким то образом указать канву, либо такую операцию проделать в конструкторе TForm2
TForm, TImage, TBitmap, TPaintBox - Canvas только для чтения.
0
oxotnik
1610 / 1087 / 71
Регистрация: 21.08.2008
Сообщений: 4,565
Записей в блоге: 1
23.09.2008, 17:46 #18
либо объекты формы создавать динамически, либо форму со всеми объектами в основном потоке, а управлять уже этой формой в дочернем

ЗЫ: а какой практический смысл в этом?
0
Rusty
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
23.09.2008, 18:20  [ТС] #19
Цитата Сообщение от oxotnik Посмотреть сообщение
либо объекты формы создавать динамически, либо форму со всеми объектами в основном потоке, а управлять уже этой формой в дочернем

ЗЫ: а какой практический смысл в этом?
Существует проект на сибилдере, в проекте несколько второстепенных потоков. Один из потоков - консольный, туда подключен интерпретатор опенбейсик (ОБ). В ОБ подгружается библиотека с формой, которую надо вывести (желательно немодально).


Думаю нет смысла продолжать. На 3/5 форумов подтвердили:
"GUIовая часть VCL расчитанна на работу ТОЛЬКО из главного потока приложения, так что попытки создавать в ней что то из ниток обречены на провал с самого начала"
0
23.09.2008, 18:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2008, 18:20
Привет! Вот еще темы с решениями:

CDialogEx + dll, После завершения модального диалога (CDialogEx) из длл-библиотеки работа длл-библиотеки прерывается
Добрый день, подскажите, пожалуйста, новичку с++/mfc. Работаю в VS 2010. ...

Создание формы на сайте. При щелчке внутри поля формы не убирается текст-подсказка
Добрый день! Сам не знаю, как создать форму на сайте, поэтому скопировал код...

Создание интерактивной формы, управление пользователем элементами формы
Добрый день! Подскажите, пожалуйста, возможно ли через Java GUI создать...

Создание у формы события, основанного на событиях компонентов формы
Всем доброго времени суток. Прошу подсказать решение проблемы: Необходимо у...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru