Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10

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

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

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Есть второстепенный поток. Туда подгружается библиотека. Есть ли возможность/способ создания формы этим потоком из этой библиотеки?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.09.2008, 13:40
Ответы с готовыми решениями:

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

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

Передача процессу функции внедрения длл через другую длл (Очень сложно и не понятно)
Допустим у меня есть dll1.dll и 2 процесса game.exe и calc.exe, мне нужно написать длл т.е. dll2.dll, которая будет внедрятся в calc.exe и...

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

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

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

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

Это действительно так?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
22.09.2008, 14:24
Цитата Сообщение от Rusty Посмотреть сообщение
Добавлено через 14 минут 13 секунд
Вот еще что...

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

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

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

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

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

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

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
22.09.2008, 16:12  [ТС]
Цитата Сообщение от oxotnik Посмотреть сообщение
Помнится как то в теле потока вызвал ShowMessage, на что получил экзепшн, типа канвас не доступен...
хотя вот такая конструкция вроде не глючит:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
22.09.2008, 16:28
так эту галку тебе в любом случае снимать надо будет, чтобы проект на тачках без билдера заработал...
0
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
22.09.2008, 18:27  [ТС]
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
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
23.09.2008, 09:16
Цитата Сообщение от 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
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
23.09.2008, 11:08  [ТС]
Цитата Сообщение от oxotnik Посмотреть сообщение
так если посмотреть внимательно, то она создается от некого "абстрактного" класса TForm и соответсвенно поля свойств типа Caption не заполнены.
То есть, необходимо динамически создавать все элементы формы и, соответственно, обработчики событий?


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

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

С использованием синхронайза все более-менее прозрачно.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
23.09.2008, 11:21
Цитата Сообщение от Rusty Посмотреть сообщение
То есть, необходимо динамически создавать все элементы формы и, соответственно, обработчики событий?
не обязательно ВСЕ делать динамически.
создается в дизайне Form2 с контролами и событиями на эти контролы (вобщем все как для обычного приложения, только в опциях проекта убираешь эту форму из автосоздаваемых в доступные) затем в потоке:
Code
1
2
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
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
23.09.2008, 12:36  [ТС]
Цитата Сообщение от oxotnik Посмотреть сообщение
создается в дизайне Form2 с контролами и событиями на эти контролы (вобщем все как для обычного приложения, только в опциях проекта убираешь эту форму из автосоздаваемых в доступные) затем в потоке...
+

Code
1
2
3
4
5
6
7
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
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
23.09.2008, 13:48
Code
1
2
3
4
5
6
7
DWORD WINAPI Thread (LPVOID pParam)
{
    TForm2 *Form2 = new TForm2(Form1); // TForm2 создаешь в дизайне
    Form2->ShowModal();
    delete Form2;
    return S_OK;
}
Owner тут не причем - это владелец, который автоматом при уничтожении очищает дочерние объекты
0
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
23.09.2008, 14:24  [ТС]
Цитата Сообщение от oxotnik Посмотреть сообщение
Code
1
2
3
4
5
6
7
DWORD WINAPI Thread (LPVOID pParam)
{
    TForm2 *Form2 = new TForm2(Form1); // TForm2 создаешь в дизайне
    Form2->ShowModal();
    delete Form2;
    return S_OK;
}
Owner тут не причем - это владелец, который автоматом при уничтожении очищает дочерние объекты
No Effect.
Не работает в таком виде - форма выводится пустая. Хотя там и кнопки и едиты в дизайне. Может какие тонкости есть?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
23.09.2008, 14:57
а справка по-своему права: все дело в том что при вызове конструктора TForm2(Owner) сначала вызываются родительские конструкторы, начиная с TObject, и заканчивая TForm, таким образом, все объекты, которые в дизайне накиданы на форму в конструкторе TForm2 уже созданы и требуют Canvas для отрисовки, а т.к. мы это дело проворачиваем в отдельном потоке, то канва не успевает еще отриваться, поэтому эксепшн возникает.
Выходом будет либо до ShowModal пробедаться по всем объектам и каким то образом указать канву, либо такую операцию проделать в конструкторе TForm2
0
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 10
23.09.2008, 17:02  [ТС]
Цитата Сообщение от oxotnik Посмотреть сообщение
... Выходом будет либо до ShowModal пробедаться по всем объектам и каким то образом указать канву, либо такую операцию проделать в конструкторе TForm2
TForm, TImage, TBitmap, TPaintBox - Canvas только для чтения.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
23.09.2008, 17:46
либо объекты формы создавать динамически, либо форму со всеми объектами в основном потоке, а управлять уже этой формой в дочернем

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

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


Думаю нет смысла продолжать. На 3/5 форумов подтвердили:
"GUIовая часть VCL расчитанна на работу ТОЛЬКО из главного потока приложения, так что попытки создавать в ней что то из ниток обречены на провал с самого начала"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.09.2008, 18:20
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru