C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Поток +Excel, Поток +Excel=Asserte
Гребенюк Алексей
  Отправлено: 11.03.2005, 13:48


Не зарегистрирован







Дорогие однополчане, не в первый раз я прошу у Вас помощи, и вы помогали мне , так помогите и в этот.
Короче тема такая:

Создается и запускается поток:

Thred_Progress* Tre= new Thred_Progress(true);
Tre->Priority=tpNormal;
Tre->Resume();

далее уже в потоке мы делаем следующее:

void __fastcall Thred_Progress::Execute()
{
FreeOnTerminate=true;
zz->vivodtoExcel();
}
Где zz->vivodtoExcel(); это вывод в Excell данных ,
я даже пытался через Synchronize(конечно же zz->vivodtoExcel(); я выносил в отдельную функцию).
ТЕПЕРЬ САМОЕ ГЛАВНОЕ: Когда доходит до потока , кэтой функции (zz->vivodtoExcel()) или гдето внутри ее , выходит следующее сообщение:
(Заголовок )"Asserte"

InBound() @ C:\BCB\emuvd\utilds.h/4249
Press Yes to terminate, No to continio and Cansel to Depug

Как я заметил проц в этот момент занят на все 100% .
И конечно же напрашивается вопрос , как же мне осуществить вывод в Excel больших данных, что бы прога не подвешивалась и что у меня не так? Может поток не дружит с ActiveX?

Bond
Отправлено: 11.03.2005, 13:56


Станционный диспетчер

Группа: Участник
Сообщений: 142



Дык проблема может не со TThread, а с самой реализацией zz->vivodtoExcel()? Без нити он работает нормально?
Гребенюк Алексей
Отправлено: 12.03.2005, 08:06


Не зарегистрирован







Все просто зашибись.
Гребенюк Алексей
Отправлено: 12.03.2005, 08:22


Не зарегистрирован







Слышал я так же о таком слове как CoInitialize, может ли оно решить мою проблемму с потоком и как?
Gedeon
Отправлено: 12.03.2005, 10:31


Ветеран

Группа: Модератор
Сообщений: 1742



Ну попробуйте, что мешает.
CoInitialize(NULL);
Synchronize нужно использовать только тогда, когда обращаетесь к визуальным компанентам, тут етого не надо, если в них конечно данные не хранятся, что неправильно.
ну и давайте дальше, что такое zz?
grebenyk
Отправлено: 12.03.2005, 11:26


Дежурный стрелочник

Группа: Участник
Сообщений: 73



Это класс в в котором описывается работа с Excel, примерно тоже самое что в документашке из этого сайта, только вынес в отдельный класс, примерно так:
class Excel_Class{
Variant App,Sh;
sTeck* STK;//=new sTeck();
sTeck* STK2;
void in_stek_from_File(AnsiString st);
public:
~Excel_Class();
Excel_Class();
int Count();
TStringList* analiz_STK2(void);
void MakeReport(AnsiString st);
void __fastcall formulaExcel(int sRow, int sColumn, int row);
void __fastcall ExcelInit(AnsiString File);
void __fastcall toExcelCell(int c1,int c2, String data,int list,int col);
// void __fastcall toExcelCell(int c1,int c2, Variant data,int list);
void __fastcall open_file(AnsiString fil);
void __fastcall smena();//{ App.OlePropertyGet("WorkSheets",1).OlePropertySet("activate"); }
void __fastcall Close_File() { App.OlePropertyGet("WorkBooks",2).OleProcedure("Close"); }
void __fastcall vivodtoExcel();
void __fastcall obrabot(AnsiString st);
void __fastcall zacrep(AnsiString t);
Elem *GetEnd_STK2(void);
};

Такое сплетение стеков и Excel, стеки соответственно классы с шаблонами

Отредактировано grebenyk — 12/03/2005, 12:08
Gedeon
Отправлено: 12.03.2005, 12:39


Ветеран

Группа: Модератор
Сообщений: 1742



Ну вот сляпал на скорую руку проектик с открытием ворда из потока, все работает после двух волшебных строк.
Главная форма:
CODE

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Th_Word *TW = new Th_Word(true);
   TW->FreeOnTerminate = true;
   TW->Resume();
}
//---------------------------------------------------------------------------

Поток:
CODE

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include <comobj.hpp>
#include <objbase.h> //Обратите внимание
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall Th_Word::Th_Word(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall Th_Word::Execute()
{
   CoInitialize(NULL);
   //OleInitialize(NULL); //Эффект тот же, м. использовать и это
Variant V;
    V = CreateOleObject("Word.Basic");
    V.Exec(Procedure("AppShow"));
    V.Exec(Procedure("FileNew") << "Normal");
    V.Exec(Procedure("Insert") << "Gedeon Office Word");
}
//---------------------------------------------------------------------------


Олэ работает, ну а дальше уже надо отлаживать Вашу функцию, если работать не будет.
grebenyk
Отправлено: 12.03.2005, 13:42


Дежурный стрелочник

Группа: Участник
Сообщений: 73



Да , попробую когда прийду домой,
да.. как насчет CoUnInitialize?
Gedeon
Отправлено: 12.03.2005, 14:03


Ветеран

Группа: Модератор
Сообщений: 1742



Вызывайте в конце работы потока.
grebenyk
Отправлено: 13.03.2005, 20:31


Дежурный стрелочник

Группа: Участник
Сообщений: 73



Теперь все зашибись работает , но не так как хотелосьбы. Программа подвисает какбудто без потока?
Gedeon
Отправлено: 14.03.2005, 09:21


Ветеран

Группа: Модератор
Сообщений: 1742



К визуальным компонентам обращаетесь?
grebenyk
Отправлено: 22.03.2005, 07:11


Дежурный стрелочник

Группа: Участник
Сообщений: 73



Понимаю, к чему Вы клоните. Да обращаюсь, но исключительно в Synhronize, но все остальное вне его. Надо бы проект приложить. Я уже в процедере вставки в ячейку Excel вставлял всякие там Application->ProcesMessages(), короче для обработки Messages, и все в холостую
Gedeon
Отправлено: 22.03.2005, 10:01


Ветеран

Группа: Модератор
Сообщений: 1742



Выкладывайте проект, дальше гадать нет смысла.
grebenyk
Отправлено: 28.03.2005, 17:56


Дежурный стрелочник

Группа: Участник
Сообщений: 73



Вот оно

User Attached Image Скачать файл
2005_03_24.ZIP



Вернуться в Вопросы программирования в C++Builder