Delphi timer не работает

Delphi timer не работает

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

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;
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;


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 установить свою процедуру опять же из компонента. Чтобы когда прийдут данные вызвался не событие пользователя а мое, которое уже потом и будет вызывать событие пользователя?

> такой еще вопрос возможно ли прямо в компоненте на событие 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-функций — он спит себе, пока не случится событие, и никому не мешает.

Источник

Delphi timer не работает

Регистрация на форуме тут, о проблемах пишите сюда — alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Форум программистов > Delphi программирование > Работа с сетью в Delphi
Не работает таймер и оптимизация кода
Регистрация

Здравствуйте, помогите оптимизировать код.

Алгоритм.
1 Авторизация (запилил в FormCreate)
2. Получаем список
3. Добавляем
4 Удаляем

memo заменю на tstringlist,

вот этот блок бы оптимизировать, тут идет парсинг справа на лево, сам не смог(

а не подскажите, почему у меня таймер не срабатывает?

Потому что мат. часть по синхронизации не выучена. Нельзя обращаться к компонентам и классам и другим формам из потока, без синхронизации.

Таймер не работает потому что поток к моменту срабатывания уже умер, либо в cod передан мусор. Все.

Потому что мат. часть по синхронизации не выучена. Нельзя обращаться к компонентам и классам и другим формам из потока, без синхронизации.

Таймер не работает потому что поток к моменту срабатывания уже умер, либо в cod передан мусор. Все.

Источник

Timer не работает

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Не работает Locate через Timer
Доброго времени суток! БД — Firebird. В ней есть некая таблица, в которой, есть поле.

Не правильно работает timer
procedure TForm3.FormCreate(Sender: TObject); var period : TTime; begin Timer1.Enabled :=.

Не работает нужным способом Timer
Моя программа должна создавать рандомный динамический массив на столько элементов сколько захочет.

Запуск/остановка таймера при вводе в Edit команд Timer Start/Timer Stop
Суть вот в чём на форме есть таймер который выполняет обратный отсчёт и есть Edit, задача вот.

А что это Timer40Timer ?

Добавлено через 1 минуту
Обычно это выглядит так.

Не работает Timer
Не могу разобраться с таймером. В консоли он вообще работает? Код взят с форума какого то).

Timer почему не работает?
Добрый день. Есть следующий код. void Timer(CallBackType callback)< int t1 = time(NULL);.

Не работает Timer, почему?
Доброго времени суток. Никак не могу понять в чем проблема с моим таймером. Пишу на swing (так.

Как работает Timer и TimerTask?
Хотел спросить как работает Timer и TimerTask, т.е. как я понимаю создается экземпляр класса Timer.

Источник

Не работает таймер в потоке

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Таймер в потоке TThread, как его создать?
Оказалось таймер в поток не так просто создать в отличии от основного потока, там этот код.

Не работает цикл в потоке
Вот писал программу,в ней цикл,достаточно длинный поэтому форма зависала,если просто процедуру в.

Не работает таймер
Точнее сказать работает, но в приложении с формой. Мой приложение без формы, и таймер начинает.

Как работает Таймер?
Помогите пожалуйста,на форму кинул две кнопки баттон,на клик баттон1 создал: .

таймер — это не параллельный поток, работает когда программа ничем не занята, из очереди сообщений Windows
и он не потокобезопасный, т.е. использовать его там нельзя
в данном случае либо использовать таймер в главном потоке
либо крутить доп. поток и проверять, сколько времени прошло

TTimer is a message based timer. Whatever thread context the TTimer is created in must have an active message loop in order for TTimer to process its WM_TIMER messages.

TTimer is not a thread-safe timer. In order to receive the WM_TIMER messages, it has to allocate an HWND window handle for itself. It does so using the VCL’s AllocateHWnd() function, which is not thread-safe and must not be called from outside the context of the main thread.

If you need a thread-safe timer, either call CreateWindow() directly and pump/process the WM_TIMER messages directly, or else use a different timer mechanism, such as a threaded multimedia timer via timeSetEvent(), or even just a simple busy loop via Sleep() or WaitForSingleObject(). Without knowing what you are using the timer for, it is difficult to pin-point an alternative that suits your needs.

Источник

Не работает таймер

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Не работает таймер в потоке
unit VkThread; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics.

Как работает Таймер?
Помогите пожалуйста,на форму кинул две кнопки баттон,на клик баттон1 создал: .

Не сохраняются данные и не работает таймер
Доброго времени суток, сейчас пишу одну программу, вообщем необходимо сохранить в файл данные, у.

Почему не работает таймер в практически бесконечном цикле?
Вобщем код такой. procedure TForm1.Timer1Stop(Sender: TObject); begin //procedure .

при назначении функции второй параметр (_In_ UINT_PTR nIDEvent) игнорируется, т.е. в функции не различить от какого таймера произошел вызов (если таймеров несколько)

Добавлено через 1 минуту

То есть поставить знак @ в CreateTimer а передавать функцию?

Как работает таймер относительно основного потока приложения?
код программы исполняется по стандарту сверху-вниз, так? А как в этот процесс вписывается таймер.

При открытии программы таймер работает с прежнего места
Здравствуйте. Подскажите пожалуйста, как сделать, чтобы при закрытии программы таймер запоминал то.

Не работает таймер
Привет всем! Скажите пожалуйста, есть таймер в index.php, на денвере она работает точно, т.е.

Не работает таймер
Здравствуйте! Создала психологический тест. В нем должен быть таймер, я его поставила, добавила.

Источник

Оцените статью