Aplikacja Server i Client

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Re: Aplikacja Server i Client

Nowy postprzez Cyfrowy Baron » poniedziałek, 1 marca 2010, 12:57

Dokładnie o tym samym napisałem, więc nie rozumie co chcesz przez to powiedzieć. Nie wiem czy masz zastrzeżenia czy chcesz coś od siebie dodać, ale wielokrotnie wykorzystywałem zdarzenie OnIdle zamiast obiektu typu TTimer i świetnie się sprawdza. Czasami tylko zegar staje gdy system wykonuje operację i procesor jest zaangażowany w całości, wtedy zdarzenie się zatrzymuje i wznawia, gdy procesor znów jest wolny.

Posłużyłem się tutaj przykładem w postaci procesu bezczynności systemu, gdyż pokazuje on w jakim stopniu system jest bezczynny, co oczywiście wcale nie oznacza, że zdarzenie OnIdle podłącza się do tego procesu. Być może coś źle zrozumiałeś, ale jeżeli Proces bezczynności systemu pokazuje np. 100% to nie oznacza, że system jest zajęty w 100% lecz odwrotnie, że nie wykonuje żadnej operacji. W praktyce nie zdarzyło mi się zaobserwować jednak by ten proces kiedykolwiek pokazywał 100%. Proces bezczynności 0% oznacza, że system jest zajęty w całości i nie ma wolnych zasobów w systemie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Aplikacja Server i Client

Nowy postprzez polymorphism » poniedziałek, 1 marca 2010, 13:03

Ale OnIdle nie ma nic wspólnego z bezczynnością systemu. To zdarzenie zostanie wywołane w momencie, gdy w kolejce komunikatów procesu nie będzie żadnego zdarzenia.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows XPFirefox

Re: Aplikacja Server i Client

Nowy postprzez Cyfrowy Baron » poniedziałek, 1 marca 2010, 13:11

Occurs when an application becomes idle

No ma właśnie nie jestem pewien czy dotyczy to bezczynności systemu czy bezczynności aplikacji.
Czy jeżeli system będzie wykonywał jakąś operację i zajmie ona całe zasoby systemu, aplikacja będzie bezczynna to czy zdarzenie się wykona?! Z moich obserwacji wynika, że nie, ale to może oznaczać, że po prostu w systemie nie ma dość wolnych zasobów by wykonać zadania tego zdarzenia. To jednak oznacza, że zdarzenie OnIdle mimo iż dotyczy bezpośrednio bezczynności aplikacji, to pośrednio jest związane i zależne od bezczynności systemu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Aplikacja Server i Client

Nowy postprzez polymorphism » poniedziałek, 1 marca 2010, 13:27

Czy jeżeli system będzie wykonywał jakąś operację i zajmie ona całe zasoby systemu, aplikacja będzie bezczynna to czy zdarzenie się wykona?!

Tak, jeśli tylko system przydzieli czas aplikacji, a w kolejce nie pojawią się zdarzenia/komunikaty wymagające obsługi.

To jednak oznacza, że zdarzenie OnIdle mimo iż dotyczy bezpośrednio bezczynności aplikacji, to pośrednio jest związane i zależne od bezczynności systemu.

Tylko widzisz, aplikacja może być bezczynna, pomimo że system w tym czasie będzie zajęty.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows XPFirefox

Re: Aplikacja Server i Client

Nowy postprzez Cyfrowy Baron » poniedziałek, 1 marca 2010, 13:30

Tak czy inaczej zdarzenie OnIdle, często jest lepszym rozwiązaniem niż TTimer.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Aplikacja Server i Client

Nowy postprzez polymorphism » poniedziałek, 1 marca 2010, 13:35

Czy często? Wątpię. Timer jest jednak pewniejszy.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows XPFirefox

Re: Aplikacja Server i Client

Nowy postprzez Cyfrowy Baron » poniedziałek, 1 marca 2010, 13:56

Na pewno pewniejszy, gdyż wykonuje zdarzenie OnTimer niezależnie od tego czy aplikacja jest bezczynna czy nie. Jednak w sytuacji gdy chcemy, żeby program coś sprawdzał, gdy nic w tym programie nie robimy to lepiej i by się zatrzymywał gdy program wykonuje jakąś operację, to zdarzenie OnIdle jest lepszym rozwiązaniem.

Zastanawia mnie jednak coś innego. Załóżmy że mamy taki kod w zdarzeniu OnTimer:

Kod: Zaznacz cały
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  if(coś_tam == coś_tam)
  {
    zrób_coś;
  }
}


i to samo w zdarzeniu onIdle:

Kod: Zaznacz cały
void __fastcall TForm1::ApplicationIdle(TObject *Sender, bool &Done)
{
  if(coś_tam == coś_tam)
  {
    zadanie;
  }
}


to wiadomo, że zegar tyka :? , więc angażuje w sam proces tykania :? system. Czy zdarzenie OnIdle w takim samym stopniu angażuje system? Co jest efektywniejsze? Zakładając, że warunek nie został spełniony zdarzenie OnIdle nie wykona zadania, Timer również go nie wykona, ale w odróżnieniu od zdarzenie OnIdle będzie sobie tykał.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Aplikacja Server i Client

Nowy postprzez polymorphism » poniedziałek, 1 marca 2010, 14:20

O efektywności w tym kontekście trudno i nie warto mówić. Narzut spowodowany tykaniem zegara jest tak mały, że aż nieistotny.

(...) Timer również go nie wykona, ale w odróżnieniu od zdarzenie OnIdle będzie sobie tykał.

Wbrew pozorom OnIdle może być częściej wywoływane niż zdarzenie timera, tyle tylko że nie tak regularnie. Według mnie to zdarzenie służy raczej do zadań o niskim priorytecie. Zadań, których wykonanie w jakimś konkretnym przedziale czasowym nie jest aż tak istotne.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows XPFirefox

Re: Aplikacja Server i Client

Nowy postprzez Cyfrowy Baron » poniedziałek, 1 marca 2010, 15:31

Spotkałem się z programem, który wykorzystywał zegar i zdarzenie OnIdle, ale było to kwestią wyboru, dlatego zastanawiam się kiedy lepiej jest wykorzystać OnIdle zamiast zegara.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Aplikacja Server i Client

Nowy postprzez Witold » poniedziałek, 1 marca 2010, 20:52

Cyfrowy Baron napisał(a):Dokładnie o tym samym napisałem, więc nie rozumie co chcesz przez to powiedzieć.


Chciałem zwrócić uwagę że to co napisałeś nie zgadza się z tym co jest w pomocy. A że nie napisałeś dokładnie o tym samym wyjaśnił polymorphism ("To zdarzenie zostanie wywołane w momencie, gdy w kolejce komunikatów procesu nie będzie żadnego zdarzenia." a nie gdy (Twoje): "czyli wykorzystujące proces bezczynności systemu. To zdarzenie to taki zegar, ale działa tylko gdy procesor nie jest zajęty w 100%."


Spotkałem się z programem, który wykorzystywał zegar i zdarzenie OnIdle, ale było to kwestią wyboru, dlatego zastanawiam się kiedy lepiej jest wykorzystać OnIdle zamiast zegara.


Co takiego ten program robił w OnTimer/OnIdle , że można było wybrać które zdarzenie ma to obsłużyć ?
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    AmigaAWeb

Re: Aplikacja Server i Client

Nowy postprzez Cyfrowy Baron » poniedziałek, 1 marca 2010, 22:00

Co takiego ten program robił w OnTimer/OnIdle , że można było wybrać które zdarzenie ma to obsłużyć ?

Ten program to gra Kyoday Mahjong

kyoday.png
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Aplikacja Server i Client

Nowy postprzez Witold » wtorek, 2 marca 2010, 00:22

Cyfrowy Baron napisał(a):Ten program to gra Kyoday Mahjong


Dzięki za odpowiedz. Tam jest "czas bezczynności procesora", może chodzi o OnIdle.


--dodane w związku z odpowiedzią niżej --
Napisałem może ponieważ nie wiem co autor programu miał na myśli pod opcją „czas bezczynności procesora (po wybraniu języka angielskiego jest tam „CPU idle time”). A TApplication::OnIdle nie jest związane bezpośrednio z czasem bezczynności procesora tylko (zacytuje jeszcze raz polymorphism’a) „zdarzenie zostanie wywołane w momencie, gdy w kolejce komunikatów procesu nie będzie żadnego zdarzenia”.
Ostatnio edytowano wtorek, 2 marca 2010, 10:54 przez Witold, łącznie edytowano 1 raz
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    AmigaAWeb

Re: Aplikacja Server i Client

Nowy postprzez Cyfrowy Baron » wtorek, 2 marca 2010, 10:26

Dzięki za odpowiedz. Tam jest "czas bezczynności procesora", może chodzi o OnIdle.



Od początku w tym wątku o niczym innym się nie pisze...
Co do Kyoday Mahyong to jest to program stworzony przez japończyka, więc polskie tłumaczenie czas bezczynności procesora może być po prostu nieprecyzyjne i chodzi o czas bezczynności systemu lub po prostu o bezczynność aplikacji. Plik pomocy niewiele wyjaśnia:


-- Typ taktowania: Wybierz twój własny rodzaj taktowania z tego menu. Jest to sprawa bardziej techniczna, ale chodzi o to, że jeśli odpalasz Kyodai na laptopie i martwisz się o użycie czasu procesora, użyj typ taktowania „Threaded”, który jest wolniejszy, ale mniej wymagający.




Temat zbacza z torów więc o tej grze już wystarczy, chyba, że masz jakieś konkrety.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Aplikacja Server i Client

Nowy postprzez Bert1223 » środa, 3 marca 2010, 22:48

Po przeczytaniu napisałem kawałek kodu, niestety skutek nie jest taki jak oczekiwałem.
Nie wiem jak dokładnie działa funkcja OnIdle, efekt jest taki. Gdy użytkownik zaloguje się, a tym samym loginUser = 1; Aplikacja zawiesza się.
Wydaje mi się, ze ma to związek z wcześniej poruszoną wielowątkowością? Jak zapiąć te mechanizmy tak aby zaczęły współpracować?

Kod: Zaznacz cały
__fastcall TForm3::TForm3(TComponent* Owner)
   : TForm(Owner)
{
   Application->OnIdle = ApplicationIdle;

   loginUser = 0;
   connectionToServer = 0;
}

Kod: Zaznacz cały
void __fastcall TForm3::ApplicationIdle(TObject *Sender, bool &Done)
{
   String line = "";

   if(loginUser)
      line = TCPClient->Socket->ReadLn();

   if(line == "Update")
   {
      ShowMessage(line);
   }
   // pobierzDystrybutor();
   // pobierzProducent();
   // pobierzTyp();
}
Avatar użytkownika
Bert1223
Bladawiec
Bladawiec
 
Posty: 45
Dołączył(a): czwartek, 15 października 2009, 02:41
Podziękował : 6
Otrzymał podziękowań: 0
    Windows 7Chrome

Re: Aplikacja Server i Client

Nowy postprzez Cyfrowy Baron » czwartek, 4 marca 2010, 09:41

Więc zamiast zdarzenie OnIdle użyj komponentu TTimer i jego zdarzenie OnTimer. Ustawiasz Enabled Timer'a na true, Interval na ile chcesz, przy czym 1000 = 1 sekunda.



Co do zawieszania się aplikacji, to po prostu program musi wykonać wszelkie instrukcje wewnątrz zdarzenia zanim będzie mógł wykonać coś innego, a ponieważ zegar tyka non-stop, czy to będzie zdarzenie OnIdle czy OnTimer to aplikacja nieustannie będzie "się zawieszać", gdyż tak została zaprogramowana, stale ma coś sprawdzać. Co do funkcji ShowMessage wewnątrz zdarzenie OnIdle czy OnTimer to już jakieś nieporozumienie. Zastanów się jak działa zegar. Każde tyknięcie zegara to wywołanie instrukcji zawartych wewnątrz funkcji, a każde wyświetlenie komunikatu to zablokowanie aplikacji i oczekiwanie na reakcje użytkownika, który musi ten komunikat zamknąć.



Czytając Twoje posty odnoszę wrażenie, że nie wiesz co chcesz osiągnąć i nie rozumiesz kodu, który stosujesz. Tak czy inaczej jedynym rozwiązaniem dla tego co chcesz osiągnąć są wątki nie zegar.

Temat wątków był wielokrotnie poruszany na tym forum, więc poszukaj i poczytaj o tym, gdyż aplikacji wielowątkowej nie da się załatwić jedna funkcją, chyba, że wystarczy ci prosta funkcja, wtedy możesz zastosować to co podałem w serwise Cyfrowy Baron w dziale: porady -> API -> Tworzenie aplikacji wielowątkowych.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron