Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Потоки / 25 сообщений из 26, страница 1 из 2
28.04.2020, 03:29
    #39952191
yisanog246
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
Такой вопрос. Сделал простой кликер с перемещением курсора по указанным координатам + кликание по данным координатам. Но появилась такая проблема во время работы, тоесть когда нажимаю кнопку зависает сама форма. Прошерстил интернет и так понял что проблема в том что код нагружает форму и она из за этого виснет. Из чего сделал вывод что надо сделать поток. Но поток не получается сделать. Не понимаю почему все испробовал вообще никак. Не могу как прописать что бы поток выполнял функции кнопки. Или мб это как то по другому должно быть. Надеюсь вот что вы мне подскажите как исправить. Application.ProcessMessages не помог мне.
ну либо пример кода как можно реализовать клик по координатам через поток
...
Рейтинг: 0 / 0
28.04.2020, 07:07
    #39952195
Sinemurius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
Что такое кликер ?
Что означает "перемещение курсора по указанным координатам" ? Какого курсора ? Курсора мыши ?
Что такое "кликание по указанным координатам" ?
Из чего Вы сделали вывод, что Вам нужен поток ?
Почему Вы решили, что "поток может выполнять функции кнопки" ?
Что означает фраза "как можно реализовать клик по координатам через поток" ?

Иными словами, попробуйте представить, что читатели Вашего поста ничего не знают о том, что Вы хотите сделать и как Вы пытаетесь сделать. Представьте, что они не читали Ваш код.

И после этого напишите все заново.
...
Рейтинг: 0 / 0
28.04.2020, 07:19
    #39952197
Exteris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
Поток не поможет. Ищи в каком месте зависает программа.
...
Рейтинг: 0 / 0
28.04.2020, 07:44
    #39952199
Потоки
yisanog246
Такой вопрос. Сделал простой кликер с перемещением курсора по указанным координатам + кликание по данным координатам. Но появилась такая проблема во время работы, тоесть когда нажимаю кнопку зависает сама форма. Прошерстил интернет и так понял что проблема в том что код нагружает форму и она из за этого виснет. Из чего сделал вывод что надо сделать поток. Но поток не получается сделать. Не понимаю почему все испробовал вообще никак. Не могу как прописать что бы поток выполнял функции кнопки. Или мб это как то по другому должно быть. Надеюсь вот что вы мне подскажите как исправить. Application.ProcessMessages не помог мне.
ну либо пример кода как можно реализовать клик по координатам через поток

Если клик один, то даже если форма и зависает - это длиться микросекунды и не должно быть заметно. Думается мне причины тут не в потоке.
...
Рейтинг: 0 / 0
28.04.2020, 08:06
    #39952202
yisanog246
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
Sinemurius, понял) сейчас уточню все вопросы). Автокликер: мне нужно что бы мышка курсора сама передвигалась по координатам которые я указал в коде и делала клик по этим координатам. Для этого я использовал это:
Код: pascal
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.
procedure TForm1.Button1Click(Sender: TObject);
begin
sleep(4500);
setcursorpos(107,556);  // кнопка поиска
mouse_event(mouseeventf_leftdown,0,0,0,0);
mouse_event(mouseeventf_leftup,0,0,0,0);
sleep(4500);
setcursorpos(482,505);  // поиск плитки
mouse_event(mouseeventf_leftdown,0,0,0,0);
mouse_event(mouseeventf_leftup,0,0,0,0);
sleep(4500);
setcursorpos(661,378); // выбрать плитку
mouse_event(mouseeventf_leftdown,0,0,0,0);
mouse_event(mouseeventf_leftup,0,0,0,0);
sleep(4500);
setcursorpos(896,508);  //кнопка сбор
mouse_event(mouseeventf_leftdown,0,0,0,0);
mouse_event(mouseeventf_leftup,0,0,0,0);
sleep(4500);
setcursorpos(938,151); // кнопка новые войска
mouse_event(mouseeventf_leftdown,0,0,0,0);
mouse_event(mouseeventf_leftup,0,0,0,0);
sleep(4500);
setcursorpos(836,611); //на марш
mouse_event(mouseeventf_leftdown,0,0,0,0);
mouse_event(mouseeventf_leftup,0,0,0,0);
sleep(4500);
button1.Click;
end;



Как можно видеть там явно не 1 строчка. После того как жму кнопку на форме которая выполняет эти функции. Форма подвисает пока не выполнит их. А так как нужно что бы эти действия повторялись постоянно( тоесть зацикленно ), то выходит что форма висит просто и не отвечает ни на что. Как понял Я( который понимает не много ), то это связанно с тем что весь процесс происходит в главной форме. Из этого выходит вопрос. Можно ли сделать так что бы эти действия выполнялись в фоновом процессе ( а как я понял это отдельный поток ) что бы не нагружать главную форму, или нет. Если можно был бы очень признателе если бы подсказали примером, или объяснили немного. Книжки читал, видосы и гугл исползовал. Не получается у меня к сожалению. Прошу помощи у вас)
...
Рейтинг: 0 / 0
28.04.2020, 08:10
    #39952204
LocksmithPC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
Чо это?!1
...
Рейтинг: 0 / 0
28.04.2020, 08:40
    #39952207
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
yisanog246,

Форма у вас фризится из-за Sleep'ов. По идее операцию ожидания можно перенести в другой поток, который будет сигнализировать главному, что настало время делать то-то и то-то. Т.е. сделать поток, который крутится бесконечно, в нём реализовать ожидание (Application.ProcessMessages нельзя использовать) и отправку сообщения главной форме, в котором в параметре указать, какой шаг нужно делать. А на главной форме в обработке события реализовать перемещение курсора и клик. Вот примерное направление.
...
Рейтинг: 0 / 0
28.04.2020, 08:43
    #39952208
yisanog246
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
goldmi45,
Понял. Спасибо буду пробовать.
...
Рейтинг: 0 / 0
28.04.2020, 08:43
    #39952209
Потоки
goldmi45
yisanog246,

Форма у вас фризится из-за Sleep'ов. По идее операцию ожидания можно перенести в другой поток, который будет сигнализировать главному, что настало время делать то-то и то-то. Т.е. сделать поток, который крутится бесконечно, в нём реализовать ожидание (Application.ProcessMessages нельзя использовать) и отправку сообщения главной форме, в котором в параметре указать, какой шаг нужно делать. А на главной форме в обработке события реализовать перемещение курсора и клик. Вот примерное направление.

Проще же через таймер сделать? Чем в дебри потоков лезть.
...
Рейтинг: 0 / 0
28.04.2020, 08:51
    #39952212
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
Андрей Игоревич,

таймер выполняется в главном потоке. И фриз главной формы не исчезнет.
...
Рейтинг: 0 / 0
28.04.2020, 08:51
    #39952213
yisanog246
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
Андрей Игоревич, если через таймер то надо будет не 1 таймер делать верно? в один же нельзя все прописать?
...
Рейтинг: 0 / 0
28.04.2020, 08:52
    #39952215
yisanog246
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
goldmi45, понял
...
Рейтинг: 0 / 0
28.04.2020, 08:52
    #39952216
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
yisanog246
Код: pascal
1.
2.
3.
4.
5.
procedure TForm1.Button1Click(Sender: TObject);
begin
sleep(4500);
button1.Click;
end;


Здесь чудесно всё.
...
Рейтинг: 0 / 0
28.04.2020, 09:04
    #39952218
yisanog246
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
wadman, а вот это не понял)
...
Рейтинг: 0 / 0
28.04.2020, 09:33
    #39952229
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
yisanog246,

кнопка нажимает сама на себя безусловно - это вечное зависание приложения до переполнения стека.

ЗЫ. Кликер для своего приложения таким способом - пустая трата времени. Кнопки, события и так доступны своему приложению.
Кликер для другого приложения, если эта игра, бесполезен, т.к. в них давно встроены защиты от волшебных перемещений мыши и фокуса.
...
Рейтинг: 0 / 0
28.04.2020, 09:36
    #39952231
yisanog246
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
wadman, ну не знаю. у меня все работает норм
...
Рейтинг: 0 / 0
28.04.2020, 09:47
    #39952234
Потоки
goldmi45
Андрей Игоревич,
таймер выполняется в главном потоке. И фриз главной формы не исчезнет.

Зависание формы происходит из-за "sleep", который при таймере не нужен.
yisanog246
Андрей Игоревич, если через таймер то надо будет не 1 таймер делать верно? в один же нельзя все прописать?

Можно в несколько, можно в один, но с условием, например счетчик -


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
var
 i:integer;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  case i of
  1: begin
      setcursorpos(107,556);
      mouse_event(mouseeventf_leftdown,0,0,0,0);
      mouse_event(mouseeventf_leftup,0,0,0,0);
     end;
  2: begin
      setcursorpos(482,505); 
      mouse_event(mouseeventf_leftdown,0,0,0,0);
      mouse_event(mouseeventf_leftup,0,0,0,0);
     end;
  3: //ну и так далее

  end;

  Inc(i)

  if i = 10 then i := 1; //ну или сколько там будет максимальное i;
end;


Это всё, конечно, знатный "колхоз".
...
Рейтинг: 0 / 0
28.04.2020, 10:21
    #39952245
LocksmithPC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
Андрей Игоревич

Это всё, конечно, знатный "колхоз".


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
procedure MouseClick(const AX, AY: Integer) ;
begin
  setcursorpos(AX, AY);

  mouse_event(mouseeventf_leftdown, 0, 0, 0, 0);
  mouse_event(mouseeventf_leftup, 0, 0, 0, 0);
end;

var
  i: Integer;

procedure Timer1Timer(Sender: TObject);
begin
  case i of
    1: MouseClick(107, 556);
    2: MouseClick(482, 505); 
    3: //ну и так далее
  end;

  Inc(i);

  if i = 10 then
    Timer1.Enabled := False;
end;
...
Рейтинг: 0 / 0
28.04.2020, 11:02
    #39952264
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
безотносительно всего остального кода в теме, таймер думаю вполне допустим что бы вот в самом деле в доп. поток не лезть и с синхрой не возится и так всяко. только что i лучше сделать полем формы
...
Рейтинг: 0 / 0
01.05.2020, 12:39
    #39953503
yisanog246
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
Код: pascal
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.
type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  MyThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure Spat;
  end;

var
  Form1: TForm1;
  TMyThread: MyThread;
implementation

{$R *.dfm}

procedure MyThread.Execute;
begin
sleep(4500);
Synchronize(Spat);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread:=MyThread.Create(False);
end;

procedure MyThread.Spat;
begin
setcursorpos(107,556);

setcursorpos(482,505);

setcursorpos(661,378);

Setcursorpos(896,508);
end;

end.



Решил через потоки делать. Поток запускается все ок. Но надо делать остановку потока и запускать его снова после каждого передвижения курсора мыши. Не могу разобраться как правильно прописать это : TMyThread.Suspend;
TMyThread.Resume;
Ну и по коду подскажите, а то кажется как то через дебри я поток запускаю. Пробовал с кнопки запустить поток, но не получается.
...
Рейтинг: 0 / 0
01.05.2020, 12:41
    #39953504
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
Да, отличный пример как делать не надо.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
01.05.2020, 12:47
    #39953508
yisanog246
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
Dimitry Sibiryakov,
Даже спорить не буду) А как лучше подскажите пожалуйста
...
Рейтинг: 0 / 0
01.05.2020, 15:44
    #39953560
yisanog246
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
Ребят подскажите?
...
Рейтинг: 0 / 0
01.05.2020, 15:52
    #39953562
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
Воспользоваться TTimer.
...
Рейтинг: 0 / 0
02.05.2020, 13:35
    #39953702
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки
yisanog246
Ребят подскажите?

Вам уже подсказали: 22124011 , только переменную i описать как поле формы, а не глобально.
И положить на форму таймер с интервалом 4500.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Потоки / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]