Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2013, 10:52   #1
KIG
 
Регистрация: 01.08.2013
Сообщений: 4
По умолчанию Закрывается поток

Добрый день!

В программе создаю вспомогательный поток для обработки информации следующим образом:
Код:
DataProcess1=new dataprocessing(false);
Поток работает 15-17 часов и закрывается. Мне необходимо установить причину закрытия потока. Для этого сделал следующее:

1) Установил в функции Execute try{} catch. Подскажите, пожалуйста, возможно ли текст Исключения записывать в файл? Если да, то как это сделать?
Код:
  
 void __fastcall dataprocessing::Execute()
{
  try
   {
   do
   {
    ......
         Sleep(5);
   }
   while (!Terminated);
  }
 catch (Exception &EE)
  {
   Application->ShowException(&EE);
  }
}
2) В функции обработки события OnTerminate хочется получить DataProcess1->FatalException в виде текста исключения и записать его в файл. Подскажите, пожалуйста, как это сделать? (Как преобразовать FatalExeption в переменную для записи в файл)

3) Так же по таймеру пытаюсь вызвать функцию GetExitCodeThread().
Код:
 
DWord ExCode;
if( GetExitCodeThread(HTh1,&ExCode))
 if(ExCode!=STILL_ACTIVE)
   File1<<IntToStr(ExCode).c_str();
HTh1 получаю так:
Код:
 
_fastcall dataprocessing::dataprocessing(bool CreateSuspended)
   : TThread(CreateSuspended)
{
 Form1->HTh1=GetCurrentThread();
}
При этом по таймеру получаю, что даже после закрытия потока ExCode равен STILL_ACTIVE. Что я делаю неправильно? Подскажите, пожалуйста, где можно получить список значений ExCode с описанием их значений?

Заранее спасибо!
KIG вне форума Ответить с цитированием
Старый 03.08.2013, 19:45   #2
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

1) Лучше бы отлавливать исключения внутри do...while. Можно даже несколько блоков вставить. Так и поток может не завершаться, и количество отловленных исключений может быть достаточным для анализа.
2) У потока есть Handle. По-моему, лучше его использовать. GetCurrentThread возвращает хэндл главного VCL-потока [правда, могу ошибаться].
3) Запись в файл
Код:
#include<fstream>
...
try
{
...
}
catch(Exception& e)
{
ofstream f("somefile.txt"); 
f << e.Message.c_str << endl; 
f.close();
}
Правда, здесь будет только последнее исключение записано. Можно передвигать указатель всё время на конец файла.
FataLL вне форума Ответить с цитированием
Старый 04.08.2013, 09:00   #3
KIG
 
Регистрация: 01.08.2013
Сообщений: 4
По умолчанию

Спасибо!
Еще вопросы
1) при отображении времени на форме (в событии OnTimer вывожу в лейбл время раз в секунду) строчка моргает (т.е. пропадает время и затем появляется). Как будто вывод притормаживает. Возможно ли выводить время без задержек, чтобы глазу не видно было моргания?

2) Вывожу информацию в Excel.
Код:
   ExcelOtchet=CreateOleObject("Excel.Application");
    if(!ExcelOtchet.IsNull())
     {Открываю книгу, копирую в другую и открытую закрываю
          }
        ExcelOtchet.Clear();
   ExcelOtchet=Unassigned;
При этом при отладке в Buildere вижу, что при этом создаются потоки, которые закрываются не сразу. Можно ли их сразу закрывать после команд Clear() и Unassigned.
KIG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не закрывается форма The SCS Общие вопросы Delphi 4 31.03.2012 14:57
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. Человек_Борща Общие вопросы Delphi 8 27.02.2012 23:24
Не закрывается приложение. the_deer_one C# (си шарп) 5 08.06.2011 14:37
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
Закрывается окно Никита_П Общие вопросы C/C++ 2 27.02.2010 17:22