Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
Delphi 6-7

Поясните за таймер!) Или таймер на формах наследниках

16.02.2020, 13:46. Показов 2644. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго. В проге есть основная форма и в процессе работы создается 1-2-3-4-5 форм наследников все одного типа, но вот в чем загвоздка, на форме наследника организованна задержка при помощи таймера и соответственно есть дополнительные условия выхода из этих задержек, которые запускает основной таймер. Так вот пока открыто одно окно все работает отлично, все задержки срабатывают как надо и по времени и по месту. Стоит только запустить процесс на второй форме в основном таймере которого также есть условие прерывания то эти прерывания срабатывают и в первой форме. Не так давно работаю в делфи и не знаю так ли это должно работать, я думал форма созданная с таймером то таймер будет работать только на эту форму. Вообще нагородил нихрена не понятно даже самому.((
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.02.2020, 13:46
Ответы с готовыми решениями:

Нужна задержка в выполнении программы или как использовать таймер?
Доброго времени суток:) Суть программы: есть круглая мишень и нужно сделать 10 выстрелов, координаты x, y считываются из таблицы и для...

Таймер в формах с интервалом в полсекунды
Есть форма с часами, нужно сделать, чтобы в какое-то конкретное время, допустим в 14:00:00 в каком-нибудь лейбле начался отсчёт от 1 до 10...

Таймер должен через время положить файл на БД. [Таймер]
Мне нужен таймер, а я не знаю как его делать именно, чтоб в конкретное время он сохранял информацию в файл. Чтобы он в конкретный период...

16
Злостный нарушитель
 Аватар для Verevkin
10357 / 5772 / 1274
Регистрация: 12.03.2015
Сообщений: 26,671
16.02.2020, 14:13
покаж кот.
обработчик события OnTimer.
0
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
16.02.2020, 14:22  [ТС]
Verevkin,

Это основной

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var JSCode: string;
begin
  Timer4.Enabled := False;
  JSCode := 'console.log("#KolQuest" + document.getElementsByClassName("active sm_hide xs_hide md_hide")[0].textContent);';
  Chromium1.Browser.MainFrame.ExecuteJavaScript(JScode,'default_blank',0);
  StatusBar1.Panels.Items[5].Text := StatusBar1.Panels.Items[5].Text + '|';
 Timer1.Interval:=5000; // устанавливаем паузу в мс
  Timer1.Enabled:=True;// включаем таймер
   while Timer1.Enabled do  // пока таймер включен, держим паузу
  begin
    Application.ProcessMessages;
  end;
 
  if (KolQ >0) and (fs = false) Then begin
   BitBtn6.Enabled := False;
   VypolnenieZadanii;
   BitBtn6.Enabled := True;;
  end;
  if (KolC <> 30) then begin
    KolC := KolC + 1;
  end else begin
    Kolc := 0;
    StatusBar1.Panels.Items[5].Text := '|';
    Chromium1.LoadURL('http://vktarget.ru/');   // обновляем задания
    fl := False;
    mySleep(1000, fl);
  end;
  if fs = false then Timer4.Enabled := True;
в таймер 1 только выключаем его
Delphi
1
 Timer1.Enabled := False;
Такой же способ задержки есть в основном коде и вот там он как раз не выполняется при открытии второго окна.
0
Злостный нарушитель
 Аватар для Verevkin
10357 / 5772 / 1274
Регистрация: 12.03.2015
Сообщений: 26,671
16.02.2020, 14:29
Цитата Сообщение от w1ld32 Посмотреть сообщение
в таймер 1 только выключаем его
Это обработчик события OnTimer?
0
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
16.02.2020, 14:31  [ТС]
Verevkin, Да именно.
0
Злостный нарушитель
 Аватар для Verevkin
10357 / 5772 / 1274
Регистрация: 12.03.2015
Сообщений: 26,671
16.02.2020, 14:35
Цитата Сообщение от w1ld32 Посмотреть сообщение
Да именно.
Тогда я пас.
Кликните здесь для просмотра всего текста
0
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
16.02.2020, 14:37  [ТС]
Verevkin, А жаль(
0
Злостный нарушитель
 Аватар для Verevkin
10357 / 5772 / 1274
Регистрация: 12.03.2015
Сообщений: 26,671
16.02.2020, 14:40
Цитата Сообщение от w1ld32 Посмотреть сообщение
А жаль(
Даже по одному методу-обработчику я вижу, что эту прогу надо выкинуть фтопку и написать по-нормальному с нуля. Тратить время на нечто мертворождённое - дорого и нет смысла.
0
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
16.02.2020, 14:45  [ТС]
Verevkin, ну так я сюда не за критикой пришел а за советом, и не претендую на правильность, а тем более гениальность, мне нужен обработчик задержки который не работает со sleep() так как несколько рабочих окон.
0
Злостный нарушитель
 Аватар для Verevkin
10357 / 5772 / 1274
Регистрация: 12.03.2015
Сообщений: 26,671
16.02.2020, 14:54
Цитата Сообщение от w1ld32 Посмотреть сообщение
ну так я сюда не за критикой пришел а за советом
Считай официальным советом эти мои слова:
Цитата Сообщение от Verevkin Посмотреть сообщение
эту прогу надо выкинуть фтопку и написать по-нормальному с нуля
Цитата Сообщение от w1ld32 Посмотреть сообщение
мне нужен обработчик задержки который не работает со sleep() так как несколько рабочих окон.
Оконная программа с задержкой в основном потоке не имеет права на существование. Это глупость.
Кликните здесь для просмотра всего текста

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
unit udPause;
 
{$R *.dfm}
 
interface
 
{$REGION 'uses'}
uses
  //============================== Модули проекта ==============================
  uHRTimer, uGlobalTypes,
  //========================= Модули проекта с формами =========================
  //=============================== Левые модули ===============================
  //=================== Системные модули, добавленные вручную ==================
  //=================== Модули, добавленные IDE автоматически ==================
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls,
  JvExControls, JvLabel, JvStaticText, Vcl.ComCtrls,
  JvExComCtrls, rkVistaProBar;
{$ENDREGION 'uses'}
 
{$REGION 'type TPauseThread = class(TThread)'}
type
  TPauseThread = class(TThread)
  private
    FTimer: THRTimer;
    FInterval: DWORD;
    FProgress: int32;
    FRemained: int32;
    FElapsed: DWORD;
    FPassCount: int64; // кол-во проходов (для отладки)
    FOnProgress: TNotifyEvent;
  protected
    procedure CallProgress; // синхронно !!!
    procedure Execute; override;
  public
    constructor Create(AInterval: DWORD); reintroduce;
    destructor Destroy; override;
    property OnProgress: TNotifyEvent read FOnProgress write FOnProgress;
    property Progress: int32 read FProgress;
    property Remained: int32 read FRemained; // сколько мс осталось
    property Elapsed: DWORD read FElapsed; // сколько мс прошло
    property PassCount: int64 read FPassCount; // кол-во проходов цикла ожидания
  end;
{$ENDREGION}
 
{$REGION 'type TPauseDlg = class(TForm)'}
type
  TPauseDlg = class(TForm)
    PanelClient: TPanel;
    PanelBottom: TPanel;
    ButtonAbort: TButton;
    PanelTimeRemain: TPanel;
    LabelBottomLeft: TLabel;
    LabelClock: TJvLabel;
    LabelCaption: TLabel;
    ShapeTimeRemain: TShape;
    ProgressBar: TVistaProBar;
    procedure ButtonAbortClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
  private
    FThread: TPauseThread;
    procedure Abort;
    procedure ThreadProgress(Sender: TObject);
    procedure ThreadTerminate(Sender: TObject);
  protected
    function GetPassCount: int64;
  public
    function ShowModal(AInterval: DWORD; const ATitle: string = ''): int32; reintroduce;
    property TotalPassCount: int64 read GetPassCount;
  end;
{$ENDREGION}
 
var
  DialogPause: TPauseDlg;
 
const
  // если интервал не превышает SLEEP_MAX_INTERVAL - 1, то окно не показывается,
  // а вызывается тупой Sleep(AInterval)
  SLEEP_MAX_INTERVAL = 200.1; // todo: сделать настраиваемым!!!
 
//function ShowPause(const AInterval: DWORD; const ATitle: string = ''): TModalResult; overload;
function ShowPauseDialog(data: TCustomDialogData): TModalResult; //overload
 
implementation
 
{$REGION 'uses'}
uses
  //============================== Модули проекта ==============================
  uRoutines,
  //========================= Модули проекта с формами =========================
  umGlobals;
  //=============================== Левые модули ===============================
  //=================== Системные модули, добавленные вручную ==================
{$ENDREGION 'uses'}
 
{$REGION 'service'}
function ShowPauseDialog(data: TCustomDialogData): TModalResult;
var
  dlg_data: TPauseDialogData absolute data;
begin
  assert(assigned(data));// мало ли...
 
  // при короткой паузе диалог не показывается,
  // т.к. юзер не успеет жмакнуть отмену.
  if dlg_data.Interval < SLEEP_MAX_INTERVAL
    then begin
            Sleep(round(dlg_data.Interval));
            Result:= mrOK;
         end
    else begin
           // диалог создаётся один раз и висит в памяти до завершения программы.
           if not Assigned(DialogPause)
             then DialogPause:= TPauseDlg.Create(Application);
           Result:= DialogPause.ShowModal(round(dlg_data.Interval));
         end;
 
  dlg_data.DialogResult:= result; // передача результата наружу
end;
 
 
{$ENDREGION}
 
{$REGION 'TPauseThread'}
{ TPauseThread }
 
procedure TPauseThread.CallProgress;
begin
  if Assigned(FOnProgress)
    then FOnProgress(Self);
end;
 
constructor TPauseThread.Create(AInterval: DWORD);
begin
  inherited Create(true);
  FInterval:= AInterval;
  FTimer:= THRTimer.Create();
  FreeOnTerminate:= true;
end;
 
destructor TPauseThread.Destroy;
begin
  FTimer.Free();
  inherited;
end;
 
procedure TPauseThread.Execute;
var
  old_progress: int32;
begin
  inherited;
  if not FTimer.StartTimer()
    then raise Exception.CreateFmt('FATAL ERROR. Не удалось запустить TPauseThread на интервале %u.', [FInterval]);
 
  FRemained:=       FInterval;
  ReturnValue:=     mrOk; // по умолчанию
  FPassCount:=      0;
  FProgress:=       0;
  old_progress:=    0;
  Synchronize(CallProgress);
 
  repeat
    FElapsed:= trunc(FTimer.ReadTimer()); // прошло с начала задержки
 
    if Terminated
      then begin
             ReturnValue:= mrAbort; // отменено юзером
             break;
           end;
 
    Yield(); // YieldProcessor();
    sleep(1);
 
    inc(FPassCount);
    FRemained:= FInterval - FElapsed; // осталось до конца задержки
    FProgress:= round(100.0 * FElapsed / FInterval);
    if FProgress <> old_progress
      then begin
             old_progress:= FProgress;
             Synchronize(CallProgress);
           end;
  until FRemained < 1; // <= 0
end;
{$ENDREGION}
 
{$REGION 'TPauseDlg'}
{ TPauseDlg }
 
procedure TPauseDlg.Abort;
begin
  FThread.Terminate();
  Application.ProcessMessages();
end;
 
procedure TPauseDlg.ButtonAbortClick(Sender: TObject);
begin
  Abort();
end;
 
procedure TPauseDlg.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:= caHide; // эта форма всегда болтается в памяти после создания
end;
 
procedure TPauseDlg.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if key = #13  // отмена по ESC
    then Abort();
end;
 
function TPauseDlg.GetPassCount: int64;
begin
  if Assigned(FThread)
    then Result:= FThread.PassCount
    else Result:= -1;
end;
 
function TPauseDlg.ShowModal(AInterval: DWORD; const ATitle: string = ''): int32;
begin
  ShowHint:= Application.ShowHint;
  KeyPreview:= true; // ловить Escape
 
  LabelCaption.Caption:= 'Ожидание ' + FloatToStrF(AInterval / 1000.0, ffGeneral, 7, 3) + ' сек'; // MillisecondsToStrNH(AInterval);
 
  // цвета прогресса в зависимоти от темы
  if CustomThemeActive
    then begin
           ProgressBar.Color:= clThemeButtonHot;
           ProgressBar.BackColor:= clThemePanel;
           ProgressBar.BorderColor:= clThemeBorder;
         end
    else begin
           ProgressBar.Color:= clLime;
           ProgressBar.BackColor:= clBtnFace;
           ProgressBar.BorderColor:= clSilver;
         end;
  ProgressBar.CornerColor:= ProgressBar.BorderColor;
 
  // подготовка и старт треда
  FThread:= TPauseThread.Create(AInterval);
  FThread.OnProgress:= ThreadProgress;
  FThread.OnTerminate:= ThreadTerminate;
  FThread.Start();
  result:= inherited ShowModal();
end;
 
procedure TPauseDlg.ThreadProgress(Sender: TObject);
var
  tt: TPauseThread absolute Sender;
begin
  ProgressBar.Position:=   tt.Progress;
  LabelClock.Caption:= MillisecondsToStrNH(Double(tt.Remained));//  Format('%d ', [tt.Remained]);
end;
 
procedure TPauseDlg.ThreadTerminate(Sender: TObject);
var
  tt: TPauseThread absolute Sender;
begin
  ModalResult:= tt.ReturnValue;
end;
 
{$ENDREGION}
 
 
end.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
unit uHRTimer;
 
interface
 
{$REGION 'uses'}
uses
  //============================== Модули проекта ==============================
  //=============================== Левые модули ===============================
  //=================== Системные модули, добавленные вручную ==================
  Windows, SysUtils, Math;
{$ENDREGION 'uses'}
 
{$REGION 'type THRTimer = class'}
type
  // --------------------- Класс - высокоточный таймер -------------------------
  THRTimer = class
  private
    StartTime: Double;
    ClockRate: Double;
    FSleepIterations: uint64;
  public
    Exists: Boolean;    // Флаг успешного создания таймера
 
    constructor Create;
    function StartTimer: Boolean; // Обнуление таймера
    function ReadTimer: Double;   // Чтение значения таймера в миллисекундах
    function ReadTimerStr: string; // Чтение таймера (возвращает строку для показа)
 
    procedure Freeze(Interval: Double); // жёсткая задержка в цикле (интервал - в миллисекундах)
    property SleepIterations: uint64 read FSleepIterations;
  end;
{$ENDREGION}
 
{$REGION 'service prototypes'}
function MillisecondsToStr(const tms: Double): string;
function MillisecondsToStrNH(const tms: Double): string; // показывает час, только если кол-во часов <> 0
function MillisecondsToStrEx(const tms: Double): string;
function SecondsToStrEx(const seconds: Double): string;
{$ENDREGION}
 
implementation
 
{$REGION 'service'}
function MillisecondsToStr(const tms: Double): string;
var
  T: DWORD;
  mS, S, M, H: Word;
begin
  T:= Trunc(tms / 1000); // целое в секундах
  ms:= Trunc(tms) mod 1000; // дробный остаток 0...1 сек
  H:= T div 3600;          // кол-во часов
  M:= (T mod 3600) div 60; // минута в часе
  S:= T mod 60;            // секунды в минуте
 
  Result:= Format('%d:%.2d:%.2d,%.3d', [H, M, S, mS]);
end;
 
function MillisecondsToStrNH(const tms: Double): string;
var
  T: DWORD;
  mS, S, M, H: Word;
begin
  // показывает час, только если кол-во часов <> 0
  T:= Trunc(tms / 1000); // целое в секундах
  ms:= Trunc(tms) mod 1000; // дробный остаток 0...1 сек
  H:= T div 3600;          // кол-во часов
  M:= (T mod 3600) div 60; // минута в часе
  S:= T mod 60;            // секунды в минуте
 
  if H = 0
    then Result:= Format('%d:%.2d,%.3d', [M, S, mS])
    else Result:= Format('%d:%.2d:%.2d,%.3d', [H, M, S, mS]);
end;
 
function MillisecondsToStrEx(const tms: Double): string;
begin
  if tms < 1.0
    then Exit(Format('%d мкс', [Trunc(tms * 1000)]));
 
  if tms < 1000.0
    then Exit(Format('%g мс', [RoundTo(tms, -3)])); //Format('%.3f мс', [tms])
 
  if tms < 60000.0
    then Exit(Format('%g сек', [tms / 1000]));
 
  Result:= MillisecondsToStr(tms);
end;
 
function SecondsToStrEx(const seconds: Double): string;
begin
  result:= MillisecondsToStrEx(1000.0 * seconds);
end;
{$ENDREGION}
 
{$REGION 'THRTimer'}
{ THRTimer }
 
constructor THRTimer.Create;
var
  QW: LARGE_INTEGER;
begin
  inherited Create;
  Exists := QueryPerformanceFrequency(Int64(QW));
  ClockRate := QW.QuadPart;
end;
 
procedure THRTimer.Freeze(Interval: Double);
begin
  // жёсткая задержка в цикле. (интервал - в миллисекундах)
  // Использовать только на ультракоротких интервалах (микросекунды)!
  FSleepIterations:= 0;
  StartTimer();
  repeat
    inc(FSleepIterations);
  until ReadTimer() > Interval;
end;
 
function THRTimer.StartTimer: Boolean;
var
  QW: LARGE_INTEGER;
begin
  Result := QueryPerformanceCounter(Int64(QW));
  StartTime := QW.QuadPart;
end;
 
function THRTimer.ReadTimer: Double;
var
  ET: LARGE_INTEGER;
begin
  QueryPerformanceCounter(Int64(ET));
  Result := 1000.0 * (ET.QuadPart - StartTime) / ClockRate;
end;
 
function THRTimer.ReadTimerStr: string;
var
  T: Double; // время в миллисекундах
begin
  T:= Self.ReadTimer();
 
  if T < 1000.0
    then Result:= Format('%.3f мс', [T])
    else Result:= MillisecondsToStr(T);
end;
{$ENDREGION}
 
end.
0
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
16.02.2020, 15:45  [ТС]
Verevkin, Что тогда основной поток? оба этих таймера находятся не на основной форме. Плюс объясните пожалуйста взаимодействие этих таймеров, почему таймер с условной третей формы выключает таймер с первой? Это основная проблема которую я не могу понять.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,612
16.02.2020, 15:49
Как и где описан этот таймер?
0
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
16.02.2020, 16:00  [ТС]
northener, оба этих таймера описаны в чилдформе.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,612
16.02.2020, 16:02
Как и где конкретно?
0
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
16.02.2020, 16:29  [ТС]
northener, Извините не очень понимаю вопрос накидаю все сразу)
Чилд форма на ней таймеры 3-4
Таймер 3
Delphi
1
2
3
4
procedure TChildForm.Timer3Timer(Sender: TObject);
begin
  Timer3.Enabled := false;
end;
Таймер 4
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure TChildForm.Timer4Timer(Sender: TObject);
var JSCode: string;
begin
  Timer4.Enabled := False;
  JSCode := 'console.log("#KolQuest" + document.getElementsByClassName("active sm_hide xs_hide md_hide")[0].textContent);';
  Chromium1.Browser.MainFrame.ExecuteJavaScript(JScode,'default_blank',0);
  StatusBar1.Panels.Items[5].Text := StatusBar1.Panels.Items[5].Text + '|';
  fl := False;
  mySleep(500, fl);
 
  if (KolQ >0) and (fs = false) Then begin
   BitBtn6.Enabled := False;
   VypolnenieZadanii;
   BitBtn6.Enabled := True;;
  end;
  if (KolC <> 30) then begin
    KolC := KolC + 1;
  end else begin
    Kolc := 0;
    StatusBar1.Panels.Items[5].Text := '|';
    Chromium1.LoadURL('http://vktarget.ru/');   // обновляем задания с перезагрузкой страницы на случай зависания
    fl := False;
    mySleep(1000, fl);
  end;
  if fs = false then Timer4.Enabled := True;
end;
Сейчас их "отлипил" так сказать, друг от друга.
mysleep выглядит так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TChildForm.MySleep(const aMSec: Integer;var aFlagBreak: Boolean);
var
Interval: Integer;
begin
    Interval := aMSec;
  while Interval>0 do
  begin
    if aFlagBreak then Exit;
    if fs then  Exit;
    sleep(100);
    Dec(Interval,100);
    Application.ProcessMessages;
  end;
end;
Выполнение
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
procedure TChildForm.VypolnenieZadanii;
var i: integer;
  zad, JSCode: string;
begin
StatusBar1.Panels.Items[0].Text := 'Начинаем выполнение заданий.';
 for i := 0 to kolq-1 do begin  //Выполняем
  zad := listbox1.Items[i];
  JScode := 'document.getElementsByClassName("task__link")['+IntTostr(i)+'].click();';
  Chromium1.Browser.MainFrame.ExecuteJavaScript(JScode,'default_blank',0);
  MySleepTimer(2000);
  StatusBar1.Panels.Items[0].Text := 'Обновляем. Ожидаем загрузку страницы задания...';
 
  //----------------------
 //  Тут Выполнение 
 
 
    MySleepTimer(2000);
 
 for i := 0 to kolq-1 do begin //Проверяем
   StatusBar1.Panels.Items[0].Text := 'Проверяем выполнение задания.';
   JScode := 'document.getElementsByClassName("default__small__btn check__btn")['+IntTostr(i)+'].click();';
   Chromium1.Browser.MainFrame.ExecuteJavaScript(JScode,'default_blank',0);
   MySleepTimer(500);
 end;
 
 Memo1.Text :='';
 ListBox1.Clear();
 StatusBar1.Panels.Items[0].Text := 'Ожидаем новые задания.';
  MySleepTimer(5000);
 Timer4.Enabled := True;
 Chromium2.LoadURL('1');
 KolQ :=0;
 JScode := 'document.getElementsByClassName("default__small__btn")[0].click();';   // обновляем задания
 Chromium1.Browser.MainFrame.ExecuteJavaScript(JScode,'default_blank',0);
  MySleepTimer(500);
end;
Слиптаймер
Delphi
1
2
3
4
5
6
7
8
9
procedure TChildForm.MySleepTimer(const aMSec: Integer);
begin
   Timer3.Interval:=aMSec; // устанавливаем паузу в мс
   Timer3.Enabled:=True;// включаем таймер
   while Timer3.Enabled do  // пока таймер включен, держим паузу
  begin
    Application.ProcessMessages;
  end;
end;
0
Модератор
4146 / 2357 / 812
Регистрация: 15.11.2015
Сообщений: 9,427
16.02.2020, 16:34
Цитата Сообщение от w1ld32 Посмотреть сообщение
Timer1.Enabled:=True;// включаем таймер
while Timer1.Enabled do // пока таймер включен, держим паузу
begin
Application.ProcessMessages;
end;
Ууу, совсем всё плохо. Надо всё переделывать. Здесь не должно морозиться в цикле. Сейчас даже хуже, чем просто sleep.

Нужно разбить процедуру с задержкой на 2 части: первая часть до задержки и вторая часть после задержки. Оформить их как 2 процедуры. Вызвать первую процедуру, запустить таймер и в обработчике таймера вызвать вторую процедуру. Так все формы будут работать вместе без зависания в циклах.
0
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
16.02.2020, 16:38  [ТС]
AzAtom, Спасибо сейчас подумаю как лучше это сделать, тут просто проблема усугубляется получением данных с сайта, которая тоже по сути сделана через адский костыль...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.02.2020, 16:38
Помогаю со студенческими работами здесь

Таймер похожий на таймер в delphi
Добрый всем)В общем хочу создать класс таймера похожий на класс таймера на delphi.Суть в том,что я хочу включать и выключать таймер за счет...

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

секундомер или таймер
Добрый вечер, есть определённые действия, которые нельзя выполнять, пока не пройдёт определённый кд, как это настроить (что бы программа не...

многопоточность и Controls или таймер
необходимо реализовать постоянное обновление изображений (контролов PictureBox) при движении изображения все остальные изображения...

Таймер или типа того
Доброго времени суток. Поискал по интернету куча примеров, но то, что мне нужно - я так и не нашел((( Мне нужна такая штука: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru