sleep - juz nie mam pojecia jak to zrobic ;(

0

mam sobie procedurkę zabezpieczającą jednoczesne użycie komponentu listbox przez dwa wywołania tej samej procedury (jest ona wywoływana przez server / client.socket) -> problem tkwi konkretnie w petli sprawdzajacej, czy komponent nie jest juz uzywany (jest to zapisane w globalnej tablicy boolean - tam sa tez inne zabezpieczone tak komponenty)... Najlepiej wyjasnie to na przykladzie:

Na formie siedza sobie 2 buttony i listbox... Do buttonow sa przypisane zdarzenia:

procedure TMainForm.Button1Click(Sender: TObject);
begin
while true do
  begin
  listbox1.items.add('1');
  Application.ProcessMessages;
  sleep(1000);
  end;
end;

procedure TMainForm.Button2Click(Sender: TObject);
begin
while true do
  begin
  listbox1.items.add('2');
  Application.ProcessMessages;
  sleep(1000);
  end;
end;

gdy klikam pierwszy button to co sekunde dodaje sie item 1, a gdy klikne button 2 to juz sie dodaje tylko 2, a jedynka zdechla :-/

slyszalem jednak, ze sleep zawiesza program, wiec napisalem wlasnego sleepa:

procedure wait(const timeout:integer);
var
  start:integer;
begin
start := czas;
while (czas < start+timeout) do Application.ProcessMessages;
end;

co niestety NIC nie dało ;(.

z gory thx za jakakolwiek pomoc...

EDIT: jeszcze zapomnialem o jednym: zmienna czas jest globalna i zwieksza sie co 1 sekunde o 1 (wstawilem komponent Timer na forme).

0

ja użyłbym wątku/wątków...

0

w sumie tez sobie o tym przed chwila pomyslalem ;)
Prosze jedynie o podpowiedz, czy ten kod mi nie wykrzaczy programu czy cos:

XRead jest przypisane jednoczesnie do client i server .onread

procedure TMainForm.XRead(Sender: TObject; Socket: TCustomWinSocket);
var
  watek : TZapytanie;
begin
watek := TZapytanie.Create(True);
watek.socket := Socket;
watek.Resume;
end;

procedure TZapytanie.Execute;
begin
FreeOnTerminate := True;
WRead(socket);
end;

procedure WRead(Socket: TCustomWinSocket);
begin
{kod}
end;

a procedura, z ktora mam problem wyglada tak:

procedure blokuj(obiekt:integer; blok:boolean);
//obiekt:
// 1- lista polaczen
// 2- THTTPGet
begin
if blok then
  begin
  while (zablokowane[obiekt]) do //czeka na odblokowanie
    begin
    application.ProcessMessages;
    sleep(1000);
    application.ProcessMessages;
    end;
  zablokowane[obiekt] := true;
  end
else zablokowane[obiekt] := false;
end;

a wywołuje się tak:

blokuj(1, true);
{operacje na chronionym obiekcie}
blokuj(1, false);

a definicja zmiennej zablokowane to:

 aob = array [0..65535] of boolean;
0

nie lepiej sleep zamieńić na coś takiego:

procedure wait(time: integer);
var
    i : Integer;
begin
    for i := 0 to time div 2 do
    begin
        sleep(1);
        Application.processmessages();
    end;
end;

dlatego time bierzemy div 2 bo processmessages zajmuje mniej więcej 1 milisekundę. tyle o sleepie();

poza tym mugłbyś zamienić sockety na indy one mie mają teo typu problemów o połącenie to oddzielny wątek.

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