CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Nachodzenie na siebie zdarzeń

Nachodzenie na siebie zdarzeń

dział ogólny

Nachodzenie na siebie zdarzeń

Nowy postprzez Corvis » środa, 13 lutego 2013, 00:43

WItam,

Mam taką funkcję:

KOD cpp:     UKRYJ  
void __fastcall TFrmMain::GetHotKey(TMessage &Msg) {


        if(wykresy->GetTrybOnlineAktywny()) {
                if(Msg.WParam == id1 && wykresy->PobierzWykresDlaOnline(1) != -1) {             // Dane 1

                        DanaOnline = CzytajPlik(pFile1);
                        DataOnline = Date().CurrentDateTime();
                        wykresy->DodajDaneOnline(DataOnline, DanaOnline, 1); // Dodawanie danych i przeliczanie danych

                        asgridOnline->Cells[2][1] = DataOnline.DateTimeString();
                        asgridOnline->Cells[3][1] = DanaOnline;
                }
        }

        HotKey(Msg);
}
 


Funkcja służy do pobierania danych z pliku na podstawie HOT_KEY-a. Wszystko działa super dopóki dane nie zaczynają przychodzić co 100 [ms]. Zaczyna się to wszystko kolejkować. Dzieje się tak dlatego, że przeliczenie danych może trwać dłużej niż czas przyjścia kolejnej danej.

Próbowałem to zabezpieczyć tak:

KOD cpp:     UKRYJ  
void __fastcall TFrmMain::GetHotKey(TMessage &Msg) {

        if(wykresy->GetTrybOnlineAktywny()) {
                if(Msg.WParam == id1 && wykresy->PobierzWykresDlaOnline(1) != -1) {

                        if(FlagaOnline) { goto KONIEC; }
                        FlagaOnline = true;

                        DanaOnline = CzytajPlik(pFile1);
                        DataOnline = Date().CurrentDateTime();
                        wykresy->DodajDaneOnline(DataOnline, DanaOnline, 1);

                        asgridOnline->Cells[2][1] = DataOnline.DateTimeString();
                        asgridOnline->Cells[3][1] = DanaOnline;

                        FlagaOnline = false;

                }
        }

        KONIEC:

        HotKey(Msg);
}
 


Ale to nie działa jak trzeba ( trochę dziwne, bo w przypadku timera i zabezpieczenie żeby kolejne takty zegara nie nachodziły na siebie - działa dobrze ).

Chciałbym zabezpieczyć to tak ( nawet kosztem utraty niektórych danych ) żebym nie mógł dodać kolejnej danej dopóki nie skończę obliczeń w funkcji DodajDaneOnline

Ps. Proszę się nie czepiać etykiety ;) Używam bo pisząc czasem coś na procesor ( tam to jest podstawowa instrukcja ) coś tam zostaje w nawykach :)

Z góry dzięki za pomoc.

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
    Windows 7Chrome

Re: Nachodzenie na siebie zdarzeń

Nowy postprzez Cyfrowy Baron » środa, 13 lutego 2013, 05:55

Ja tu nie widzę żadnego HOT KEY'a, a jedynie funkcję odbierającą wszystkie komunikaty. Komunikaty są kolejkowane i nie zmienisz tego. Za mało wiadomo o tym programie, by cokolwiek więcej poradzić. Timer ma to do siebie, że niczego nie kolejkuje, aktywność aplikacji wpływa na jego szybkość działania, gdy aplikacja jest zajęta, to Timer jest wstrzymywany. Skoro działa dobrze z Timerem, to posłuż się nim, bo nasłuchiwanie wszystkich komunikatów jest raczej kiepskim pomysłem.

Po co ci tam to goto skoro możesz tak:

KOD cpp:     UKRYJ  
if( FlagaOnline ) { HotKey(Msg); return; }
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: Nachodzenie na siebie zdarzeń

Nowy postprzez Corvis » środa, 13 lutego 2013, 08:45

Ja tu nie widzę żadnego HOT KEY'a


KOD cpp:     UKRYJ  
id1 = GlobalAddAtom(L"hkey1");
RegisterHotKey(Handle, id1, MOD_CONTROL, VK_F11);    
 


Tak to wygląda. Sposób obsługi hotkey-ów znalazłem tutaj na forum.

Program to ten sam co mielę go od 2 lat ;) Dane lecą z metatrader-a i jak się nowe pojawią trader wyrzuca hotkey-a, ja go przechwytuję i odczytuję danę z pliku która przyszła.

Ps. Baronie jest jakiś sposób "łapania" gorących klawiszy przy użyciu ttimera albo wątku ??
"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
    Windows 7Chrome

Re: Nachodzenie na siebie zdarzeń

Nowy postprzez polymorphism » środa, 13 lutego 2013, 10:59

(...) jest jakiś sposób "łapania" gorących klawiszy przy użyciu ttimera albo wątku ??

Stwórz wątek, zarejestruj w nim hotkeya (zamiast uchwytu okna daj NULLa), zdefiniuj (w nim) pętlę komunikatów, taką samą jak w WinMain dla okienek.
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: Nachodzenie na siebie zdarzeń

Nowy postprzez Cyfrowy Baron » środa, 13 lutego 2013, 18:02

Wątek raczej nie rozwiąże problemów z kolejkowaniem wiadomości, bo jak...? Ja bym raczej pozostał przy tym co jest i pomijał komunikaty, może to zadziała:

KOD cpp:     UKRYJ  
bool bGetMes = true;

void __fastcall TFrmMain::GetHotKey(TMessage &Msg)
{
 if( !bGetMes ) { return; }                  

        if(wykresy->GetTrybOnlineAktywny())
        {
                if(Msg.WParam == id1 && wykresy->PobierzWykresDlaOnline(1) != -1) {             // Dane 1

                    bGetMes = false;
                    Application->ProcessMessages(); // może bez tego

                        DanaOnline = CzytajPlik(pFile1);
                        DataOnline = Date().CurrentDateTime();
                        wykresy->DodajDaneOnline(DataOnline, DanaOnline, 1); // Dodawanie danych i przeliczanie danych

                        asgridOnline->Cells[2][1] = DataOnline.DateTimeString();
                        asgridOnline->Cells[3][1] = DanaOnline;

                 bGetMes = true;
                }
        }

        HotKey(Msg);
}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Corvis
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: Nachodzenie na siebie zdarzeń

Nowy postprzez Corvis » czwartek, 14 lutego 2013, 09:06

Dzięki,

Dziś sprawdzę jak to działa i dam znać
"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
    Windows 7Chrome

Re: Nachodzenie na siebie zdarzeń

Nowy postprzez Corvis » niedziela, 17 lutego 2013, 11:12

Baronie - działa jedynie dobrze jak jest użyte:

Application->ProcessMessages();

Ale to mi wystarczy jak na razie ;)
"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
    Windows 7Chrome

Re: Nachodzenie na siebie zdarzeń

Nowy postprzez Cyfrowy Baron » niedziela, 17 lutego 2013, 11:31

Corvis napisał(a):działa jedynie dobrze jak jest użyte:


Tak mi się właśnie wydawało, że trzeba odświeżyć kolejkę komunikatów.
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


  • 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 3 gości

cron