Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

не срабатывает таймер   Найти похожие ветки 

 
RagE ©   (2004-07-07 15:13) [0]

Добрый день. Пишу свой компонент со встроенным таймером. Задача такая, нужно поставить на событие таймера процедуру моего компонента. В дебаггере смотрю FTimer.OnTimer присваивается адрес процедуры но событие не срабатывает.
Привожу полный текст модуля.
// Клиент на основе TClientSocket с проверкой получения данных и ведения истории в базе данных
unit DBClientSocket;

interface

uses
 SysUtils, Classes, ScktComp, ExtCtrls, Protocol;

type
 TDBClientSocket = class(TClientSocket)
 private
   FTimeOut:integer;  // Время ожидания подтверждения
   FTimer:TTimer;
   FTimeIsOut:boolean; // Сигнализирует о завершении времени на таймаут
   FDataReceived:boolean; // Сигнализирует об успешном получении данных
   FTimeIsOutOnTimer:TNotifyEvent;
   procedure TimeIsOutOnTimer(Sender:TObject);
   // Установка свойств
   procedure SetTimeOut (const Value: integer);
   procedure SetTimer (const Value: TTimer);
 protected
   function Waiting:TSendResult;
 public
   constructor Create(AOwner:TComponent);override;
   function SendTextAndWait(Text:string):TSendResult;virtual; // Отсылает данные и ждет подтверждения
 published
   property TimeOut:integer read FTimeOut write SetTimeOut;
   property Timer:TTimer read FTimer write SetTimer;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents("My", [TDBClientSocket]);
end;

// Конструктор
constructor TDBClientSocket.Create(AOwner:TComponent);
begin
 inherited Create(AOwner);
 FTimer := TTimer.Create(Self);
 FTimer.Name:="Timer1";
 FTimer.Enabled := False;
 FTimeIsOutOnTimer:=TimeIsOutOnTimer;
end;

// Сигнал о том что время вышло
procedure TDBClientSocket.TimeIsOutOnTimer(Sender:TObject);
begin
 FTimeIsOut:=true;
end;

// Функция ожидания
function TDBClientSocket.Waiting:TSendResult;
begin
// Устанавливаем таймер
 if FTimer=nil then
   begin
     Result:=srWithoutWait;
     Exit;
   end;
 FTimer.Interval:=FTimeOut;
 FTimeIsOut:=false;
 FTimer.OnTimer:=FTimeIsOutOnTimer;
 FTimer.Enabled:=true;
//  FDataReceived:=true;
// Ждем подтверждения или окончания таймаута
 while (not FTimeIsOut) and (not FDataReceived) do
   begin                                            { TODO : Сделать ожидание таймаута }
   end;
// Определяем результат и останавливаем таймер
 if FDataReceived then Result:=srOk;
 if FTimeIsOut then Result:=srTimeOut;
 FTimer.Enabled:=false;
end;

// Отсылка данных с ожиданием подтверждения
function TDBClientSocket.SendTextAndWait(Text:string):TSendResult;
begin
// Посылаем текcт
 Socket.SendText(Text);
 Result:=Waiting;
end;

// Установка свойств --------------------------
procedure TDBClientSocket.SetTimeOut (const Value: integer);
begin
 FTimeOut:=Value;
end;

procedure TDBClientSocket.SetTimer (const Value: TTimer);
begin
//  if Value<>nil then
//    FTimer.Assign(Value);
end;

end.


 
MBo ©   (2004-07-07 15:19) [1]

Неплохо было бы просмотреть этот форум чуть ниже.


 
RagE ©   (2004-07-07 15:35) [2]

Дело в том что смотрел. Не работает. В том случае там событие на таймер задается как property. В моем случае нужно чтобы оно было определено в компоненте и пользователь не догадывался даже о таком.


 
MBo ©   (2004-07-07 15:50) [3]

событие таймера связано НЕ с методом TimeIsOutOnTimer, а с переменной   FTimeIsOutOnTimer, которая, собственно говоря, никуда не указывает.
Кроме того, настораживает, мягко говоря, метод ожидания.


 
RagE ©   (2004-07-07 15:59) [4]

[3]
FTimeIsOutOnTimer:=TimeIsOutOnTimer;
Пробовал и FTimer.OnTime:=TimeIsOutOnTimer;
Метод ожидания такой что когда сработает таймер переменная YimeIsOut установитя в true и цикл прекратится. Вобщем то здесь он не важен. Все равно он будет не такой. Мне важно чтобы событие таймера срабатывало.

И такой еще вопрос возможно ли прямо в компоненте на событие OnRead установить свою процедуру опять же из компонента. Чтобы когда прийдут данные вызвался не событие пользователя а мое, которое уже потом и будет вызывать событие пользователя?


 
MBo ©   (2004-07-08 07:06) [5]

> такой еще вопрос возможно ли прямо в компоненте на событие OnRead установить свою процедуру опять же из компонента. Чтобы когда прийдут данные вызвался не событие пользователя а мое, которое уже потом и будет вызывать событие пользователя?

Так обычно и делается - в нужном месте вызывается (обычно динамический) метод, в котором делается нужная работа, и выполняется
if Assigned(FOnSomeEvent) then
 FOnSomeEvent(Self[,ParamList]);

А вообще рекомендую скачать компонент CPort Dejan Crnila. Он для работы с компортом (с сокетами я просто не работал и не знаю, что посоветовать) и разобраться в логике работы - там сделано весьма грамотно.


 
RagE ©   (2004-07-08 09:40) [6]

Ты меня не так понял. Про
if Assigned(FOnSomeEvent) then
FOnSomeEvent(Self[,ParamList]);
я знаю. Мне вот что нужно. У класса есть событие OnRead. мне нужно что то типа того что Class.OnRead:=Class.MyEvent;
Вобщем то пока я это дело сделал путем изменения исходника компонента


 
RagE ©   (2004-07-08 09:41) [7]

Ну вобщем то о главном. Таймер то не работает.


 
RagE ©   (2004-07-08 11:25) [8]

Все вопрос закрыт. Для тех кому интересен ответ: в цикле нужно вставлять ProcessMessages


 
MBo ©   (2004-07-08 12:18) [9]

>RagE ©   (08.07.04 11:25) [8]
>ответ: в цикле нужно вставлять ProcessMessages
>MBo ©   (07.07.04 15:50) [3]
>Кроме того, настораживает, мягко говоря, метод ожидания.

Я не просто так ведь это написал - у тебя получается, что главный поток приложения, в котором крутится этот цикл, бесполезно кушает ресурсы процессора. ProcessMessages "оживляет" систему, но всех проблем не решает.
А вот в рекомендованном компоненте, например, запускается дополнительный поток с использованием Wait-функций - он спит себе, пока не случится событие, и никому не мешает.



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.045 c
1-1118919896
Priest
2005-06-16 15:04
2005.07.11
Как определить по какому столбцу кликнули в cxGridDBTableVi


14-1118606205
Andryk
2005-06-12 23:56
2005.07.11
А вот интересно песенка крокодила гены


3-1117358511
Nikitian
2005-05-29 13:21
2005.07.11
Проблемы со шрифтами в Tquery vs TQreport


1-1118819809
msguns
2005-06-15 11:16
2005.07.11
Не могу передать фокус из StayOnTop формы в вызывающую


11-1101855353
Алексей
2004-12-01 01:55
2005.07.11
Уважаемый Владимир Кладов...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский