Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема TThread и Ole  (Прочитано 3389 раз)
0 Пользователей и 1 Гость смотрят эту тему.
yurza_81
Гость
« : 02-11-2009 05:32 » 

Есть класс
Код:
class TMyThread : public TThread
{
private:
TDataSet *DataS;
Variant Aplik;
Variant Shet;
protected:
    void __fastcall Execute();
public:
    __fastcall TMyThread(   bool CreateSuspended,
                            TDataSet * Nabor
                             );
     void __fastcall ThreadFunc();
     void __fastcall ExcelInitOpen(String File);
     __fastcall ~TMyThread(void);
};
Реализация
Код:
__fastcall TMyThread::TMyThread(bool CreateSuspended,
                                TDataSet * Nabor)
    : TThread(CreateSuspended)
{
DataS=Nabor;
}
__fastcall TMyThread::~TMyThread(void)
{
Aplik.Clear();
Shet.Clear();
CoUninitialize ();
}

void __fastcall TMyThread::Execute()
{
    FreeOnTerminate = true;
    while(!Terminated){
        Synchronize(ThreadFunc);
        }
}

void __fastcall TMyThread::ThreadFunc()
{

   if(DataS->RecordCount!=0){
     ExcelInitOpen("");
    for (int i=0;i<DataS->RecordCount;i++){
        DataS->Next();

    }
  }
if(!Aplik.IsEmpty())Aplik.OlePropertySet("Visible",true);
Application->ProcessMessages();
Terminate();
}

void __fastcall TMyThread::ExcelInitOpen(String File)
{
CoInitialize(NULL);
try{
   Aplik=Variant::GetActiveObject("Excel.Application");
   }
catch (...){
           try {
               Aplik=CreateOleObject("Excel.Application");
               }
           catch (EOleSysError &eException) {
           Form1->Edit2->Text=eException.ErrorCode;
                 Application->MessageBox("Невозможно открыть Microsoft Excel!"
                 "Возможно Excel не установлен на компьютере.","Ошибка",MB_OK+MB_ICONERROR);
            }
     }
try {
    if(File!=""){
      Aplik.OlePropertyGet("WorkBooks").OleProcedure("Open",File);
     }
    else{
      Aplik.OlePropertyGet("WorkBooks").OleProcedure("add");
      Shet=Aplik.OlePropertyGet("WorkSheets",1);
     }
   }
catch(...){
     Application->MessageBox("Ошибка открытия файла книги","Ошибка",MB_OK+MB_ICONERROR);
     }
}

Падает на коде
Код:
 try {
               Aplik=CreateOleObject("Excel.Application");
               }
           catch (EOleSysError &eException) {
           Form1->Edit2->Text=eException.ErrorCode;
                 Application->MessageBox("Невозможно открыть Microsoft Excel!"
                 "Возможно Excel не установлен на компьютере.","Ошибка",MB_OK+MB_ICONERROR);
            }
вызов из формы
Код:
Thr = new TMyThread(true,CRC->DataSet);
Thr->Resume();
С ошибкой eException.ErrorCode=-2147417843 тобиш
-2147417843   0x8001010D    An outgoing call cannot be made since the application is dispatching an input-synchronous call.

Код:
CoInitializeEx(NULL,COINIT_MULTITHREADED);
Возврашает -2147417850  Cannot change thread mode after it is set.
За ранее благодарен
« Последнее редактирование: 02-11-2009 06:12 от yurza_81 » Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #1 : 02-11-2009 07:22 » 

У класса TThread есть метод Synchronize служащий для синхронизации между основным потоком приложения и потоком данного класса. Вызывай CreateOleObject в контексте основного потока, также обращение к элементам формы должно быть через Synchronize, так как очередь сообщений этих элементов находится в основном потоке приложения.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines