[delphi] IdTCPClient zwiecha przy readln :/

0

Witam, od 3 dni męczę się z takim problemem:
Robię sobie czata(dla wielu osób) oczywiście wszystko cacy oprócz tego, że nie mam jak wysłać do klientów wiadomości, że ktoś dopisał nową linijkę. Przy użyciu Timera, który co pół sekundy wykonuje polecenie:

procedure TForm1.czytajTimer(Sender: TObject);
var
odpowiedz: string;
begin
if not klient.connected then exit;
if zalogowany = false then exit;

    odbierz(klient.ReadLn());

end;

Niby ma sprawdzać i odbierać to co przysłał serwer, robiąc to wzorowałem się na demo z indy 9. Otóż zaraz po połączeniu z serwerem klient dostaje zwiechy i jak dobrze pójdzie to serwer też. W przykładzie indy jest to samo, o co chodzi?

0

Jak by nie patrzeć to metoda Readln wydaje się być jest blokująca, i jeżeli nie używasz dodatkowego wątku do odczytywania, cała aplikacja będzie doświadczać zablokowania aż do otrzymania kolejnej wiadomości która defakto zostanie obsłużona i ponownie opisywany już scenariusz czyli zablokowanie i czekanie na kolejną wiadomość (btw. rozwiązanie dodatkowego wątku nadaje się do aplikacji konsolowych, aczkolwiek serwer musi być wielo wątkowy)

0

Jest jak Ci rzekl dj a ja dorzuce swe trzy grosze i powtorze nieco po nim.

ReadLn bedzie Ci zwieszalo aplikacje bo oczekuje na jakies dane z serwera. Masz dwa rozwiazania tego problemu.

  1. Ten gorszy czyli Timer ;) Otoz ReadLn mozesz wywolac z parametrem okreslajacym czas oczekiwania na wiadomosc od serwera np 10 ms. Przyjrzyj sie definicji ReadLn to sobie znajdziesz (nie pamietam teraz).

  2. Tworzysz oddzielny watek w ktorym nasluchujesz na dane z serwera. (Ten lepszy;) )

0

Dobra dzięki, troche jak się pisze coś w TEdit to lekko ścina programik od tych zapytań klienta chyba, ale najważniejsze, że działa :-)

Pomyłka, po wysłaniu pierwszej wiadomości klient czekał na odpowiedź, przez to program troche mulił, teraz śmiga jak złotko :D jeszcze raz dzięki


Jeszcze jedno pytanko, jak klikam enter na edicie by wysłać tekst to słychać taki "plum" jak przy wyskoczeniu komunikatu, pewnie chodzi o to, że nie można w edicie przejść do nastepnej linii. Jak zrobić, żeby edit nie "wydawał" żadnych dźwięków?

Pytanie nieaktualne :) jakby się komuś przydało to wystarczyło dopisać linijkę "Key := #0;"

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