[Winapi] Przerwanie pętli

0

Witam.
Mam problem z pętlą a więc chodzi o to, że po odebraniu komunikatu program zaczyna przesuwać myszkę :

case wPar of
      1: begin
rep := false;
mouseup;
end;
procedure MouseUp;
var
P : Tpoint;
begin
repeat
begin
if rep then i :=2; //rep to zmienna globalna
GetCursorPOs(p);
SetCursorPOs(p.X, p.Y - 20);
sleep(500);
end
until i = 2;
end;

i teraz jeżeli w trakcie trwania pętli program odbierze komunikat to pętla jest przerywana:

case wPar of
31:rep := true;

ale kod niestety nie działa ? wie ktoś może gdzie jest błąd?

Komunikaty dochodzą prawidłowo, srawdzone.

0

Po odebraniu jakoego komunikatu następuje reakcja twojego programu - ten problem nie wygląda mi na problem z pętlą aczkolwiek mam tu za mało informacji by powiedzieć coś pewnego.

Aczkolwiek moja sugestia jest tak by sprawdzić czy nie masz przypadkiem pętli z komunikatami myszki - ale to jest tylko moja sugestia

0

A więc:
Chodzi o program Bluetooth remote control.
Można w nim pisać swoje skrypty.
Naisałem taki, że po naciśnięciu poszczególnych przycisków skrypt wysyła komunikat do mojego programu.
Po naciśnięciu wysyła, oraz po odciśnięciu, tak aby nie trzeba było cały czas naciskać, tylko można było przytrzymać, a kursor zatrzyma się dopiero po puszczeniu.

wPar : 1 odpowiada za naciśnięcie, natomiast 31 za odciśnięcie.

Jak na razie wszystko powinno działać, ale nie działa.
dodam, że gdy dałem Messagebox(); zamiast funkcji to działało prawidłowo:
jak naciskałem przycisk (i trzymałem naciśnięty) na telefonie, pokazywał się komunikat, mogłem go spokojnie zamknąć, natomiast gdy puszczałem, pokazywał się drugi komunikat (ten do wPar 31);
Wywnioskowałem z tego, że problem musi być gdzieś w pętli.

0

pętla blokuje Ci przetwarzanie kolejnych komunikatów. albo iteruj w oddzielnym wątku, albo przetwarzaj "ręcznie" komunikaty. swoją drogą to co to za dziwny sposób wyjścia z pętli???

procedure MouseUp;
var
  P : Tpoint;
  i : integer;
begin
repeat
  GetCursorPos(p);
  SetCursorPos(p.X, p.Y - 20);
  for i := 1 to 50 do
  begin
    sleep(10);
    // tu wywołanie procedurki obsługującej komunikaty, np.
    if (PeekMessage(msg, NULL, 0, 0, PM_REMOVE)) then
    begin
      TranslateMessage(msg);
      DispatchMessage(msg);
    end;
  end;
until rep;
end;

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