![]() |
|
|
![]()
|
|
| vikaz |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: 10 Всего: 12 |
Всем добрый день! Есть сл. код:
CPP файл
h файл
Проблема в том, что когда запускается основной поток, появляется сл. ошибка: ![]() Такое ощущение, что поток не видит, все что было связанно с инициализацией переменной ExcelApplication. Подскажите, как можно решить проблему...... Заранее спасибо! ЗЫ. Без потоков все работает нормально, но естественно, виснет форма, от чего и пытаюсь избавиться...... ЗЫ. ЗЫ. Проверил, действительно проблема возникает только в Execute (); проверил так: создал новую функцию, в нее положил только строчку:
вызов функции расположил до Resume ();. Все отработалось нормально без ошибки вернув мне значение данной ячейки! ЗАСАДА! :( Это сообщение отредактировал(а) vikaz - 4.12.2009, 08:01 -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
||||||
|
|||||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
vikaz, код работы с COM попробуй заключить между
|
|||
|
||||
| vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: 10 Всего: 12 |
![]()
-------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
vikaz, вообще то работа с Execel у тебя начинается уже в конструкторе потока.
А в целом - не совсем удачная реализация идеи. Я бы написал отдельный класс для работы с Excel и уже в нем реализовал асинхронный ввод - вывод. |
|||
|
||||
| vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: 10 Всего: 12 |
Дык, так и начинал писать! Но потом решил внести в поток и началась попа. А для асинхронного ввода-вывода, как лучше реализовать поток, через этот же класс или взять чисто API?
-------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
||||
|
||||
| vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: 10 Всего: 12 |
Самое поршивое, что я так с самого начала и делал, но возникала та же ошибка! Только поэтому я перенес все в конструктор для проверки, но это тоже не помогло. Я так же просто передавал Variant в конструктор потока и пытался с ним работать. Но получалось все еще смешнее, ошибки не было, но после первого же обращения к OLE приводило к завершению потока...... :( -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
vikaz, кстати попробуй при работе из основного потока - без TThread - в цикле работы использовать Application->ProcessMessages(). Это не очень кошерный подход - но все же.
Я думаю что в поток стоит вынести только обработку данных - но не инициализацию самого объекта для работы с Excel. |
|||
|
||||
| vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: 10 Всего: 12 |
Полностью с тобой согласен камрад, но повторюсь, инициализацию внес в конструктор только для проверки.... Буду пробовать, если не получится, попрошу у Вас помощи! Огромное спасибо.... -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
vikaz, ок.
Попробуй действовать по такому шаблону:
Это конечно при условие что нет работы в потоке с гуем. Хотя все таки кошернее замутить свой класс. Все таки ООП наше все Удачи! Это сообщение отредактировал(а) mrbrooks - 4.12.2009, 10:00 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
|
|||
|
||||
| vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: 10 Всего: 12 |
Спасибо, учту это в дальнейшем! -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
||||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Нет, не будет. В твоем шаблоне вся работа происходит в отдельном thread'е. И то, что функцию, которая эту работу производит, засунули в чужой класс, дела не меняет |
|||
|
||||
| vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: 10 Всего: 12 |
Получается, что все, начиная от инициализации до отключения от сервера автоматизации, должно находиться, по сути, в функции Execute?
-------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Да |
|||
|
||||
| vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: 10 Всего: 12 |
Мда, не кашерно! :( Грустно, очень грустно.....
Это сообщение отредактировал(а) vikaz - 4.12.2009, 21:03 -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Ну если до зарезу надо, то COM объект можно вызывать и в другом потоке, но для этого надо совершить массу телодвижений (см CoMarshalInterThreadInterfaceInStream и CoGetInterfaceAndReleaseStream)
|
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |