Czekanie na nadejście wiadomości

0

Hej!
Pisze serwer TCP w Lazarusie za pomoca komponentow iNet. Dla kazdego nowo podlaczonego klienta tworzony jest osobny watek i w petli staram sie pobrac wiadomosc i ja wyswietlic

aSocket.GetMessage(wiadomosc); 
writeLn(wiadomosc);

Problem w tym, ze przez dlugi czas moze nie nadchodzic zadna wiadomosc a chodzaca petla i watek obciazaja caly czas procesor. Czy jest mozliwosc stworzenia czegos na ksztalt eventow czy zdarzen? Tak aby procedura wyswietlajaca tekst odpalala sie dopiero w momencie nadejscia nowej wiadomosci?

Znalazlem cos takiego:

aSocket.OnRead 

ale nie mam pojecia jak to ugryzc. Przykladow tez za wiele w google nie znalazlem. Probowalem przypisywac tam jakies procedury ale wolalo mi bledem:

<procedure variable type of procedure (TLSocket)> expected <procedure variable type of procedure (TLHandle) of object.

Moglby mi ktos pomoc albo chociaz naprowadzic na rozwiazanie czy da sie zrobic cos takiego? Czy jednak pozostaje 'czytanie' aSocket w petli i czekanie az wiadomosc bedzie >0?

pozdrawiam!

1

Dodanie jakiegoś sleep(500) czy nawet sleep(10) powinno załatwić sprawę obciążania CPU.

0

@Patryk27
na jakims forum znalazlem "Well.. for starters, don't sleep(10), but sleep(1). That is enough to save a lot of cpu.".
Czy to znaczy, ze wystarczy dac nawet sleep(1) zeby nie zabic procesora? Jaka jest tak naprawde roznica miedzy sleep(10) a sleep(1) ? Wiem, ze to wszystko dzieje sie w milisekundach wiec roznica tak naprawde jest zadna ale mimo wszystko...

coraz bardziej zaczynam myslec, ze ten temat powinien trafic do Newbie;)

0

Czy to znaczy, ze wystarczy dac nawet sleep(1) zeby nie zabic procesora?
Tak, wystarczy. Wtedy sprawdzanie będzie tysiąc razy na sekundę, a nie setki tysięcy/miliony, jak bez tego sleepa.

Wiem, ze to wszystko dzieje sie w milisekundach wiec roznica tak naprawde jest zadna
Milisekunda to bardzo dużo czasu wbrew pozorom.

Jaka jest tak naprawde roznica miedzy sleep(10) a sleep(1) ?
Zależy co to za wiadomości. Jeśli piszesz coś wymagającego obsługi komunikatu od zaraz, to i nawet jakieś sleep na mikrosekundy by się przydało (usleep, nie wiem czy coś takiego jest wbudowane w bibliotekę standardową Delphi), a z drugiej strony przy pisaniu komunikatora w stylu mesendżera fejsbukowego to nawet sleep(1000); nie stanowi utrudnienia.

0

oczekiwanie można zrealizować np.

 
while WaitForSingleObject(... , ...) <> WAIT_TIMEOUT do
      Application.ProcessMessages;

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