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

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

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2010, 20:17   #1
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию как убрать Access Violation при Destroy компонента?

Привет Всем!

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

Есть люди которые в этом разбираются?

P.S. это ошибка выскакивает не всегда, в основном при обработке данных или подсчете чисел и тд..
Вложения
Тип файла: rar ThdTimer.rar (1.2 Кб, 22 просмотров)

Последний раз редактировалось ZuBy; 24.08.2010 в 20:20.
ZuBy вне форума Ответить с цитированием
Старый 24.08.2010, 22:09   #2
r9m
₪₪₪₪₪₪₪₪
Форумчанин
 
Аватар для r9m
 
Регистрация: 16.04.2007
Сообщений: 471
По умолчанию

Лучше пример кода, при выполнении которого ошибка даёт о себе знать.
r9m вне форума Ответить с цитированием
Старый 25.08.2010, 04:38   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

ZuBy, я избавлялся от этой ошибки так:
Код:
var
 i: integer; //создавал "левую" переменную, которая ничего не делает
begin
 try
 ... //тут выполнялся мой код какой-то
 except
 {далее идет обработка ошибки. Помести то что идет после
 except в код туда, что "провоцирует" ошибку}
 on EAccessViolation do
  //блок begin...end в данном случае необязателен. Это у меня просто 
  привычка после do писать его :)
  begin 
   i:=1;
  end;
 end;
Тогда в среде разработки появление ошибки будет продолжаться, однако, когда запустишь ехе-шник отдельно, то ошибки не будет. По крайней мере у меня не появляется она больше. Удачи!
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 25.08.2010, 07:16   #4
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

artemavd, спасибо за решение, надеюсь поможет!

p.s. если поможет жди положительный отзыв)

From artemavd: мне помогло. жду

Последний раз редактировалось artemavd; 25.08.2010 в 07:26.
ZuBy вне форума Ответить с цитированием
Старый 25.08.2010, 08:56   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ZuBy
Я пишу:
Код:
unit Unit1;

interface

uses    ThdTimer,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private t:TThreadedTimer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 t:=TThreadedTimer.Create(self);
 t.Interval:=1000;
 t.OnTimer:=Timer1Timer;
 t.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Caption:=TimeToStr(now);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 t.Enabled:=false;
end;

end.
Запускаю. часики тикают. Я закрываю форму и не вижу никакого AV. (D6)
Так шо все там ок.
На всякий случай подозрение что поправить нужно в деструкторе так:
Код:
    if FOwner<>nil then
     FOwner.FOnTimer := nil; // AV
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.08.2010, 15:49   #6
ViktorXP
Форумчанин
 
Аватар для ViktorXP
 
Регистрация: 24.11.2006
Сообщений: 108
По умолчанию

Вообще компонент написан ка кто странно.
Код:
  with FTimerThread do
  begin
    FEnabled := False;
    FOwner.FOnTimer := nil; // AV
Зачем TThreadedTimer стирать событие OnTime у себя через FTimerThread.

И самое странное это то что все это эмулирует действия мультимедийного таймера.
ViktorXP вне форума Ответить с цитированием
Старый 31.08.2010, 18:10   #7
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

artemavd, увы и ах, при большой нагрузке на потоковый таймер он все равно выдает ошибку.
Stilet, я ведь говорил что ошибка возникает не всегда!
ViktorXP, нулить события это дело каждого!

а есть у кого нить нормальный потоковый таймер?
ZuBy вне форума Ответить с цитированием
Старый 31.08.2010, 22:29   #8
ViktorXP
Форумчанин
 
Аватар для ViktorXP
 
Регистрация: 24.11.2006
Сообщений: 108
По умолчанию

Цитата:
ViktorXP, нулить события это дело каждого!
Вот из за таких косяков потом непонятно почему код перестает работать.
И если бы нулил бы у себя это еще пол беды, но нулить у себя через дочерний объект... это как гланды через ж#п#.
Да и если человек обнуляет событие в деструкторе то тут складывается мнение о неправильном построении логики.

Цитата:
а есть у кого нить нормальный потоковый таймер?
Я ведь уже говорил что в системе есть мультитаймер
timeSetEvent

Цитата:
The timeSetEvent function starts a specified timer event. The multimedia timer runs in its own thread. After the event is activated, it calls the specified callback function or sets or pulses the specified event object.
ViktorXP вне форума Ответить с цитированием
Старый 01.09.2010, 10:58   #9
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

интересно, а как там решается проблема синхронизации доп.потока с основным?
_Engine_ вне форума Ответить с цитированием
Старый 01.09.2010, 19:20   #10
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Цитата:
Сообщение от _Engine_ Посмотреть сообщение
интересно, а как там решается проблема синхронизации доп.потока с основным?
что именно? Мультимедийный таймер?

ViktorXP я пробовал его, но там идет обработка через процедуру которую нельзя привязать к компоненту, а делать обработку вне компонента - это потеря скорости.
ZuBy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почему может возникать ошибка access violation...: write of address при создании динамического массива sleevman Помощь студентам 16 03.11.2009 20:49
Access violation at address при использовании DLL spamer Общие вопросы Delphi 4 27.08.2009 22:19
Access Violation при Form1.ListView.Clear Hottabych Общие вопросы Delphi 7 11.08.2009 17:13
Access violation at address при выполнении end elsin Общие вопросы Delphi 5 30.01.2009 10:29
access violation при создании обьекта goog Общие вопросы Delphi 12 11.01.2009 20:33