|
|
|
Обращение к экземпляру TForm на с++
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, уважаемые форумчане! Ввиду небольшого опыта работы в Java уповаю на вашу помощь. Задача: в коде на Java обратиться к экземпляру Класса с++ наследника TForm. Пробую использовать JNI. В коде на Java храню переменную nativeHandle (получаю в методе TestJNIForm.initialise()), где находится указатель на экземпляр созданной формы в с++. В процедуре getForm вытаскиваю ее из Java и привожу к TForm. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. Проблема заключается в следующем. Если в Java-коде вызываю метод TestJNIForm.show(), то форма показывается и подвисает. Если вызываю ее в отдельном процессе, то она показывается на мгновение и закрывается. Если в с-коде использовать ShowModal, то отображается нормально, но взаимодействие недоступно. (Взаимодействие для простоты условно реализовано в методах TestJNIForm.setVal(), TestJNIForm.getVal(), изменение заголовка формы, в численном виде, чтобы не отвлекаться на работу со строками) В англоязычном секторе интернета нашел пост, где чел интересовался проблемой один в один с этой, но ему никто не ответил. Буду очень признателен за любые мысли по данному поводу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2015, 12:01 |
|
||
|
Обращение к экземпляру TForm на с++
|
|||
|---|---|---|---|
|
#18+
IMHO я так понимаю вопрос про Borland C ? Какой версии ? ViktorOffПроблема заключается в следующем. Если в Java-коде вызываю метод TestJNIForm.show(), то форма показывается и подвисает. ViktorOffЕсли вызываю ее в отдельном процессе, то она показывается на мгновение и закрывается. Что есть "отдельный процесс"? ViktorOffЕсли в с-коде использовать ShowModal, то отображается нормально, но взаимодействие недоступно. (Взаимодействие для простоты условно реализовано в методах TestJNIForm.setVal(), TestJNIForm.getVal(), изменение заголовка формы, в численном виде, чтобы не отвлекаться на работу со строками) Тут я вообще перестал понимать. Что значит в "с-коде" ? Где и с кем ты хочешь взаимодействовать ? В общем-то это и логично. Ты же делаешь ShowModal, пока форму не закроют, управление возвращаться не должно. IMHO & AFAIK 1 + 2 проблема - какая то дребедень с обработкой очереди сообщений. Читать доку про TApplication и TForm.showModal(). Я бы первым делом вместо модального окна использовал бы обычное + ручками запускал метод TApplication занимающийся выгребанием сообщений из очереди сообщений Windows. IMHO & AFAIK Доки на енбаркадере не нашел, т.ч. ни проверить предположение, ни точнее подсказать не смогу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2015, 13:46 |
|
||
|
Обращение к экземпляру TForm на с++
|
|||
|---|---|---|---|
|
#18+
1. Версия Borland C++ Builder 6. 2. Извиняюсь, имел в виду "потоке" Код: java 1. 2. 3. 4. 5. 6. 7. 3. ShowModal, это я к слову упомянул, что при нем форма показывается без подвисания. Проблема как раз в том, что при показе в немодальном режиме в одном потоке с основным кодом на java, (как и хотелось бы) форма подвисает. Соответственно тут уже не до очереди сообщений, а если запустить в отдельном, форма откроется и закроется. Взаимодействие имелось в виду следующее. В программе на java вызывается нативный метод setVal, а в dll на с++ свойство Caption у формы заполняется этим значением. Если есть желание, там пару файликов с кодом прикручены, очень мало кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2015, 16:34 |
|
||
|
Обращение к экземпляру TForm на с++
|
|||
|---|---|---|---|
|
#18+
ViktorOff3. ShowModal, это я к слову упомянул, что при нем форма показывается без подвисания. Проблема как раз в том, что при показе в немодальном режиме в одном потоке с основным кодом на java, (как и хотелось бы) форма подвисает. Соответственно тут уже не до очереди сообщений, а если запустить в отдельном, форма откроется и закроется. Опять ничего не понял. Т.е. я так понимаю: 1) при ShowModal в "главном потоке" все работает? 2) Проблема исключительно в запуске в отдельном от главного потоке? Код: java 1. 2. 3. 4. 5. 6. 7. IMHO Как-то сильно МАЛО кода. Попытайся тут же, в ЭТОМ потоке (в РАБОЧЕМ) и создавать объект. Подозреваю проблема в том, что TApplication был проинициализирован в другом потоке, а обработку пытаешься запускать в данном. Соответственно какие-то структуры "не попали". Подозреваю, что ИНИЦИАЛИЗАЦИЯ TApplication (т.е. твое СОЗДАНИЕ экземпляра Java объекта) и собственно РАБОТА ( showModal() ) должно быть в ОДНОМ потоке (не важно в каком). ViktorOffЕсли есть желание, там пару файликов с кодом прикручены, очень мало кода. Дело не только в желании, но и в отсутствие Borland C. Мне и MS VS на компьютере хватает ))). Взаимодействие для простоты условно реализовано в методах TestJNIForm.setVal(), TestJNIForm.getVal(), В случае разных потоков, я бы предложил "взаимодействовать" тупо через сообщения Windows. Т.к. IMHO синхронизироваться нужно/придется в C-ном коде, а там это не настолько просто, как на Java + похоже будет нужно вклинивать синхронизацию в обработку очереди сообщений (showModal). Подозреваю, стандартный showModal никакой синхронизации не имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2015, 18:45 |
|
||
|
Обращение к экземпляру TForm на с++
|
|||
|---|---|---|---|
|
#18+
Возможно, я излагаю проблему достаточно путанно. Убрал все лишнее. Из java вызываю нативный метод для показа vcl формы. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. В dll на Borland c builder 6 реализую метод вызова vcl формы. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Запускаю программу, форма показалась, но увы, висит. Есть мысли, что не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2015, 20:02 |
|
||
|
Обращение к экземпляру TForm на с++
|
|||
|---|---|---|---|
|
#18+
ViktorOffЕсть мысли, что не так? Show() замени на ShowModal(). Цикл выборки сообщений крутить некому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 13:55 |
|
||
|
Обращение к экземпляру TForm на с++
|
|||
|---|---|---|---|
|
#18+
C ShowModal() отображается нормально, только уже не обратишься к свойствам формы, т.к. модальный режим. Значит с Show() никак, без вариантов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 14:57 |
|
||
|
Обращение к экземпляру TForm на с++
|
|||
|---|---|---|---|
|
#18+
ViktorOffC ShowModal() отображается нормально, только уже не обратишься к свойствам формы, т.к. модальный режим. Значит с Show() никак, без вариантов? Почему никак. Кто то же должен разгребать очередь сообщений Windows. Или ShowModal или можно заюзать соответствующие методы в TApplication (что правильнее). В данном случае, у Вас концептуально не правильно реализована система. Если Вы действительно хотите _паралельного_ выполнения, то тогда так и делайте, в двух потоках: 1. Один поток A - Java 2. Второй поток B - C код (окно + цикл разгребания сообщений Windows) + Java обертка Вообще, функционал во втором потоке лучше реализовывать переопределяя не TForm, а TApplication AFAIK. Понятно, что "просто обращаться к свойства" объекта в другом потоке - категорически нельзя. Т.к. нужно как-то синхронизироваться. Проще всего. что бы не париться с синхронизацией, "общаться" через сообщения Windows. После создания окна, запоминаете его Handle и в классе окна на Borland C пишите обработчик на свои сообщения Windows. #define MYMSG_GET_PROPERTY ( WM_USER+1 ) #define MYMSG_SET_PROPERTY ( WM_USER+2 ) https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms644931(v=vs.85).aspx Соответственно, когда нужно установить/получить свойство, в другом потоке дергаете: SendMessage( my_wnd, MYMSG_SET_PROPERTY, 0, my_value ) etc.... IMHO Через сообщения Windows самое простое. https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms644950(v=vs.85).aspx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 15:34 |
|
||
|
Обращение к экземпляру TForm на с++
|
|||
|---|---|---|---|
|
#18+
Написал и засомневался... можно или нет так... Давно на Windows API не писал. Но судя по доке, должно работать. Если я правильно понял, каждый поток создавший окно, получает свою персональную очередь сообщений. https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms644928(v=vs.85).aspx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 15:42 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38989819&tid=2125264]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
139ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 447ms |

| 0 / 0 |
