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