TTimer w nowym wątku

dział ogólny

TTimer w nowym wątku

Nowy postprzez Corvis » wtorek, 19 maja 2009, 13:06

Witam,

Czy robił ktoś kiedyś akcję TTimera w nowym wątku ?? Jeżeli tak prosiłbym o jakąś podpowiedź :)

pozdrawiam
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: TTimer w nowym wątku

Nowy postprzez banita » wtorek, 19 maja 2009, 17:02

nigdy nic podobnego nie bylo mi potrzebne ale przeprowadzilem sobie maly test.

na formie glownej umiescilem dwa labele. utwozylem nowa klase dziedziczaca po TThread(klasa watku).
w klasie wartku umiescilem obiekt TTimer oraz metode ktora przypisalem do zdarzenia OnTimer.
w metodzie execute watku odpalam timer i w nieskonczonej petli naliczam zmienna int ktora wyswietlam w Label1 glownej formy. w metodzie OnTimer w odstepach 2sekundy inkrementuje druga zmienna int i wyswietlam w Label2 glownej formy.
oczywiscie aktualizacja labeli jest realizowana przez synchronize zarowno w exectue jak i w Ontimer. calosc ladnie chodzi.
zgodnie z tym co pisze w oficjalnym developers guide to ttimer jako komponent niewizualny jest thread-safe.

Label1 na glownej formie zmieniany przez watek.
Label2 na glownej formie zmieniany przez timer dzialajacy w watku.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: TTimer w nowym wątku

Nowy postprzez Corvis » środa, 20 maja 2009, 14:00

Dzięki wielkie :)

ale troche to przerobiłem i ostatecznie zrobiłem podobnie jak w serwisie cyfrowego barona.
tylko, że operacje które robiłem w timerze przerzuciłem do fukncji :

Kod: Zaznacz cały
int __fastcall Wyliczenia1(Pointer Parameter) { }


a w TTimerze zrobiłem :

Kod: Zaznacz cały
void __fastcall TForm3::Timer1Timer(TObject *Sender)
{
   Timer1->Enabled=false;
   W_ID = BeginThread(NULL, 0, Wyliczenia1, this, 0, W_PD);
//   ExitThread(GetExitCodeThread(Wyliczenia1, NULL));  // usunięcie wątku z pamięci, od tego momentu wątku nie można już wstrzymać.
   Timer1->Enabled=true;
}


No i wsio działa jak trzeba :)

pozdrawiam
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: TTimer w nowym wątku

Nowy postprzez g00se » piątek, 5 kwietnia 2013, 13:06

Odkopię ten temat ponieważ potrzebuję właśnie uruchomić timer w osobnym wątku. Problem wygląda tak, że w programie jest główny timer odpowiedzialny za odświeżanie danych. W razie gdyby nastąpiła jakaś awaria, to główny timer staje i jest uruchamiany awaryjny timer, który w zdarzeniu OnTimer wykonuje swoje zadania. Dobrze byłoby gdyby ten awaryjny timer został odpalony w osobnym wątku i mógł wznowić pracę głównego timera, samemu się zatrzymując ;) Trochę namieszałem ale głównie chodzi o to aby jeden timer w razie potrzeby zatrzymał się i odpalał drugi timer w nowym wątku. Oraz aby ten drugi timer mógł wznowić pracę głównego timera. W C# jest to dosyć łatwe do osiągnięcia a tutaj mam problem.
Avatar użytkownika
g00se
Bladawiec
Bladawiec
 
Posty: 12
Dołączył(a): poniedziałek, 7 stycznia 2013, 09:41
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: - Windows XP SP3
Kompilator: - Visual Studio 2008
- Rad Studio XE2
Gadu Gadu: 0
    Windows 7Chrome

Re: TTimer w nowym wątku

Nowy postprzez Cyfrowy Baron » piątek, 5 kwietnia 2013, 13:21

g00se napisał(a):W razie gdyby nastąpiła jakaś awaria, to główny timer staje i jest uruchamiany awaryjny timer,


To by oznaczało awarię (że się tak wyrażę jak Ty) całej aplikacji, a wtedy drugi Timer też nic by nie dał. Timer to nie urządzenie fizyczne, lecz kod programu i jako taki awarii uledz nie może.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: TTimer w nowym wątku

Nowy postprzez g00se » piątek, 5 kwietnia 2013, 13:25

Pod pojęciem awarii miałem na myśli zerwanie połączenia z serwerem. Chodzi o to aby program był stabilny podczas braku takiego połączenia i sprawdzał czy połączenie przypadkiem nie zostało wznowione. Moje rozwiązanie działa ale w czasie wykonywania zdarzenia OnTimer drugiego timera aplikacja przestaje odpowiadać - co jest zależne od próby połączenia się z serwerem mimo braku takiego połączenia.
Avatar użytkownika
g00se
Bladawiec
Bladawiec
 
Posty: 12
Dołączył(a): poniedziałek, 7 stycznia 2013, 09:41
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: - Windows XP SP3
Kompilator: - Visual Studio 2008
- Rad Studio XE2
Gadu Gadu: 0
    Windows 7Chrome

Re: TTimer w nowym wątku

Nowy postprzez Darek_C++ » piątek, 5 kwietnia 2013, 15:04

Co masz na myśli pod pojęciem "zerwanie połączenia z serwerem" ?
Jaką usługę ?
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: TTimer w nowym wątku

Nowy postprzez g00se » piątek, 5 kwietnia 2013, 15:21

Chociażby wyjęty przewód z komputera. A;bo drobne zmiany w adresacji sieci.
Avatar użytkownika
g00se
Bladawiec
Bladawiec
 
Posty: 12
Dołączył(a): poniedziałek, 7 stycznia 2013, 09:41
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: - Windows XP SP3
Kompilator: - Visual Studio 2008
- Rad Studio XE2
Gadu Gadu: 0
    Windows 7Chrome

Re: TTimer w nowym wątku

Nowy postprzez Darek_C++ » piątek, 5 kwietnia 2013, 15:30

Nie chodzi o to... Nie każdy serwer wymaga stałego połączenie do realizacji usługi, wiec równie dobrze możesz nawiązać takowe przed konkretnym żądaniem jak HTTP GET itd... Za mało informacji przekazujesz na ten temat.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: TTimer w nowym wątku

Nowy postprzez polymorphism » sobota, 6 kwietnia 2013, 09:39

Może niech zacznie od tego, czego używa do łączenia się z serwerem. Winsocketów, klas z VCL-a, czy może coś innego?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: TTimer w nowym wątku

Nowy postprzez g00se » poniedziałek, 8 kwietnia 2013, 08:44

Do połączenia używam komponentów ADO. Ale czy to jest takie istotne? Po prostu chcę wykonać metodę w osobnym wątku, tak dla przetestowania. Czasami jest to pomocne (nie tylko w tym konkretnym problemie), i dobrze jakąś czynność wykonać w innym wątku. :)
Avatar użytkownika
g00se
Bladawiec
Bladawiec
 
Posty: 12
Dołączył(a): poniedziałek, 7 stycznia 2013, 09:41
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: - Windows XP SP3
Kompilator: - Visual Studio 2008
- Rad Studio XE2
Gadu Gadu: 0
    Windows 7Chrome

Re: TTimer w nowym wątku

Nowy postprzez polymorphism » poniedziałek, 8 kwietnia 2013, 09:57

Ale czy to jest takie istotne?

Jest, bo od użytej biblioteki nierzadko zależy rozwiązanie problemu.

Po prostu chcę wykonać metodę w osobnym wątku, tak dla przetestowania.

To po co ta cała gadka z timerem? Jak chcesz coś wywołać w wątku, to po prostu wywołaj to w nim, i tyle. Choć oczywiście jeśli koniecznie musisz mieć timer w wątku, to jest możliwość "postawienia" go, tyle tylko że to raczej nie przejdzie z klasą TTimer. Tutaj będziesz musiał użyć funkcji WinAPI, stworzyć pętlę komunikatów, taką jak dla okienek, stworzyć timer funkcją SetTimer i w pętli zrobić obsługę komunikatu WM_TIMER (chyba że dasz funkcję zwrotną przy tworzeniu timera).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: TTimer w nowym wątku

Nowy postprzez g00se » poniedziałek, 8 kwietnia 2013, 10:04

polymorphism napisał(a):To po co ta cała gadka z timerem? Jak chcesz coś wywołać w wątku, to po prostu wywołaj to w nim, i tyle. Choć oczywiście jeśli koniecznie musisz mieć timer w wątku, to jest możliwość "postawienia" go, tyle tylko że to raczej nie przejdzie z klasą TTimer. Tutaj będziesz musiał użyć funkcji WinAPI, stworzyć pętlę komunikatów, taką jak dla okienek, stworzyć timer funkcją SetTimer i w pętli zrobić obsługę komunikatu WM_TIMER (chyba że dasz funkcję zwrotną przy tworzeniu timera).


Gadka ponieważ ten mój drugi timer zamraża działanie programu. Gdyby wywołać ten drugi timer w osobnym wątku problemu uniknę. A wszystko to przez to, że ADOConnection próbuje nawiązać połączenie gdy nie ma połączenia z serwerem - wyciągnięty kabel, wyłączone połączenie sieciowe etc.
Avatar użytkownika
g00se
Bladawiec
Bladawiec
 
Posty: 12
Dołączył(a): poniedziałek, 7 stycznia 2013, 09:41
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: - Windows XP SP3
Kompilator: - Visual Studio 2008
- Rad Studio XE2
Gadu Gadu: 0
    Windows 7Chrome

Re: TTimer w nowym wątku

Nowy postprzez polymorphism » poniedziałek, 8 kwietnia 2013, 10:10

To zrób tak, jak pisałem. Pytanie tylko, czy komponenty ADO są przystosowane do pracy wielowątkowej.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: TTimer w nowym wątku

Nowy postprzez Darek_C++ » poniedziałek, 8 kwietnia 2013, 19:38

Ale po co wywoływać w ogóle timer ? Jeśli chcesz podtrzymać nawiązane połączenie z bazą danych możesz to zrobić wywołując w osobnym wątku wykonywanie cykliczne w pętli jakiegoś zapytania do bazy z którą masz połączenie np: SELECT NOW() co jakiś czas i to podtrzyma połączenie.
Jedynie musisz odpowiednio przekazać uchwyt do połączenia.

Poza tym przy jeśli wykonujesz jakieś operacje - zapytania do bazy w osobnym wątku to jeśli nie będzie połączenia ADOConnection zrzuci odpowiedni wyjątek który możesz przechwycić i przejść w kodzie do połączenia -> wykonania zapytania n razy. Najprościej zrealizować to instrukcją goto:, ale równie dobrze możesz wykonać to w pętli while lub dowhile.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

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