2 pętle until - zapętla się

Odpowiedz Nowy wątek
2011-07-31 14:32
0

Piszę prosty program, który klika 40 razy myszką w jednej linii (za każdym razem o 10 px przesuwa się w prawo) i tak 5 razy, niestety używając mojego kodu nie wiem dlaczego on wykonuje to co jest w małej pętli, ale nie wykonuje nic z dużej. Wg mojego założenia powinien działać tak:

  • to punkt w którym kursor klika LPM:

+++++++++[40 razy]++++++++++ (wraca do pierwszego plusa i zaczyna znowu to samo)
a tymczasem dzieje się:
+++++++++[40 razy]++++++++++ Zatrzymuje się na 3 sekundy i leci dalej++++++++++++++++++[nieskończenie wiele razy]+++++++++++(następuje zapętlenie)

 a:=0;
z:=0;
repeat //duza petla
x1:=x;
  repeat //mala petla krokow
   SetCursorPos(x1, y);
   mouse_event(MOUSEEVENTF_LEFTDOWN, X1, Y, 0, 0);
   mouse_event(MOUSEEVENTF_LEFTUP, X1, Y, 0, 0);
   x1:=x1+10; // dlugosc skoku
   a:=a+1;
  until a=40; //koniec malej
z:=z+1;
sleep(3000);
until z=5;//koniec duzej

Czy ktoś mi powie, gdzie popełniłem błąd? Pozdrawiam.

edytowany 2x, ostatnio: Huherko, 2011-07-31 14:40

Pozostało 580 znaków

2011-07-31 14:41
Opi
a:=0;
z:=0;
repeat //duza petla
x1:=x;
  repeat //mala petla krokow
   SetCursorPos(x1, y);
   mouse_event(MOUSEEVENTF_LEFTDOWN, X1, Y, 0, 0);
   Application.ProcessMessages;   
   mouse_event(MOUSEEVENTF_LEFTUP, X1, Y, 0, 0);
   Inc(x1,10); // dlugosc skoku
   Inc(a);
  until a>40; //koniec malej
Inc(z);
 
{Nie podoba mi się to zwolnienie...}
Sleep(1000);
Application.ProcessMessages; 
Sleep(1000);
Application.ProcessMessages; 
Sleep(1000);
 
until z>5;//koniec duzej
a:=0; powinno byc chyba po pierwszym repeat - krwq 2011-08-02 23:54

Pozostało 580 znaków

2011-07-31 14:50
0

Dzięki Opi, teraz działa. A te zwolnienia to tylko po to, bym mógł zaobserwować działanie tego programu, potem i tak zostaną usunięte.

Czy mój błąd to to, że używam formułki x:=x+1; zamiast Inc(x) ?

Nie. Po prostu Inc jest krótsze w zapisie; ew.mógłbyś przeprowadzić testy, czy szybsze, ale mam wątpliwości. - Patryk27 2011-07-31 15:06
Zdaje się że Inc(); jest szybsze. - TomRiddle 2011-07-31 15:26

Pozostało 580 znaków

2011-07-31 16:37
2

Nie zrobiłeś błędu ponieważ Delphi (przynajmniej wersja 7 optymalizacja włączona)
Z a:= a + 1 i tak zrobi Inc rejestr (a więc na jedno wychodzi):

user image

Natomiast z a:= a + X czy Inc(a, X) i tak zrobi add rejestr, wartość czyli także to samo (co w tym przypadku jest oczywiste ponieważ assemblerowy inc nie ma drugiego parametru).
user image

user image

Natomiast zastanawiam się czemu nie użyłeś pętli for? Przecież wiesz ile razy pętla ma się wykonać , miałbyś spokój z tym Inc(a); i Inc(z); kod bardziej zoptymalizowany i czytelniejszy.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek, 2011-07-31 16:42

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0