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

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

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


Доброго. В проге есть основная форма и в процессе работы создается 1-2-3-4-5 форм наследников все одного типа, но вот в чем загвоздка, на форме наследника организованна задержка при помощи таймера и соответственно есть дополнительные условия выхода из этих задержек, которые запускает основной таймер. Так вот пока открыто одно окно все работает отлично, все задержки срабатывают как надо и по времени и по месту. Стоит только запустить процесс на второй форме в основном таймере которого также есть условие прерывания то эти прерывания срабатывают и в первой форме. Не так давно работаю в делфи и не знаю так ли это должно работать, я думал форма созданная с таймером то таймер будет работать только на эту форму. Вообще нагородил нихрена не понятно даже самому.((
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2020, 13:46
Ответы с готовыми решениями:

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

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

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

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

16
Продавец времени
4901 / 2678 / 616
Регистрация: 12.03.2015
Сообщений: 12,983
16.02.2020, 14:13 2
покаж кот.
обработчик события OnTimer.
0
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
16.02.2020, 14:22  [ТС] 3
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
Продавец времени
4901 / 2678 / 616
Регистрация: 12.03.2015
Сообщений: 12,983
16.02.2020, 14:29 4
Цитата Сообщение от w1ld32 Посмотреть сообщение
в таймер 1 только выключаем его
Это обработчик события OnTimer?
0
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
16.02.2020, 14:31  [ТС] 5
Verevkin, Да именно.
0
Продавец времени
4901 / 2678 / 616
Регистрация: 12.03.2015
Сообщений: 12,983
16.02.2020, 14:35 6
Цитата Сообщение от w1ld32 Посмотреть сообщение
Да именно.
Тогда я пас.
Кликните здесь для просмотра всего текста
0
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
16.02.2020, 14:37  [ТС] 7
Verevkin, А жаль(
0
Продавец времени
4901 / 2678 / 616
Регистрация: 12.03.2015
Сообщений: 12,983
16.02.2020, 14:40 8
Цитата Сообщение от w1ld32 Посмотреть сообщение
А жаль(
Даже по одному методу-обработчику я вижу, что эту прогу надо выкинуть фтопку и написать по-нормальному с нуля. Тратить время на нечто мертворождённое - дорого и нет смысла.
0
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
16.02.2020, 14:45  [ТС] 9
Verevkin, ну так я сюда не за критикой пришел а за советом, и не претендую на правильность, а тем более гениальность, мне нужен обработчик задержки который не работает со sleep() так как несколько рабочих окон.
0
Продавец времени
4901 / 2678 / 616
Регистрация: 12.03.2015
Сообщений: 12,983
16.02.2020, 14:54 10
Цитата Сообщение от 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  [ТС] 11
Verevkin, Что тогда основной поток? оба этих таймера находятся не на основной форме. Плюс объясните пожалуйста взаимодействие этих таймеров, почему таймер с условной третей формы выключает таймер с первой? Это основная проблема которую я не могу понять.
0
пофигист широкого профиля
4292 / 2812 / 796
Регистрация: 15.07.2013
Сообщений: 16,315
16.02.2020, 15:49 12
Как и где описан этот таймер?
0
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
16.02.2020, 16:00  [ТС] 13
northener, оба этих таймера описаны в чилдформе.
0
пофигист широкого профиля
4292 / 2812 / 796
Регистрация: 15.07.2013
Сообщений: 16,315
16.02.2020, 16:02 14
Как и где конкретно?
0
1 / 1 / 0
Регистрация: 06.10.2015
Сообщений: 81
16.02.2020, 16:29  [ТС] 15
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
1988 / 985 / 361
Регистрация: 15.11.2015
Сообщений: 3,983
16.02.2020, 16:34 16
Цитата Сообщение от 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  [ТС] 17
AzAtom, Спасибо сейчас подумаю как лучше это сделать, тут просто проблема усугубляется получением данных с сайта, которая тоже по сути сделана через адский костыль...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2020, 16:38

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.