Гребенюк Алексей |
Отправлено: 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
|
Вот оно
|
|