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

Зависает программа при выполнении цикла

16.09.2013, 02:48. Показов 1898. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, на 3 кнопки написаны циклы, при их выполнении программа зависает, подскажите в чем проблема пожалуйста, за кривые коды не ругайте я самоучка))


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
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.Buttons;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
  private
    procedure wmhotkey (var mess:twmhotkey);message wm_hotkey;
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  dc1:hdc;
  dc2:hdc;
  dc3:hdc;
  Pixel1 : TColor;
  Pixel2 : TColor;
  Pixel3 : TColor;
 
implementation
 
{$R *.dfm}
procedure Tform1.wmhotkey(var mess: TWMHotKey);
begin
  if mess.HotKey=1 then form1.Button1.Click;
  if mess.HotKey=2 then
  begin
  form1.BitBtn1.Click
  end;
  if mess.HotKey=3 then form1.BitBtn4.Click;
end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 
repeat
 repeat
 
   if Pixel1<>$FFFFFF then
   begin
   keybd_event(ord('1'), MapVirtualKey(ord('1'), 0), 0, 0);
keybd_event(ord('1'), 0, KEYEVENTF_KEYUP, 0);
   keybd_event(71, 0, 0, 0);
    sleep(4000);
   keybd_event(71, 0, KEYEVENTF_KEYUP, 0);
   keybd_event(16, 0, 0, 0);
   keybd_event(66, 0, 0, 0);
   keybd_event(66, 0, KEYEVENTF_KEYUP, 0);
   keybd_event(16, 0, KEYEVENTF_KEYUP, 0);
   setcursorpos(531,16);
   mouse_event(mouseeventf_leftdown,0,0,0,0);
mouse_event(mouseeventf_leftup,0,0,0,0);
   keybd_event(84, 0, 0, 0);
   keybd_event(84, 0, KEYEVENTF_KEYUP, 0);
 
   sleep(6000);
   end
 until Pixel1<>$FFFFFF;
until form1.Label3.Caption='БОТ ВЫКЛЮЧЕН';
 
 
 
 
 
end;
 
 
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
 
 repeat
 
if Pixel2<>$FFFFFF then
   begin
   sleep(100);
   keybd_event(ord('2'), MapVirtualKey(ord('2'), 0), 0, 0);
keybd_event(ord('2'), 0, KEYEVENTF_KEYUP, 0);
  keybd_event(71, 0, 0, 0);
    sleep(4000);
   keybd_event(71, 0, KEYEVENTF_KEYUP, 0);
   sleep(10);
   keybd_event(16, 0, 0, 0);
   keybd_event(66, 0, 0, 0);
   sleep(10);
   keybd_event(66, 0, KEYEVENTF_KEYUP, 0);
   keybd_event(16, 0, KEYEVENTF_KEYUP, 0);
   sleep(10);
   setcursorpos(531,16);
   sleep(10);
   mouse_event(mouseeventf_leftdown,0,0,0,0);
mouse_event(mouseeventf_leftup,0,0,0,0);
sleep(10);
   keybd_event(84, 0, 0, 0);
   keybd_event(84, 0, KEYEVENTF_KEYUP, 0);
     sleep(6000);
   end
 until Pixel2<>$FFFFFF;
 
end;
 
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
repeat
 repeat
if Pixel3<>$FFFFFF then
   begin
   sleep(100);
   keybd_event(ord('3'), MapVirtualKey(ord('3'), 0), 0, 0);
keybd_event(ord('3'), 0, KEYEVENTF_KEYUP, 0);
  keybd_event(71, 0, 0, 0);
    sleep(4000);
   keybd_event(71, 0, KEYEVENTF_KEYUP, 0);
   sleep(10);
   keybd_event(16, 0, 0, 0);
   keybd_event(66, 0, 0, 0);
   sleep(10);
   keybd_event(66, 0, KEYEVENTF_KEYUP, 0);
   keybd_event(16, 0, KEYEVENTF_KEYUP, 0);
   sleep(10);
   setcursorpos(531,16);
   sleep(10);
   mouse_event(mouseeventf_leftdown,0,0,0,0);
mouse_event(mouseeventf_leftup,0,0,0,0);
sleep(10);
   keybd_event(84, 0, 0, 0);
   keybd_event(84, 0, KEYEVENTF_KEYUP, 0);
   sleep(6000);
   end
 until Pixel3<>$FFFFFF;
 
until form1.Label3.Caption='БОТ ВЫКЛЮЧЕН';
end;
 
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
Form1.Label3.Caption:='БОТ ВЫКЛЮЧЕН';
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
sleep(1000);
keybd_event(ord('1'), MapVirtualKey(ord('1'), 0), 0, 0);
keybd_event(ord('1'), 0, KEYEVENTF_KEYUP, 0);
setcursorpos(346,327);
mouse_event(mouseeventf_leftdown,0,0,0,0);
mouse_event(mouseeventf_leftup,0,0,0,0);
sleep(1000);
keybd_event(ord('2'), MapVirtualKey(ord('2'), 0), 0, 0);
keybd_event(ord('2'), 0, KEYEVENTF_KEYUP, 0);
setcursorpos(350,327);
mouse_event(mouseeventf_leftdown,0,0,0,0);
mouse_event(mouseeventf_leftup,0,0,0,0);
sleep(1000);
keybd_event(ord('3'), MapVirtualKey(ord('3'), 0), 0, 0);
keybd_event(ord('3'), 0, KEYEVENTF_KEYUP, 0);
setcursorpos(354,327);
mouse_event(mouseeventf_leftdown,0,0,0,0);
mouse_event(mouseeventf_leftup,0,0,0,0);
end;
 
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
unregisterhotkey(handle,1);
unregisterhotkey(handle,2);
unregisterhotkey(handle,3);
releasedc(0,dc1);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
registerhotkey(Handle,1,mod_control,vk_F1);
 registerhotkey(Handle,2,mod_control,vk_F2);
 registerhotkey(Handle,3,mod_control,vk_F3);
 dc1:=getdc(0);
 Pixel1:=GetPixel(dc1,346,325);
 Pixel2:=getpixel(dc1,350,325);
  Pixel3:=getpixel(dc1,354,325);
end;
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2013, 02:48
Ответы с готовыми решениями:

Зависает форма при выполнении цикла
Всем привет! Пытаюсь посредством цикла перемешать элементы массива, избегая повторов. Пользуюсь...

Как сделать чтобы при выполнении цикла программа не зависала
Люди, подскажите. Есть цикл от 0 до 100000 , заполняю таблицу, короче замудреная операция! Как мне...

Завис при выполнении цикла
Если в цикле добавлять строки в мемо-поле в большом количестве ну тысяч сто например, то &quot;зависает...

Ошибка программы при выполнении цикла перебора
Добрый день коллеги ))) Помогите разобраться. При выполнении процедуры - цикла перебора...

5
angstrom
16.09.2013, 03:02 2
Где гарантия, что эти условия выполнятся?
Delphi
1
2
3
4
...
until Pixel2<>$FFFFFF
...
until Pixel3<>$FFFFFF;
Нужно предусмотреть какой-либо аварийный выход при не нахождении цвета.
273 / 241 / 56
Регистрация: 29.05.2012
Сообщений: 889
16.09.2013, 03:17 3
По всей видимости проблема в условиях завершения цикла, особенно там где
Delphi
1
until form1.Label3.Caption='БОТ ВЫКЛЮЧЕН';
здесь метод зависает в бесконечном цикле, поток зависает и обработка следующих сообщений не происходит.
То есть получить уже нажатие горячей клавиши или клика по другой кнопке не получится, как и всех других оконных сообщений.

Добавлено через 4 минуты
Я бы рекомендовал вынести весь код работы бота из кнопок в обработчик события таймера, а не зацикливать методы.
1
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 13
16.09.2013, 08:55  [ТС] 4
Спасибо попробую таймером сделать.

Добавлено через 4 часа 58 минут
Написал через таймеры мысль по-моему правильная, но где-то косяк, глаза уже замылились не вижу.
Все срабатывает, но не возвращается обратно, таймеры 2,5,6 себя не выключают. Если один из них сработал, остальные уже никогда не сработают.

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
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.Buttons,
  Vcl.ExtCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Timer1: TTimer;
    Timer2: TTimer;
    Timer3: TTimer;
    Timer4: TTimer;
    Timer5: TTimer;
    Timer6: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
    procedure Timer4Timer(Sender: TObject);
    procedure Timer5Timer(Sender: TObject);
    procedure Timer6Timer(Sender: TObject);
  private
    procedure wmhotkey (var mess:twmhotkey);message wm_hotkey;
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
   Form1: TForm1;
   dc1:hdc;
   dc2:hdc;
   dc3:hdc;
   Pixel1 : TColor;
   Pixel2 : TColor;
   Pixel3 : TColor;
 
implementation
 
{$R *.dfm}
procedure Tform1.wmhotkey(var mess: TWMHotKey);
   begin
      if mess.HotKey=1 then form1.Button1.Click;
      if mess.HotKey=2 then
         begin
            form1.BitBtn1.Click;
            form1.BitBtn2.Click;
            form1.BitBtn3.Click
         end;
      if mess.HotKey=3 then form1.BitBtn4.Click;
   end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
   begin
      timer4.Enabled:=true;
   end;
 
 
procedure TForm1.BitBtn2Click(Sender: TObject);
   begin
      timer1.Enabled:=true;
   end;
 
procedure TForm1.BitBtn3Click(Sender: TObject);
   begin
      timer3.Enabled:=true;
   end;
 
procedure TForm1.BitBtn4Click(Sender: TObject);
   begin
      Form1.Label3.Caption:='БОТ ВЫКЛЮЧЕН';
      Timer4.Enabled:=false;
      Timer1.Enabled:=false;
      Timer3.Enabled:=false;
   end;
 
procedure TForm1.Button1Click(Sender: TObject);
   begin
      sleep(1000);
      keybd_event(ord('1'), MapVirtualKey(ord('1'), 0), 0, 0);
      keybd_event(ord('1'), 0, KEYEVENTF_KEYUP, 0);
      setcursorpos(346,327);
      mouse_event(mouseeventf_leftdown,0,0,0,0);
      mouse_event(mouseeventf_leftup,0,0,0,0);
      sleep(1000);
      keybd_event(ord('2'), MapVirtualKey(ord('2'), 0), 0, 0);
      keybd_event(ord('2'), 0, KEYEVENTF_KEYUP, 0);
      setcursorpos(350,327);
      mouse_event(mouseeventf_leftdown,0,0,0,0);
      mouse_event(mouseeventf_leftup,0,0,0,0);
      sleep(1000);
      keybd_event(ord('3'), MapVirtualKey(ord('3'), 0), 0, 0);
      keybd_event(ord('3'), 0, KEYEVENTF_KEYUP, 0);
      setcursorpos(354,327);
      mouse_event(mouseeventf_leftdown,0,0,0,0);
      mouse_event(mouseeventf_leftup,0,0,0,0);
   end;
 
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
   begin
      unregisterhotkey(handle,1);
      unregisterhotkey(handle,2);
      unregisterhotkey(handle,3);
   end;
 
procedure TForm1.FormCreate(Sender: TObject);
   begin
      registerhotkey(Handle,1,mod_control,vk_F1);
      registerhotkey(Handle,2,mod_control,vk_F2);
      registerhotkey(Handle,3,mod_control,vk_F3);
   end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
   begin
      dc2:=getdc(0);
      Pixel2:=GetPixel(dc2,350,325);
      if (form1.Timer5.Enabled=false) and (form1.Timer6.Enabled=false) then
         begin
            if Pixel2<>$FFFFFF then
            begin
            releasedc(0,dc2);
            form1.Timer2.Enabled:=true;
            form1.Timer1.Enabled:=false
            end;
         end;
      releasedc(0,dc2);
   end;
 
procedure TForm1.Timer2Timer(Sender: TObject);
   begin
       form1.Timer4.Enabled:=false;
       sleep(10);
       keybd_event(ord('2'), MapVirtualKey(ord('2'), 0), 0, 0);
       keybd_event(ord('2'), 0, KEYEVENTF_KEYUP, 0);
       keybd_event(71, 0, 0, 0);
       sleep(4000);
       keybd_event(71, 0, KEYEVENTF_KEYUP, 0);
       sleep(10);
       keybd_event(16, 0, 0, 0);
       keybd_event(66, 0, 0, 0);
       sleep(10);
       keybd_event(66, 0, KEYEVENTF_KEYUP, 0);
       keybd_event(16, 0, KEYEVENTF_KEYUP, 0);
       sleep(10);
       setcursorpos(531,16);
       sleep(10);
       mouse_event(mouseeventf_leftdown,0,0,0,0);
       mouse_event(mouseeventf_leftup,0,0,0,0);
       sleep(10);
       keybd_event(84, 0, 0, 0);
       keybd_event(84, 0, KEYEVENTF_KEYUP, 0);
       form1.Timer1.Enabled:=true;
       form1.Timer2.Enabled:=false;
   end;
 
procedure TForm1.Timer3Timer(Sender: TObject);
   begin
      dc3:=getdc(0);
      Pixel3:=GetPixel(dc3,354,325);
      if (form1.Timer2.Enabled=false) and (form1.Timer5.Enabled=false) then
         begin
            if Pixel3<>$FFFFFF then
               begin
                  releasedc(0,dc3);
                  form1.Timer6.Enabled:=true;
                  form1.Timer3.Enabled:=false
               end;
         end;
      releasedc(0,dc3);
   end;
 
procedure TForm1.Timer4Timer(Sender: TObject);
   begin
      dc1:=getdc(0);
      Pixel1:=GetPixel(dc1,346,325);
      if (form1.Timer2.Enabled=false) and (form1.Timer6.Enabled=false) then
         begin
            if Pixel1<>$FFFFFF then
            begin
            releasedc(0,dc1);
            form1.Timer5.Enabled:=true;
            form1.Timer4.Enabled:=false
            end;
         end;
      releasedc(0,dc1);
   end;
 
procedure TForm1.Timer5Timer(Sender: TObject);
   begin
       form1.Timer4.Enabled:=false;
       sleep(10);
       keybd_event(ord('1'), MapVirtualKey(ord('1'), 0), 0, 0);
       keybd_event(ord('1'), 0, KEYEVENTF_KEYUP, 0);
       keybd_event(71, 0, 0, 0);
       sleep(4000);
       keybd_event(71, 0, KEYEVENTF_KEYUP, 0);
       sleep(10);
       keybd_event(16, 0, 0, 0);
       keybd_event(66, 0, 0, 0);
       sleep(10);
       keybd_event(66, 0, KEYEVENTF_KEYUP, 0);
       keybd_event(16, 0, KEYEVENTF_KEYUP, 0);
       sleep(10);
       setcursorpos(531,16);
       sleep(10);
       mouse_event(mouseeventf_leftdown,0,0,0,0);
       mouse_event(mouseeventf_leftup,0,0,0,0);
       sleep(10);
       keybd_event(84, 0, 0, 0);
       keybd_event(84, 0, KEYEVENTF_KEYUP, 0);
       form1.Timer4.Enabled:=true;
       form1.Timer5.Enabled:=false;
   end;
 
procedure TForm1.Timer6Timer(Sender: TObject);
   begin
       form1.Timer3.Enabled:=false;
       sleep(10);
       keybd_event(ord('3'), MapVirtualKey(ord('3'), 0), 0, 0);
       keybd_event(ord('3'), 0, KEYEVENTF_KEYUP, 0);
       keybd_event(71, 0, 0, 0);
       sleep(4000);
       keybd_event(71, 0, KEYEVENTF_KEYUP, 0);
       sleep(10);
       keybd_event(16, 0, 0, 0);
       keybd_event(66, 0, 0, 0);
       sleep(10);
       keybd_event(66, 0, KEYEVENTF_KEYUP, 0);
       keybd_event(16, 0, KEYEVENTF_KEYUP, 0);
       sleep(10);
       setcursorpos(531,16);
       sleep(10);
       mouse_event(mouseeventf_leftdown,0,0,0,0);
       mouse_event(mouseeventf_leftup,0,0,0,0);
       sleep(10);
       keybd_event(84, 0, 0, 0);
       keybd_event(84, 0, KEYEVENTF_KEYUP, 0);
       form1.Timer3.Enabled:=true;
       form1.Timer6.Enabled:=false;
   end;
 
end.
Добавлено через 34 минуты
Цитата Сообщение от angstrom Посмотреть сообщение
Где гарантия, что эти условия выполнятся?
Delphi
1
2
3
4
...
until Pixel2<>$FFFFFF
...
until Pixel3<>$FFFFFF;
Нужно предусмотреть какой-либо аварийный выход при не нахождении цвета.
цвет есть всегда, просто меняется с белого на другой, цикл это должен улавливать поидее
0
angstrom
16.09.2013, 14:17 5
Таймера достаточно одного.
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 13
18.09.2013, 18:22  [ТС] 6
Цитата Сообщение от zvoronz Посмотреть сообщение
По всей видимости проблема в условиях завершения цикла, особенно там где
Delphi
1
until form1.Label3.Caption='БОТ ВЫКЛЮЧЕН';
здесь метод зависает в бесконечном цикле, поток зависает и обработка следующих сообщений не происходит.
То есть получить уже нажатие горячей клавиши или клика по другой кнопке не получится, как и всех других оконных сообщений.

Добавлено через 4 минуты
Я бы рекомендовал вынести весь код работы бота из кнопок в обработчик события таймера, а не зацикливать методы.
С таймерами все получилось спасибо!
0
18.09.2013, 18:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2013, 18:22
Помогаю со студенческими работами здесь

При выполнении кода форма зависает. Как вывести прогрессбар?
Пишу программу, которая должна с моего сайта скачать нудный файл, и старый заменить новым. Типа...

Как реализовать экран загрузки (без фризов) при выполнении программой долгого цикла?
3) Как реализовать экран загрузки (без фризов) при выполнении программой долгого цикла? Delphi XE5

При выполнении запроса, зависает программа
Добрый день уважаемые форумчане и гуру Delphi. Подскажите пожалуйста. Выполняю такой код программы...

При выполнении парсинга программа зависает
Занимаюсь C# недавно. Поэтому не могу решить проблему самостоятельно. При выполнении кода...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru