Все вопросы связанные с программированием. Языки программирования. Средства разработки.
Аватара пользователя
Hank
Не в сети
Почётный форумщик
Почётный форумщик
Сообщения: 4299
Зарегистрирован: Чт май 05, 2005 19:35
Откуда: RnD

Сообщение Hank »

Borr,
А как тогда узнать запущен сйчас thred или нет
в общем случае это узнавать не надо, но если уж понадобилось и не хочется переделывать архитектуру, то через глобальную переменную.

Код: Выделить всё

EKThread = new TExcelKassa(true); // создание потока
...
if EKThread <> nil then // проверка существует ли поток.
...
// в OnTerminate потока вписать
EKThread := nil;
Люблю повеселиться, особенно пожрать,
Люблю и поработать, особенно поспать )

Аватара пользователя
Borr
Не в сети
Частый гость
Частый гость
Сообщения: 338
Зарегистрирован: Ср сен 15, 2004 17:14
Откуда: Шахты
Контактная информация:

Сообщение Borr »

в общем случае это узнавать не надо
Запустил юзер отчет который делается в потоке (отчет долгоиграющий) и минут через пять решил его грохнуть или вообще закрыть приложение. А прежде чем обращаться к потоку

Код: Выделить всё

EKThread->Terminate();
Чтобы не получить Access Violation надо выяснить есть он или нет вообще в природе.

Про переменную спасибо, я почему-то думал что это не красиво.
Стой там, иди сюда

Аватара пользователя
Borr
Не в сети
Частый гость
Частый гость
Сообщения: 338
Зарегистрирован: Ср сен 15, 2004 17:14
Откуда: Шахты
Контактная информация:

Сообщение Borr »

Еще вопрос при EKThread->Terminate(); нужно закрыть созданный объект Excel но при этом происходит ошибка (приложение обратилось к интерфейсу относяящимуся к другому потоку).

Пытался маршалингом (CoMarshalInterThreadInterfaceInStream, и CoGetInterfaceAndReleaseStream) но что-то ума ему дать вообще не могу. Ничего не понял.
Есть другой вариант проверять в потоке Terminated но не вариант он не отрабатывает :(

Помогите разобраться.
Стой там, иди сюда

Аватара пользователя
Hank
Не в сети
Почётный форумщик
Почётный форумщик
Сообщения: 4299
Зарегистрирован: Чт май 05, 2005 19:35
Откуда: RnD

Сообщение Hank »

Borr,
EKThread->Terminate
всего лишь на всего устанавливает флаг terminated = true, а уже в самом потоке должна производиться проверка этого флага.
Чтобы не получить Access Violation надо выяснить есть он или нет вообще в природе
if EKThread <> nil then объект существует, конечно если придерживаться рекомендации в моем предыдущем посте.
Люблю повеселиться, особенно пожрать,
Люблю и поработать, особенно поспать )

Аватара пользователя
Borr
Не в сети
Частый гость
Частый гость
Сообщения: 338
Зарегистрирован: Ср сен 15, 2004 17:14
Откуда: Шахты
Контактная информация:

Сообщение Borr »

всего лишь на всего устанавливает флаг terminated = true
Да ты мне уже говорил я этот флаг и проверяю в потоке. Дело в том что EKThread->Terminate() происходит при закрытии приложения после проверки на EKThread != NULL (кстати если поток уже работал то после уничтожения он не будет NULL) и следам сразу идет закрытие формы а как мне дождатся завершения потока EKThread->WaitFor() (выполняющийся из приложения); вводит "неверный деструктор".
В EKThread делаю

Код: Выделить всё

     if(this->Terminated)
      {
        delete Query;
        delete Trans;
        App.OlePropertySet("Visible",true);
        Sh.Clear();
        App.Clear();
        CoUninitialize;
        /*PostMessage(Application->MainForm->Handle,          WM_CURRENT_THREAD_EXIT,
          0, 0 ) ;*/
        return;
      }
вот после return и завершения потока и получаю "неверный деструктор" почему?
Стой там, иди сюда

Аватара пользователя
Hank
Не в сети
Почётный форумщик
Почётный форумщик
Сообщения: 4299
Зарегистрирован: Чт май 05, 2005 19:35
Откуда: RnD

Сообщение Hank »

Borr,
кстати если поток уже работал то после уничтожения он не будет NULL
будет, если, как я уже писал, в обработчике OnTerminate обнулить переменную.
вводит "неверный деструктор".
свойство FreeOnTerminate должно быть false, возможно проблема в этом.
Люблю повеселиться, особенно пожрать,
Люблю и поработать, особенно поспать )

Аватара пользователя
Borr
Не в сети
Частый гость
Частый гость
Сообщения: 338
Зарегистрирован: Ср сен 15, 2004 17:14
Откуда: Шахты
Контактная информация:

Сообщение Borr »

будет, если, как я уже писал, в обработчике OnTerminate обнулить переменную.
Какую переменную? Которую передавал в поток из приложения, которые создавал в потоке - т.е. все из Private и Public?

Если FreeOnTerminate = false то после EKThread->Terminate() нужно делать delete EKThread или EKThread->Free там где я этот поток создавал?
Стой там, иди сюда

Аватара пользователя
DbIMok
Не в сети
Администратор
Администратор
Сообщения: 8268
Зарегистрирован: Ср янв 28, 2004 7:15

Сообщение DbIMok »

Borr писал(а):Какую переменную?
Eraser писал(а):

Код: Выделить всё

// в OnTerminate потока вписать 
EKThread := nil;

Аватара пользователя
Borr
Не в сети
Частый гость
Частый гость
Сообщения: 338
Зарегистрирован: Ср сен 15, 2004 17:14
Откуда: Шахты
Контактная информация:

Сообщение Borr »

Как вы уже поняли потоки применяю доля создания отчетов в Excel в фоне. Отчеты красивые рисовать много и долго по 400 - 500 строк. Так вот при работе потока процессор загружается на 100% - это нормально? Можно ли как-то разгрузить процессор?

итак делаю:

Код: Выделить всё

  MarE = new TMarinaExcelTh(true);
  MarE->Priority = tpLower;
не помогает :( все равно 100%
Стой там, иди сюда

Аватара пользователя
Hank
Не в сети
Почётный форумщик
Почётный форумщик
Сообщения: 4299
Зарегистрирован: Чт май 05, 2005 19:35
Откуда: RnD

Сообщение Hank »

Borr,
если в потоке есть цикл, то вставить в него Sleep(1);
Люблю повеселиться, особенно пожрать,
Люблю и поработать, особенно поспать )

Аватара пользователя
Borr
Не в сети
Частый гость
Частый гость
Сообщения: 338
Зарегистрирован: Ср сен 15, 2004 17:14
Откуда: Шахты
Контактная информация:

Сообщение Borr »

Eraser Да я пробовал толку никакого и больше пробовал до 10 ставить. Загрузка начинает колебаться от 95%-100%
Стой там, иди сюда

Аватара пользователя
Hank
Не в сети
Почётный форумщик
Почётный форумщик
Сообщения: 4299
Зарегистрирован: Чт май 05, 2005 19:35
Откуда: RnD

Сообщение Hank »

Borr,
тады или ещё больше Sleep, либо, что лучше, вообще убрать искусственные задержки. И оставить все как есть, в конечном итоге быстрее будет.
Люблю повеселиться, особенно пожрать,
Люблю и поработать, особенно поспать )

Ответить